专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
51好读  ›  专栏  ›  分布式实验室

微服务与RPC

分布式实验室  · 公众号  · 后端  · 2017-02-24 07:45

正文

请到「今天看啥」查看全文


服务定义:

service HelloService{
binary hello(1: binary hello_request);
}

协议定义:

message HelloRequest{
optional string user_name = 1; //访问这个接口的用户
optional string password = 2; //访问这个接口的密码
optional string hello_word = 3; //其他参数;
}

message HelloResponse{
optional string hello_word = 1; //访问这个接口的用户
}

想对于纯的Thrift实现,这种方式虽然看起来繁琐,但其在可扩展性、可维护性和服务治理上,可以带来不少便利。

四、服务注册与发现

Spring Cloud提供了服务注册和发现功能,如果需要自己实现,可以考虑使用Apache ZooKeeper作为注册表,使用Apache Curator 来管理ZooKeeper的链接,它实现如下功能:

  • 侦听注册表项的变化,一旦有更新,可以重新加载注册表。

  • 管理到ZooKeeper的链接,如果出现问题,则进行重试。

Curator的重试策略是可配置的,提供如下策略:

BoundedExponentialBackoffRetry
ExponentialBackoffRetry
RetryForever
RetryNTimes
RetryOneTime
RetryUntilElapsed

一般使用指数延迟策略,比如重试时间间隔为1s、2s、4s、8s……指数增加,避免把服务器打死。

对服务注册来说,注册表结构需要详细设计,一个参考的注册表结构按照如下方式组织:

机房区域-部门-服务类型-服务名称-服务器地址

由于在ZooKeeper上的注册和发现有一定的延迟,所以在实现上也得注意,当服务启动成功后,才能注册到ZooKeeper上;当服务要下线或者重启前,需要先断开同ZooKeeper的连接,再停止服务。

五、连接池

RPC服务访问和数据库类似,建立链接是一个耗时的过程,连接池是服务调用的标配。目前还没有成熟的开源Apache Thrift链接池,一般互联网公司都会开发内部自用的链接池。自己实现可以基于JDBC链接池做改进,比如参考Apache commons DBCP链接池,使用Apache Pools来管理链接。 在接口设计上,连接池需要管理的是RPC 的Transport:

public interface TransportPool {
/**
* 获取一个transport
* @return
* @throws TException
*/
public TTransport getTransport() throws TException;
}

连接池实现的主要难点在于如何从多个服务器中选举出来为当前调用提供服务的连接。比如目前有10台机器在提供服务,上一次分配的是第4台服务器,本次应该分配哪一台?在实现上,需要收集每台机器的QOS以及当前的负担,分配一个最佳的连接。

六、API网关







请到「今天看啥」查看全文