`
LoveLZY
  • 浏览: 57335 次
  • 性别: Icon_minigender_1
博客专栏
Group-logo
从零编写RPC框架
浏览量:0
社区版块
存档分类
最新评论

dubbo源码研究之container模块

阅读更多
   dubbo-container模块是dubbo启动顺序中的第一个模块,dubbo-container模块是容器模块,通过dubbo-container模块读取dobbo-config模块的相关配置。
  
/**
 * Container. (SPI, Singleton, ThreadSafe)
 * 
 * @author william.liangf
 */
@SPI("spring")
public interface Container {
    
    /**
     * start.
     */
    void start();
    
    /**
     * stop.
     */
    void stop();

}

  container接口非常简洁,只有两个方法,start,stop。注意两个方法都是void并且不抛出受检查异常。
细心的童鞋也可能发现上面的注释,spi,Singleton,ThreadSafe。 说明该接口是基于spi机制,单例,并且线程安全的。
  Container 接口的主要实现

  其中JavaConfigContainer是基于spring的javaconfig,其中javaconfig是spring4之后主推的配置模式,使用spring boot的童鞋如果和dubbo整合使用零配置的方式可以考虑这个类。
  SpringContainer主要指定了默认的配置文件路径,通过ClassPathXmlApplicationContext来启动spring容器。
**
 * SpringContainer. (SPI, Singleton, ThreadSafe)
 * 
 * @author william.liangf
 */
public class SpringContainer implements Container {

    private static final Logger logger = LoggerFactory.getLogger(SpringContainer.class);

    public static final String SPRING_CONFIG = "dubbo.spring.config";
    
    public static final String DEFAULT_SPRING_CONFIG = "classpath*:META-INF/spring/*.xml";

    static ClassPathXmlApplicationContext context;
    
    public static ClassPathXmlApplicationContext getContext() {
		return context;
	}

	public void start() {
        String configPath = ConfigUtils.getProperty(SPRING_CONFIG);
        if (configPath == null || configPath.length() == 0) {
            configPath = DEFAULT_SPRING_CONFIG;
        }
        context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+"));
        context.start();
    }

    public void stop() {
        try {
            if (context != null) {
                context.stop();
                context.close();
                context = null;
            }
        } catch (Throwable e) {
            logger.error(e.getMessage(), e);
        }
    }

}


  其他几个实现类似,重点讲下com.alibaba.dubbo.container.Main。这个是dubbo自带的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);
	                        }
	                        synchronized (Main.class) {
	                            running = false;
	                            Main.class.notify();
	                        }
	                    }
	                }
	            });
            }
            
            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);
        }
        synchronized (Main.class) {
            while (running) {
                try {
                    Main.class.wait();
                } catch (Throwable e) {
                }
            }
        }
    }


  该方法通过钩子 Runtime.getRuntime().addShutdownHook来实现优雅停机,同时还支持通过启动参数来加载扩展点,containers.add(loader.getExtension(args[i]))。但是没有类似spring boot 的CommandLineRunner 接口,在容器启动完毕之后执行一些初始化动作。建议使用dubbo的童鞋如没有特殊需求,可以使用该类作为程序启动类。

 


  • 大小: 72.1 KB
0
0
分享到:
评论

相关推荐

    dubbo-master源码

    《深入剖析Dubbo源码:探索Java微服务框架的核心机制》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java远程服务调用框架,它为开发者提供了丰富的服务治理功能,包括服务注册与发现、负载均衡、容错、监控等。...

    dubbo源码分析系列

    容器API模块是Dubbo内部核心模块之一,它定义了启动容器列表的Main类,包含了应用程序入口main方法。它还包括了Container接口,该接口包含了启动和停止方法的定义,以及通用的分页功能的相关类。Dubbo内置了多种容器...

    dubbo源码分析系列1

    《深入剖析Dubbo源码系列》 Dubbo作为国内最广泛使用的分布式服务框架,其设计思想和实现机制对于理解和构建自己的分布式服务框架至关重要。本文将基于当当网维护的dubbox版本,逐步解析Dubbo的核心模块,以帮助...

    dubbo-3.1.4源码包

    【标题】"dubbo-3.1.4源码包"是...通过研究这些源码,开发者可以了解到dubbo是如何实现服务治理的,以及如何在实际项目中灵活应用。同时,对于想要深入学习分布式系统和微服务架构的开发者来说,这是一个宝贵的资源。

    Dubbo源代码(2.8.4)

    要编译Dubbo源码,首先需要安装Java环境和Maven,然后在项目根目录下执行`mvn clean install`命令,完成所有模块的编译。编译成功后,可以通过示例项目或自定义项目来运行和测试Dubbo服务。 5. **扩展性**: ...

    Dubbo服务框架 v2.7.9-源码.zip

    这次我们关注的是其v2.7.9版本的源码,通过深入研究,可以更好地理解Dubbo的工作原理,提升我们的开发能力。 首先,我们要了解Dubbo的核心组件和设计原则。Dubbo的核心组件包括服务提供者(Provider)、服务消费者...

    dubbo-master.zip

    通过学习和研究这个压缩包,你可以深入了解Dubbo的工作原理、服务治理机制以及如何通过源码定制和扩展Dubbo功能。这对于开发者来说,无论是调试问题、优化性能还是开发新的特性,都是极其宝贵的资源。同时,通过`...

    dubbo定义及使用

    - **服务消费者(Consumer)**:调用服务的模块,通过Dubbo获取服务提供者的服务并进行调用。 - **注册中心(Registry)**:服务提供者和服务消费者之间的桥梁,用于服务的注册与发现。常见的注册中心有Zookeeper...

    dubbox-dubbox-2.8.4a源码

    例如,core模块提供了基础的RPC功能,provider模块负责服务提供者的实现,consumer模块关注服务消费者的逻辑,registry模块处理服务注册与发现,而container模块则用于容器化部署。 3. **服务注册与发现** dubbox-...

    alibaba-dubbo-dubbo-2.5.7-0-ge2d63ad.tar.gz

    7. **dubbo-container**:容器模块,Dubbo可以运行在Spring、Jetty等容器中,提供一站式的应用服务化解决方案。 8. **dubbo-filter**:过滤器机制,允许用户自定义业务逻辑和策略,如日志记录、性能统计、权限控制...

    Dubbo入门---搭建一个最简单的Demo框架

    【标签】:“源码”和“工具”表明这篇教程可能涉及到了Dubbo的核心源码分析以及使用到的一些辅助工具,如IDEA或Maven等。 【内容】: Dubbo是一个高性能、轻量级的Java开源RPC框架,由阿里巴巴提供,旨在提高...

    Dubbo服务框架 v2.7.22.zip

    这个压缩包文件"Dubbo服务框架 v2.7.22.zip"包含了完整的源码,对于学习、研究或基于Dubbo进行系统开发的人员来说,具有很高的参考价值。 首先,让我们深入了解一下Dubbo的核心特性: 1. **服务注册与发现**:...

    Dubbo架构介绍与源码分析

    Dubbo的源码设计遵循了模块化、插件化的原则,便于扩展和维护。其中,`Invoker`是Dubbo的核心接口,代表一个可调用的服务实例;`Protocol`接口定义了服务暴露和引用的协议;`Registry`接口处理服务的注册和订阅操作...

    分布式服务框架duboo 例子

    7. **容器(Container)**:运行服务提供者和消费者的环境,如Spring、Spring Boot等,它们可以简化Dubbo的集成和管理。 接下来,我们来看看Duboo在实际使用中的关键特性: 1. **服务注册与发现**:服务提供者启动时...

    Maven常用插件整理.docx

    Maven Assembly 插件允许开发者将项目的输出,包括依赖、模块、网站文档和其他文档集成到一个单一的文档中,以便于定制打包。这个插件支持多种输出格式,如zip、tar、tar.gz、gar.bz2、jar、dir和war等。预定义的四...

Global site tag (gtag.js) - Google Analytics