[全网首发]图解Dubbo3.x 服务启动原理
2022-11-01 21:26:21 0 举报
Dubbo3.x 服务启动原理
作者其他创作
大纲/内容
默认是双注册,也就是两个协议service-discovery-registry://ip:portnacos: //ip:port
1. 初始化NacosRegistry
ExceptiionFilter
DubboProtocol.createServer()创建服务
CallbackRegistrationInvoker
URL,协议路径
启动Qos服务,提供telnet访问支持
针对当前端口增加协议支持
FrameworkModel
internalId=1.0.n+1
doInvoker
dubbo://192.168.8.16/org.gupao.coupon.IUserService
injvm://127.0.0.1
服务启动成功,才会把协议地址注册到对应的注册中心
HeaderExchangeHandler
Finish
再次调用协议扩展点发布服务,还是会经过包装类,如果是dubbo协议,最后就会到DubboProtocol协议扩摘得那。
PortUnificationExchanger实现端口的协议复用功能,两个逻辑1. 当前服务地址是否已经发布过服务,如果已经发布过,则只是保存当前发布的协议2. 如果没有发布过,则使用对应的协议发布服务
ExchangeChannelAdapter
ModuleModel
2. 使用协议扩展点发布服务protocol.export()
返回InjvmExporter
DubboExporter
Apache Dubbo 3.x ScopeModel模型
注册中心
1. 构建Invoker
ListenerExporterWrapper
ProtocolSerializationWrapper.export
Deployer发布器
RegistryFactoryWrapper.getRegistry
Protocol$Adaptive根据协议头地址选择匹配对应扩展点
是
ModuleDeployer
injvm://127.0.0.1/org.gupao.coupon.IUserService
循环
internalId=1.n+1.n
对Invoker增加ListenerExporterWrapper包装,可以对服务启动后增加监听事件
internalId=1.n+1.n+1
返回HeaderExchangeServer
针对ApplicationModel相关配置进行初始化
InjvmProtocol.export
注册应用地址
ClassLoaderFilter
对注册中心实例包装一层监听事件当服务注册或者订阅的时候触发
抽象类里面缓存了url对应的注册中心实例,查找不到才创建
ProfilerServerFilter
org.gupao.coupon.IUserService
internalId=1.n
wrapper.invokeMethod
NacosRegistry.doRegister
保存
发起服务注册register()
ExporterChangeableWrapper
Decodehandler
第一次是触发RegistryProtocol,这里面融了了服务启动和服务注册两个逻辑
......
PortUnificationExchanger.bind
InJvmExporter内部结构,把当前Interface对应的Invoker保存到Map集合中
QosProtocolWrapper.export
Value
Key
构建Invoker
对Invoker添加过滤器
2. 创建新的服务
2. 注册协议地址
CallbackRegistrationInvoker(ContextFilter(ProfilerServerFilter(EchoFilter(ClassLoaderFilter(GenericFilter(ExceptionFilter(MonitorFilter(TimeoutFilter(TraceFilter(ClassLoaderCallbackFilter(Invoker)))))))))))
internalId=1.n+1
返回DestroyableExporter
registry://192.168.8.133:2181
接口级别的服务地址
ApplicationDeployer
初始化NacosNamingService
保存协议地址到FrameworkModel对应的ServiceRepository中
ContextFilter
.......
2.xConsumer
启动Netty服务NettyPortUnificationServer
start()启动服务
FailbackRegistry.register()
增加容错机制,也就是服务注册失败会重试
针对ModuleModel相关配置初始化并实现服务的发布和引用
ClassLoaderCallbackFilter
1. 构建ModuleServiceRepository仓库,存储所有服务端发布的服务、客户端要访问的服务
internalId=1.0
HeaderExchanger.bind
AbstractPortUnificationServer
2. 解析当前服务接口相关的描述信息:类、方法、方法参数等保存到ServiceDescriptor中
ApplicationModel
基于Dubbo协议扩展点发布服务DubboProtocol.export
协议名称,比如 dubbo/tri
........
通过RegistryFactory.getRegistry()获取注册中心实例
3. 加载注册中心集合
上述步骤执行完成后,得到一个ListenerRegistryWrapper(NacosRegistry)实例
添加childHandler
AbstractProxyInvoker
AbstractRegistryFactory.getRegistry
ListenerRegistryWrapper.register()
Application,代表当前Dubbo应用,一个进程中可以有多个Application
遍历协议配置列表,逐个发布对应协议的服务
TraceFilter
register发起服务注册
发布Invoker(本地)
释放服务注册的监听事件
ApplicationConfig/MonitorConfig/MetricsConfig/SslConfig/ProtocolConfig/RegistryConfig/ConfigCenterConfig/MetadataReportConfig
3.xConsumer
发布本地服务(injvm)
Module,表示Dubbo应用中的要发布的服务,或者引用的服务, 也就是@DubboService和@DubboReference
internalId=1.0.0
发布远程服务(protocol)
3.xProvider
ProtocolListenerWrapper.export
Protocol协议扩展点包装器
Dubbo3.x默认实现双注册
HeartbeatHandler
否
internalId=1.0.n
应用级别地址
RegistryProtocol.export
internalId=1.n+1.1
MultiMessageHandler
doExportUrls
发布Invoker(远程)
InJvmExporter
ProtocolFilterWrapper.export
MonitorFilter
internalId=1
doLocalExport发布本地服务
Invoker是一个执行器,后续客户端进行调用的时候,最终会执行Invoker的doInvoker方法
遍历服务配置
这个类继承了ByteToMessageDecoder,所以它其实是一个解码器,也就是当收到客户端的消息后,会先进入到这个类的decode方法
NacosRegistryFactorycreateRegistry创建注册中心实例
AllChannelHandler
端口重复协议?
GenericFilter
注册接口地址
2. 实现服务注册
1. 把基于Dubbo协议发布的Invoker保存到DubboExporter中
1. 先发布服务(根据网络协议启动服务监听)
创建NacosRegistry实例
NamingService.registerInstance()
HeaderExchanger可以用来创建HeaderExchangeClient和HeaderExchangeServer这两个装饰器
TimeoutFilter
<dubbo:application name=\"coupon-service\"/> <dubbo:provider timeout=\"20000\"/><dubbo:config-center address=\"zookeeper://192.168.8.133:2181\"/><dubbo:registry address=\"zookeeper://192.168.8.133:2181\"/><dubbo:registry address=\"nacos://192.168.8.133:8848\"/><dubbo:protocol name=\"dubbo\" port=\"20880\"/><dubbo:service interface=\"org.gupao.coupon.ICouponService\" ref=\"couponService\"/><dubbo:service interface=\"org.gupao.coupon.IUserService\" ref=\"userService\"/><bean id=\"couponService\" class=\"org.gupao.coupon.service.CouponService\"/><bean id=\"userService\" class=\"org.gupao.coupon.service.UserService\"/>
ModuleConfig/ProviderConfig/ConsumerConfig/ServiceConfigBase/ReferenceConfigBase
ExchangeHandler requestHandler
NettyPortUnificationServerHandler
DelegateProviderMetaDataInvoker
EchoFilter
0 条评论
下一页