Dubbo 2.7.5 服务包暴露源码解析
发表时间 2020-03-27  |  浏览量:  |  分类: dubbo

Dubbo 2.7.5 服务暴露源码解析

以官方的demo为例:

public class Application {
    public static void main(String[] args) throws Exception {
        ServiceConfig<DemoServiceImpl> service = new ServiceConfig<>();
        service.setInterface(DemoService.class);
        service.setRef(new DemoServiceImpl());

        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
        bootstrap
                .application(new ApplicationConfig("dubbo-demo-api-provider"))
                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
                .service(service)
                .start()
                .await();
    }
}

在项目启动时,创建了一个ServiceConfig对象,对设置了该对象的interfaceref两个字段的值,两个字段的含义如下:

  1. interface:服务接口类
  2. ref:服务接口类的实现类,真正提供服务的对象

简单地说就是interface告诉dubbo要对外提供哪些RPC接口,当收到客户端的RPC调用时,最终会调用ref对象相关的方法,具体整个过程的实现,见下面的分析。

上述代码中,DubboBootstrap的applcation、registry、service三个方法调用都是往ConfigManager里放入应用的配置信息,最终调用start方法 启动,无论是采用api的方式,还是xml、与spring集成,最终都是通过DubboBootstrap.start来启动项目的:

    public DubboBootstrap start() {
        if (started.compareAndSet(false, true)) {
            initialize();
            ...
            // 1. export Dubbo Services
            exportServices();
            ...
            referServices();
            ...
        }
        return this;
    }

start方法内,dubbo通过一个原子变量来保证不会重复启动,其中我们本节关注的是其exportServices方法 ,该方法是真正执行服务暴露的入口。

关闭