注册中心的意义是什么?
注册中心实现了分布式环境中各个服务之间的注册与发现
注册中心的作用:
1.动态加入:一个服务的provider可以通过注册中心将自己动态的暴露给其他的消费者
2.动态发现:一个服务的consumer可以动态感知新的配置以及新的provider,新的路由等
当然注册中心还有一些别的用处,暂时不是很理解作用,所以在这里暂时不提及
注册中心的工作流程
当服务的provider启动的时候,会向注册中心写入自己的元数据信息,同时会订阅配置元数据信息。
当服务的consumer启动的时候,会向注册中心写入自己的元数据信息,并且会订阅服务的provider,route以及配置元数据信息。
当服务治理中心启动时,会订阅所有的consumer,provider和配置元数据信息。
当服务的provider离开或者有新的provider加入的时候,注册中心会将服务的provider目录更新,并且通知给consumer和服务治理中心。
当consumer发起调用的时候,会将信息,例如调用时间等上报给监控中心
dubbo推荐的注册中心是zk,zk是经过实战考验的,所以只分析zk。。
zk是一个树状的结构,它的每个节点可以分为持久节点,临时节点以及持久顺序节点和临时顺序节点
其中持久节点和临时节点的区分是持久节点会永久的注册在注册中心,即使注册中心重启,持久节点也会存在,而临时节点会在链接丢失或者是session超时等情况下被自动移除
顺序节点比原有的节点多了节点先后顺序的能力
dubbo在使用zk的时候只会创建持久节点和临时节点,对节点的顺序没有要求
订阅和发布
zk的发布:
服务的provider和consumer都需要将自己注册到注册中心。其中provider注册是为了让消费者感知服务的存在,从而可以发起远程调用,也让服务治理中心感知到有新的服务provider上线,
consumer发布是为了让服务治理中心发现。。
zk的订阅:
zk采用事件通知+客户端拉取的方式订阅,在客户端第一次链接到注册中心时,会获取到对应目录下的所有的数据。并且在订阅的节点上注册一个watcher,客户端会与注册中心保持
一个tcp的长链接,后续每个节点有数据变化的时候,注册中心会根据watcher的回调主动通知客户端,这就是事件通知
当客户端接到通知时,会主动拉取对应节点下的全量数据,这就是客户端拉取
zk的每一个节点都有一个版本号,当节点数据发生变化的时候,节点对应的版本号就会发生变化,并且这个时候会触发watcher通知对应的客户端。
zk的缓存
基本上每一个场景中,缓存的作用就是用空间换取时间。试想如果每次远程调用的时候都要从注册中心全量拉取一遍服务列表,那么注册中心能否成主这么大的流量。
所以dubbo的注册中心会有缓存机制,当consumer或者治理中心获取到注册信息之后会进行本地缓存,这也就是为什么注册中心挂了双方还可以进行调用的原因