Dubbo的启动主要是发布服务的过程,起到核心作用的就是ServiceConfig(ServiceConfig就是我们在Dubbo的配置文件中配置的dubbo:service这些配置项对应的实体类)。服务的启动初始位置也基本是在这里
服务提供者代码
ServiceConfig<DemoServiceImpl> service = new ServiceConfig<>();
service.setApplication(new ApplicationConfig("dubbo-demo-api-provider"));
RegistryConfig registry = new RegistryConfig();
registry.setAddress("redis://127.0.0.1:6379");
registry.setProtocol("dubbo");
registry.setTimeout(5000);
registry.setGroup("1.0");
service.setRegistry(registry);
// multicast组播协议 windows默认不支持 ,linux,mac可以
// service.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
service.setInterface(DemoService.class); //配置接口
service.setRef(new DemoServiceImpl()); //配置实现类
service.export();
System.in.read();
ServiceConfig
配置层Config 服务端的配置类
- ApplicationConfig 应用配置
- RegistryConfig注册中心配置,可以配多个注册中心
最终调用 ServiceConfig .export() 方法完成服务的发布
export() 发布的主要流程为
ServiceConfig ------|ProxyFactory|---->Invoker-------|Protocol|----->Exporter
一、通过ProxyFactory 构建执行实体 Invoker
二、通过Protocol构建 发布实体 Exporter 并发布服务
通过ServicConfig中的内容分解,我们看出来里面主要做的内容如下:
- 检验所需参数的合法性
- 将多层的参数(可能重复配置)最终整理出最终的结果(map),然后根据参数拼接成暴露服务需用到的url。
- 处理generic,Stub,injvm等其他需要支持的内容,补充dubbo的功能多样性,但是都不涉及核心流程。
- 根据对应的协议将服务进行暴露(将提供的服务推送到注册中心供服务调用者发现),默认使用Dubbo协议。
其实服务暴露的过程只要是完成了两件事情:
- 将服务注册到注册中心,供调用方发现
- 监听指定的端口,等待服务调用方进行调用
参考