https://www.jianshu.com/p/2c9a5d9fbf85
1.对于provider,dubbo会监听Spring容器的启动刷新事件(ContextRefreshedEvent),调用export()方法暴露服务。在使用zk作为注册中心的前提下,export()方法按顺序做下面3件事。
URL装配:读取provider端配置,根据约定好的协议将服务装配成URL的形式
协议暴露:所谓协议暴露,简单来说就是先创建NettyServer,然后给每个URL创建一个本地方法的代理,并将二者映射起来,NettyServer接收请求会调用对应的本地方法
向zk注册节点:将装配好的URL通过zkClient注册到zk节点中,完成服务的暴露
对于consumer,dubbo根据consumer侧的配置选择订阅provider的某几个服务。
2.订阅操作包含两个动作:
一是consumer本身在zk的consumer节点下注册;
二是创建监听器来感知zk节点的变化。
provider上下线时会引起对应zk节点的变化,监听器感知到节点变化后,会调用NotifyListener的notify方法,更新内存中的provider列表;
与此同时,consumer还会将最新的provider列表写入~/.dubbo目录下的文件中,这样做可以保证在zk挂掉的情况下,consumer依然能通过本地的缓存文件找到provider的地址。
拿到provider列表后,接下来consumer就可以根据约定好的协议进行远程调用了,当然在这一步还可以做负载均衡。
3.provider服务下线后,注册中心和consumer如何感知到:
zookeeper提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除。
服务消费方会监听zookeeper相应的路径,一旦路径上的数据有任何的变化,zookeeper就会将新的服务列表发送给消费方,消费方在获取到数据后,刷新本地缓存的列表。
————————————————
版权声明:本文为CSDN博主「dreamcasher」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28411869/article/details/95198290