dubbo服务导出
2022-06-28 11:53:42 0 举报
dubbo服务发布
作者其他创作
大纲/内容
构建服务url
远程服务导出
RegistryProtocol.export
1、ServiceConfig.exportLocal先进行本地服务导出,url中ip啥的都换成本地,协议改为injvm
加上filter链
RegistryProtocol.doLocalExport调dubboProtocol或者其他具体协议进行远程服务导出
ServiceConfig.export
ServiceBean.export
遍历不同的协议,往每个注册中心进行服务注册
DubboProtocol.createServer
ServiceConfig.doExportUrlsFor1Protocol
protocol.export
获取注册中心信息比如ZookeeperRegistry,进行服务注册(其实就是往zk上写一个节点)
ServiceBean.onApplicationEvent
ServiceBean实现了ApplicationListener<ContextRefreshedEvent>
DubboProtocol.openServer
DubboProtocol的export⽅法中主要要做的事情就是启动NettyServer,并且设置⼀系列的 RequestHandler,以便在接收到请求时能依次被这些RequestHandler所处理(具体分析如下:)
ServiceConfig.doExportUrls
先大致说下服务导出原理或者说是流程:ServiceBean代表一个服务(某个service的某个方法),当spring容器启动好,发送ContextRefreshedEvent事件会触发ServiceBean的export()方法。主要做以下两件事情:1、拉取多个地方的服务配置信息,获得最新最高级的配置(可能有优先级会覆盖),启动网络服务器(netty,tomcat)来接受客户端请求(此时网络服务器会和请求处理器handler绑定在一起)2、将服务注册到注册中心,同时注册配置监听器,若配置改变需要重新注册服务
这一步会先获取各个地方的配置信息(比如@service注解上的,配置文件中的,配置中心里的),拿到最新优先级最高的配置,把配置信息都设置到SerciceConfig类的属性中(比如协议protocol信息,注册中心register信息),然后在做服务导出
JavassistProxyFactory.getInvoker获得服务代理类Invoker(反射执行真正逻辑,invoker里有接口实现了,接口class等信息),包装为DelegateProviderMetaDataInvoker(加了一个serviceConfig)
获取所有配置中心信息
一层层包装handler
// url:http://192.168.40.17:80/org.apache.dubbo.demo.DemoService?anyhost=true&application=dubbo-demo-annotation-provider&bean.name=ServiceBean:org.apache.dubbo.demo.DemoService&bind.ip=192.168.40.17&bind.port=80&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=285072&release=&side=provider×tamp=1585206500409
DubboProtocol.export
根据入参Invoker构建DubboExporter,存入map,key为接口名版本号等信息,当客户端来调会从map中取出
// 开启NettyServer 这里会得到一个处理客户端请求的handler(会包很多层),和NettyServer绑定在一起 // MultiMessageHandler--->HeartbeatHandler---->AllChannelHandler---->DecodeHandler---->HeaderExchangeHandler---->ExchangeHandler
⽣成监听器,监听动态配置中⼼此服务的参数数据的变化,⼀旦监听到变化,则重写服务URL,并 且在服务导出时先重写⼀次服务URL
DubboProtocol中有一个ExchangeHandler,用来接受客户端请求,从map中拿到DubboExporter,进而拿到Invoker,最终反射执行
JavassistProxyFactory.getInvoker获得服务代理类Invoker(反射执行真正逻辑,invoker里有接口实现了,接口class等信息),包装为Exporter
使用特定的协议来对服务进行导出,这里的协议为RegistryProtocol,导出成功后得到一个Exporter1. 先使用RegistryProtocol进行服务注册2. 注册完了之后,使用DubboProtocol进行导出这里的protocol是RegistryProtocol 在RegistryProtocol里面会先调dubboProtocol进行开启nettySever、绑定处理请求的handler,再注册服务到注册中心
遍历所有注册中心
AbstractInterfaceConfig.loadRegistries
ServiceConfig.doExport
0 条评论
下一页