龙哥dubbo源码阅读实践-源码入口(第一章)

资源准备

1.dubbo开发手册下载:
地址:http://dubbo.io/docs/dubbo-dev-book.pdf
2.dubbo源码下载
地址:https://github.com/alibaba/dubbo/tags
3.导入项目到eclipse或者idea
注意:
- dubbo项目是标准的maven工程,直接以maven项目导入即可
- setting配置可以不配置,默认会从repo.maven.org拉去依赖
4.构建源代码
mvn package -Dmaven.test.skip=true

源码阅读

启动方式(dubbo项目一般有两种启动方式)

1.Standlone模式,通过Main加载Spring启动
2.使用容器tomcat、jetty、resin等加载Spring启动
两种启动方式,最终都和spring启动过程紧密相关,其实dubbo就是利用spring的扩展性,将自己的启动流程无缝的融合到spring的启动过程中。

启动流程

先看一张完整的启动时序图,如下图:
这里写图片描述
下载此图

这种大图,看起来会相当苦恼,但是细心的你,如果能坚持看完,那么对于dubbo启动的流程,应该已经心中有数。如果有点懵,没关系,图中我省略了一些模块,并且还有些是父子类方法的相互调用,下面我会用相当的篇幅来解释这张图。

从Main函数到SpringContainer

在dubbo源码的dubbo-container-api模块的src/main/resources/assembly/bin目录下,存放了一些脚本,这些脚本是预留给使用dubbo项目的开发者们启动项目使用的,其中有6个shell脚本:

dump.sh 通过jstack,jinfo,jmap等命令dump内存信息
restart.sh 重启项目
server.sh 集成其他几个命令
start.bat windows上启动项目
start.sh Linux上启动项目
stop.sh 优雅关闭

我们打开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 &

这是通过java命令来调用com.alibaba.dubbo.container.Main类中的入口函数main,看看代码

public static void main(String[] args) {
        try {
            if (args == null || args.length == 0) {
                String config = ConfigUtils.getProperty(CONTAINER_KEY, loader.getDefaultExtensionName());
                args = Constants.COMMA_SPLIT_PATTERN.split(config);
            }

            final List<Container> containers = new ArrayList<Container>();
            for (int i = 0; i < args.length; i++) {
                containers.add(loader.getExtension(args[i]));
            }
            logger.info("Use container type(" + Arrays.toString(args) + ") to run dubbo serivce.");

            if ("true".equals(System.getProperty(SHUTDOWN_HOOK_KEY))) {
                Runtime.getRuntime().addShutdownHook(new Thread() {
                    public void run() {
                        for (Container container : containers) {
                            try {
                                container.stop();
                                logger.info("Dubbo " + container.getClass().getSimpleName() + " stopped!");
                            } catch (Throwable t) {
                                logger.error(t.getMessage(), t);
                            }
                            try {
                                LOCK.lock();
                                STOP.signal();
                            } finally {
                                LOCK.unlock();
                            }
                        }
                    }
                });
            }

            for (Container container : containers) {
                container.start();
                logger.info("Dubbo " + container.getClass().getSimpleName() + " started!");
            }
            System.out.println(new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss]").format(new Date()) + " Dubbo service server started!");
        } catch (RuntimeException e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
            System.exit(1);
        }
        try {
            LOCK.lock();
            STOP.await();
        } catch (InterruptedException e) {
            logger.warn("Dubbo service server stopped, interrupted by other thread!", e);
        } finally {
            LOCK.unlock();
        }
    }

重点在String config = ConfigUtils.getProperty(CONTAINER_KEY, loader.getDefaultExtensionName()); 这一行代码上
这个loader是一个成员变量,定义如下:
private static final ExtensionLoader loader = ExtensionLoader.getExtensionLoader(Container.class);传入的泛型类是Container,该类的定义为:

@SPI("spring")
public 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值