在客户端与服务端的通讯过程中,我们需要一个单独的组件,来进行不同客户端与服务端之间进行匹配,监控,以及管理。
需要实现几个主要的功能
- 对服务端进行注册:每当一个服务暴露的时候,将相关信息记录到注册中心
- 服务端下线通知:当服务提供者下线的时候,将注册中心的记录删除
- 对服务调用者进行数据监控
- 为不同的客户端提供一个指定的服务器
使用纯代理方式来实现,不太合适,需要引进一个第三方来做这个通知的工作
通知的中间件需要有以下的功能:
- 能够存储数据,具备高可用性
- 能够与各方进行连接,当有服务上线、下线时,可以通知到各个端口
选择Zookeeper来实现这个功能
- 可以构成主动推送,能够实现上下线时的通知效果
- 自身提供了高可用的机制,对于数据节点的存储,可以支持顺序、非顺序、临时、持久化的特性
- zookeeper设计之初就是为了这种工作,解决方案很多,开源社区活跃
1 注册节点结构设计
需要自己设计一个zookeeper节点的结构,服务端只需要提供一个ip+端口号;消费端为调用服务名和地址。
2 注册层的设计
- 定义一个注册所用的接口,主要有四个方法 :注册、下线、订阅、取消订阅。具体实现交给子类来实现
其中 , URL为配置类,封装了RPC主要的配置。后期重要的配置都得基于它来存储。
- 定义一个AbstractRegister的抽象类,对注册数据进行统一处理(如果要支持多种注册中心的话,其基础的操作记录也可以放在这里来实现)
其中,ProVider_URL_SET 为服务端的一个set缓存集合 ,存放url数据。
-
Zookeeper注册层的实现-->客户端抽象模板
主要使用的组件是:curator-framework 2.12.0 版本
除此之外,还需要有抽象方法接口:获得指定目录下的节点数据、创建持久化类型的节点数据信息、创建有序且临时类型的节点数据信息、 设置某节点的数值、断开链接、删除数据、监听某路径下节点数据变化等。
- 自定义一套zookeeper的访问组件
之后,基于CuratorFramework类,重写抽象方法中的各种抽象方法,下面随意展示几个 :
- 定义一个zookeeper的注册类,主要负责服务注册、订阅、下线等操作:
其中,路径使用string字符串来表示,通过根路径+服务名+角色+ip+端口号组成,保证每个都独一无二。
之后利用这些字段,在zookeeper中真正实现注册订阅上下线等功能。
还有其他方法的具体实现,就不一一放上来了。
有一处小设计:每次收到回调后,都再次注册一下监听器,这样可以保证一直都能收到消息,而不是只能在第一次更新的时候才能收到。(zk节点的消息通知只具有一次性的功效)
- 引入事件的设计思路,用来解耦
- 服务注册和监听的接入 现在已经完成注册层的基本设计开发了,接下来需要将其介入到我们之前搭建好的基础骨架中。
批量暴漏url:
暴漏服务端:
其中 ,ServiceWrapper 的结构如下:
- 客户端订阅 + 建立链接