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

Dubbo 应用容器的更多相关文章

  1. Dubbo微容器(Cooma)详解

    ExtensionLoader ExtensionLoader是Dubbo中的SPI的实现方法,它是Dubbo框架的微容器,也为框架提供各种组件的扩展点 三种注解 SPI Adaptive Activ ...

  2. Java框架Spring Boot & 服务治理框架Dubbo & 应用容器引擎Docker 实现微服务发布

    微服务系统架构实践 开发语言Java 8 框架使用Spring boot 服务治理框架Dubbo 容器部署Docker 持续集成Gitlab CI 持续部署Piplin 注册中心Zookeeper 服 ...

  3. dubbo 试用全过程

    概述: dubbo服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源. 服务容器只 ...

  4. (转)史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!

    背景:因为自己的简历写了dubbo,面试时候经常被问到.实际自己对dubbo的认识只停留在使用阶段,所以有必要好好补充下基础的理论知识. https://zhuanlan.zhihu.com/p/45 ...

  5. dubbo学习思路梳理

    dubbo要解决的问题 rpc调用需要定制.额外的工作量 分布式服务中,服务动辄几十上百,相互之间的调用错综复杂,相互依赖严重 对集群性的服务,需要负载策略 对集群性的服务,能动态扩展节点 dubbo ...

  6. 有关dubbo面试的那些事儿

    dubbo是什么 dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集 ...

  7. dubbo 微服务框架

    dubbo 注解配置: @Service //Service注解暴露服务 @Configuration // javaconfig形式配置公共模块 @DubboComponentScan // 指定d ...

  8. dubbo 面试题

      dubbo是什么 dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含:集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等 ...

  9. Dubbo面试20问!这些题你都遇到过吗?

    作者:Dean Wang https://deanwang1943.github.io/bugs/2018/10/05/面试/饿了么/dubbo 面试题/ 1.dubbo是什么 dubbo是一个分布式 ...

随机推荐

  1. 【转】CSS中怎么让DIV居中

    来源:http://www.cnblogs.com/DebugLZQ/archive/2011/08/09/2132381.html     CSS 如何使DIV层水平居中 今天用CSS碰到个很棘手的 ...

  2. 搭建EF6.0+MVC4搭建框架遇到的问题及解决方案

    问题一:“未能加载文件或程序集“EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089” ...

  3. 利用Swift之协议语法实现页面间的传值功能

    随着Swift 新开发语言的发布,又随着Xcode6.0.1的正式发布,利用swift编写iOS代码迫在眉睫,笔者在使用Objective-C开发近三年以来,对这种优雅的语法深感赞叹,下面我将对比式的 ...

  4. Android视录视频示例

    这几天需要搞一个Android视频通话功能,从最简单的视频录制开始,网上例子大多不完整.下面的示例参考过别人的代码,还是拿出来给需要的朋友分享下. Activity类:VideoActivity pa ...

  5. CentOS6.6 安装 Tengine 笔记

    Tengine官网上有个非常简单的教程,中间并未涉及到一些常用的设置,所以仅供参考.一下午为本人的安装步骤及过程. 1.安装必要的编译环境好 由于Tengine安装需要使用源代码自行编译,所以在安装前 ...

  6. .NET中的Timer类型用法详解

    这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下   在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行 ...

  7. 数据库连接工具类 数据库连接工具类——仅仅获得连接对象 ConnDB.java

    package com.util; import java.sql.Connection; import java.sql.DriverManager; /** * 数据库连接工具类——仅仅获得连接对 ...

  8. 深入理解ThreadLocal

    ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...

  9. [转]oracle for update和for update nowait的区别

    1概念小结:(针对以下引用区域内容) 1.1 普通select语句不加锁. 1.2 for update和for update nowait都试图将符合条件的数据加上行级锁.用于排斥其他针对这个表的写 ...

  10. IOS开发小项目—找色块游戏

    1.项目代码: @interface NextViewController () { int r ;//色块层数的全局变量 int m;//后面用于tag值的变化 UIView *view;//色块 ...