在后续一段时间里, 我会写一系列文章来讲述如何实现一个RPC框架。 这是系列第三篇文章, 主要讲述了服务注册和服务发现这一块。
在系列的第一篇文章中提到,我们的RPC框架需要有一个服务注册中心。 通过这个中心,服务可以把自己的信息注册进来,也可以获取到别的服务的信息(例如ip、端口、版本信息等)。这一块有个统一的名称,叫服务发现。
对于服务发现,现在有很多可供选择的工具,例如zookeeper, etcd或者是consul等。 有一篇文章专门对这三个工具做了对比: 服务发现:Zookeeper vs etcd vs Consul。 在我的框架中, 我选择使用Consul来实现服务发现。对于Consul不了解的朋友可以去看我之前写的关于Consul的博客。
Consul客户端也有一些Java的实现,我用到了consul-api。
服务注册
首先,我们定义一个接口:
这个接口很简单,向服务注册中心注册自己的地址。
对应的consul的实现:
这里值得注意的是,要确保id绝对唯一。 我能想到的比较直观的解决方案是serviceName + 本机ip + 本机port的组合。
服务发现
首先,我们定义一个接口:
这个接口很简单,传入serviceName,获取一个可以访问的该service的地址。
对应的consul的实现: