一、服务端provider发布
根据dubbo启动日志,provider的发布动作为以下几个步骤:
(1)暴露本地服务
Export dubbo service com.ywl.dubbo.TestApi to local registry, dubbo version: 2.0.0, current host: 127.0.0.1。
(2)暴露远程服务
Export dubbo service com.ywl.dubbo.TestApi to url dubbo://192.168.24.69:20880/com.ywl.dubbo.TestApi...后面省略。
(3)启动netty
Start NettyClient yuwenlei.local/192.168.24.69 connect to the server /192.168.1.100:20041, dubbo version: 2.0.0, current host: 192.168.24.69。
(4)打开zk
Opening socket connection to server dailyzk.webuy.ai/192.168.49.11:2181。
(5)注册provider服务到zk
Register dubbo service com.ywl.dubbo.TestApi url dubbo://192.168.24.69:20880/com.ywl.dubbo.TestApi? ...中间省略。
to registry registry://dailyzk.webuy.ai:7005/org.apache.dubbo.registry.RegistryService? ...后面省略。
(6)监听zk(订阅与通知)
Subscribe: provider://192.168.24.69:20880/com.ywl.dubbo.TestApi?...后面省略。
Notify urls for subscribe url provider://192.168.24.69:20880/com.ywl.dubbo.TestApi?...后面省略。
· 服务发布的目的
解析dubbo-provider.xml中的接口。将服务提供者向注册中心注册服务,以便服务消费者从注册中心查询并调用服务。
<dubbo:service interface="com.ywl.dubbo.TestApi" ref="testApi" retries="0"
cluster="failfast" timeout="3000"/>
二、服务发布总结 - invoker
· dubbo-provider.xml中的接口是如何被解析的?
通过spring的schema标签,通过service元素绑定对应的解析器,即new DubboBeanDefinitionParser(ServiceBean.class, true)。
通过dubboBeanDefinitionParser来解析dubbo-provider文件,并加载到spring容器中。
通过ServiceBean的onApplicationEvent事件来暴露服务。
· 服务转化invoker
服务发布的第一步,将dubbo的api转换成invoker。
以上流程如下图所示:
三、服务暴露总结 - exporter
· 本地服务暴露
暴露本地服务表示在同一个JVM中,不用通过远程通信来调用。即,在同一个服务中,可以自己调用自己的接口。
本地服务暴露流程如下图:
· 远程服务暴露
暴露远程服务表示暴露给远程客户端IP和端口号,需要通过远程通信来调用。
远程服务暴露流程如下图:
综上所述,可以看到本地服务暴露和远程服务暴露本质上的区别,并且服务暴露的最终目的就是将exporter对象放入到exporterMap中。
四、dubbo服务在zookeeper上的注册和订阅 - 总结
· dubbo服务在zookeeper的注册
主要分为两步,第一步为初始化zookeeper,第二步将服务注册到zookeeper中,注册节点中的/provider为持久化节点,注册节点中的服务ip为临时节点。
dubbo服务注册流程图:
注册后zookeeper的节点关系图:
· 临时节点和持久化节点
临时节点,他与客户端会话绑定,一但服务端服务被关闭或会话失效,那么这个客户端所创建的临时节点都会被删除。
持久化节点,表示服务节点一但被创建,除非触发主动删除,否则一直存储在ZK中。
dubbo服务注册时采用临时节点是因为,临时节点的本质是与服务端或客户端会话所绑定的,而在dubbo应用中一但服务被关闭那么zk上的节点也没有必要存在,该dubbo服务所建立的临时节点也会被删除。
对于dubbo中的providers/configuration/routes/consumers节点会被作为持久化节点来创建。
· dubbo服务的订阅
主要分为三个步骤:
(1)创建持久化配置节点,即/configurations、/routes等节点。
(2)加入订阅监听。
(3)收到订阅后的处理。
订阅流程图如下所示:
服务发布完成后zookeeper上的节点信息: