Dubbo 应用容器

时间:2023-12-11 11:01:56

Dubbo的容器模块,是一个独立的容器,因为服务通常不需要Tomcat/JBoss等Web容器的特性,没必要用Web容器去加载服务。

服务容器只是一个简单的Main方法,并加载一个简单的Spring容器,用于暴露服务。

我们看启动生产者、消费者、简单监控者的 start.sh 命令中,可以看到启动命令如下:

nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1 &

这里启动的就是 com.alibaba.dubbo.container.Main 类的 public static void main(String[] args) { …  }  方法。

 

服务容器的加载内容可以扩展,内置了spring, jetty, log4j等加载,可通过Container扩展点进行扩展,参见:http://dubbo.io/Developer+Guide.htm#DeveloperGuide-ContainerSPI 

 

Spring Container

自动加载META-INF/spring目录下的所有Spring配置。
配置:(配在java命令-D参数或者dubbo.properties中)
dubbo.spring.config=classpath*:META-INF/spring/*.xml ----配置spring配置加载位置Container

Jetty Container

启动一个内嵌Jetty,用于汇报状态。
配置:(配在java命令-D参数或者dubbo.properties中)
dubbo.jetty.port=8080 ----配置jetty启动端口
dubbo.jetty.directory=/foo/bar ----配置可通过jetty直接访问的目录,用于存放静态文件
dubbo.jetty.page=log,status,system ----配置显示的页面,缺省加载所有页面

 

Log4j Container

自动配置log4j的配置,在多进程启动时,自动给日志文件按进程分目录。
配置:(配在java命令-D参数或者dubbo.properties中)
dubbo.log4j.file=/foo/bar.log ----配置日志文件路径
dubbo.log4j.level=WARN ----配置日志级别
dubbo.log4j.subdirectory=20880 ----配置日志子目录,用于多进程启动,避免冲突

 

容器启动

如:(缺省只加载spring) 
java com.alibaba.dubbo.container.Main

或:(通过main函数参数传入要加载的容器)
java com.alibaba.dubbo.container.Main spring jetty log4j

或:(通过JVM启动参数传入要加载的容器)
java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j

或:(通过classpath下的dubbo.properties配置传入要加载的容器)
dubbo.properties
dubbo.container=spring,jetty,log4j

 

在web容器中使用内置的监控页面

    <filter>
        <filter-name>resource</filter-name>
        <filter-class>com.alibaba.dubbo.container.page.ResourceFilter</filter-class>
    </filter>
 
    <servlet>
        <servlet-name>page</servlet-name>
        <servlet-class>com.alibaba.dubbo.container.page.PageServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>page</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
 
    <filter-mapping>
        <filter-name>resource</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

参考:

http://dubbo.io/Service+Container.htm

 

扩展容器功能

扩展容器功能, 参考: http://dubbo.io/Container+SPI.htm

扩展容器类功能需要实现 com.alibaba.dubbo.container.Container 接口。

 

容器的启动

不论生产者、消费者、简单监控 他们的启动 start.sh 命令都是完全一样的。 整个 bin 目录下的文件是完全一样的。

在 start.sh 中,我们看到的  -classpath  ****  com.alibaba.dubbo.container.Main

nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS com.alibaba.dubbo.container.Main > $STDOUT_FILE 2>&1 &

可以证明我们启动的是 com.alibaba.dubbo.container.Main 类的 main 方法。

 

Java 命令行参数说明

我们这里用到的 Java 命令行参数说明:

java -classpath /home/user/myprogram org.mypackage.HelloWorld 

其中:
-classpath /home/user/myprogram 这个参数,指定了程序中要用到的包所在的路径。(在Linux系统中,是这样表达, -classpath /home/user/myprogram)
org.mypackage.HelloWorld 这是主类的名称

http://developer.51cto.com/art/201209/357217.htm

-classpath

虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下:Bootstrap classes,Extension classes,User classes

Bootstrap 是虚拟机自带的 jar 或 zip 文件,虚拟机首先搜索这些包文件,用System.getProperty("sun.boot.class.path")可得到虚拟机搜索的包名。
Extension 是位于 jre/lib/ext 目录下的 jar 文件,虚拟机在搜索完 Bootstrap后就搜索该目录下的 jar 文件。用System. getProperty("java.ext.dirs”)可得到虚拟机使用Extension 搜索路径。
User classes 搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。

告知虚拟机搜索目录名、jar 文档名、zip 文档名,之间用分号;分隔。例如当你自己开发了公共类并包装成一个 common.jar 包,在使用 common.jar 中的类时,就需要用-classpath common.jar 告诉虚拟机从 common.jar 中查找该类,否则虚拟机就会抛出 java.lang.NoClassDefFoundError异常,表明未找到类定义。在运行时可用 System.getProperty(“java.class.path”)得到虚拟机查找类的路径。

使用-classpath 后虚拟机将不再使用 CLASSPATH 中的类搜索路径,如果-classpath 和 CLASSPATH 都没有设置,则虚拟机使用当前路径(.)作为类搜索路径。推荐使用-classpath 来定义虚拟机要搜索的类路径,而不要使用环境变量 CLASSPATH 的搜索路径,以减少多个项目同时使用 CLASSPATH 时存在的潜在冲突。例如应用 1 要使用a1.0.jar 中的类 G,应用 2 要使用 a2.0.jar 中的类 G,a2.0.jar 是 a1.0.jar 的升级包,当a1.0.jar,a2.0.jar 都在 CLASSPATH 中,虚拟机搜索到第一个包中的类 G 时就停止搜索, 如果应用1应用2的虚拟机都从CLASSPATH中搜索,就会有一个应用得不到正确版本的类G。

javac -classpath .;jar01.jar;jar02.jar;……;jarN.jar class_name.java :使用-classpath选项,指定了在编译Java源代码时,用到类库的位置。一般用于该类库不在当前CLASSPATH的环境变量中。

 

参考:

http://developer.51cto.com/art/201209/357217.htm

http://my.oschina.net/xianggao/blog/88492

 

具体服务的启动

至于具体的启动的服务,则跟Spring有关。在完成默认必须加载的 Spring 之后, 根据我们的配置,加载暴露具体的服务。

相关的配置或者代码启动服务请看: http://dubbo.io/Configs-zh.htm