zoukankan      html  css  js  c++  java
  • Dubbo 应用容器

    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

  • 相关阅读:
    windows查看和杀死占用端口的进程
    jenkins html报告不显示样式
    解决git一直输入用户名和密码的问题
    git中文乱码问题
    java环境变量配置
    web service
    sql 训练及总结
    js 及jQery
    [TYVJ] P1015 公路乘车
    GIT 基本用法
  • 原文地址:https://www.cnblogs.com/ghj1976/p/5316126.html
Copyright © 2011-2022 走看看