一般我们常见的RPC框架都包含如下三个部分:
- 注册中心,用于服务端注册远程服务以及客户端发现服务
- 服务端,对外提供后台服务,将自己的服务信息注册到注册中心
- 客户端,从注册中心获取远程服务的注册信息,然后进行远程过程调用
上面提到的注册中心其实属于服务治理,即使没有注册中心,RPC的功能也是完整的。之前我大多接触的是基于zookeeper的注册中心,这里基于consul来实现注册中心的基本功能。
Consul的一些特点:
- Raft相比Paxos直接
此外不多描述,还没研究raft
- 支持数据中心,可以用来解决单点故障之类的问题
- 集成相比zookeeper更加简单(代码量少,逻辑清晰简单)
- 支持健康检查,支持http以及tcp
- 自带UI管理功能,不需要额外第三方支持。(zookeeper需要单独部署zkui之类的第三方工具)
- 支持key/value存储
启动consul之后访问管理页面
RPC集成
提取出服务注册与服务发现两个接口,然后使用Consul实现,这里主要通过consul-client来实现(也可以是consul-api),需要在pom中引入:
<dependency>
<groupId>com.orbitz.consul</groupId>
<artifactId>consul-client</artifactId>
<version>0.14.1</version>
</dependency>
服务注册
- RegistryService
提供服务的注册与删除功能
public interface RegistryService {
void register(RpcURL url);
void unregister(RpcURL url);
}
- AbstractConsulService
consul的基类,用于构建Consl对象,服务于服务端以及客户端。
public class AbstractConsulService {
private static final Logger logger = LoggerFactory.getLogger(AbstractConsulService.class);
protected final static String CONSUL_NAME="consul_node_jim";
protected final static String CONSUL_ID="consul_node_id";