上一篇Flume NG源码分析(五)使用ThriftSource通过RPC方式收集日志 介绍了ThriftSource利用Thrfit服务ThriftSourceProtocol来收集日志。这篇说说flume-ng-sdk中提供给应用层序使用的RpcClient的设计和实现。继续使用ThriftRpcClient来作例子。
先看看ThriftSourceProtocol提供的原生的客户端,它是Thrfit通过flume.thrift文件定义的Thrfit服务默认生成。这个原生的Client提供了网络传输和协议编解码等RPC客户端的基本功能。关于Thrift客户端可以参考这篇Thrift源码分析(三)-- IDL和生成代码分析
RpcClient接口定义了给应用程序使用的RPC客户端的基本功能
AbstractRpcClient抽象类实现了RPCClient接口,提供了getBatchSize的默认实现,并增加了configure接口来支持配置
对于一个设计良好的服务框架的客户端来说,有几个基本的特性
1. 服务寻址
2. 连接池管理
3. 客户端实现RPC调用的负载均衡
4. 缓存
5. 容灾处理,失效转移
我们来看看Flume NG是如何设计它的服务客户端的。基本的组件如下:
服务寻址
Flume NG的RPC客户端的服务寻址实现比较简单,只是在Properties配置文件里设置Thrift服务器的IP和端口,然后用这个值来创建TSocket。这里是一个可以扩展点,使服务寻址的能力更强,更灵活
连接池管理
首先是使用ClientWrapper类来封装Thrift生成的原生的Client,可以通过Properties配置来设置Client的值,设置socket连接和protocol编解码协议
LoadBalancingRpcClient继承了AbstractRpcClient类,提供了RPC客户端的负载均衡。这是一个装饰器模式的实现。
HostSelector接口定义了负载均衡的接口,它是对HostInfo进行负载均衡,再由HostInfo找到对应的RpcClient对象。
HostSelector有两个默认的实现
RoundRobinHostSelector是轮询方式的负载均衡实现
RandomOrderHostSelector是随机方式的负载均衡实现
看下RoundRobinHostSelector的实现,它的逻辑主要在OrderSelector这个类中实现
OrderSelector是一个支持回退backoff算法的顺序选择容器,它的类层次结构如下
父类OrderSelector是抽象类,定义了回退算法,子类RoundRobinOrderSelector和RandomOrderSelector实现了创建迭代器的算法。
RoundRobinOrderSelector的代码如下
1. getIndexList()返回状态正常的对象列表
2. nextHead索引指向当前位置,作为轮询的起点
对于LoadBalanceRpcClient来说,它的配置文件里,同一个RPC服务的服务器列表至少有两个服务端信息才能使用负载均衡。在配置文件中还配置了回退算法和负载均衡算法相关的配置
客户端负载均衡的主要组件如下
客户端缓存
客户端缓存比较简单,使用了一个Map结构,保存了HostInfo和对应的RPCClient对象,这样可以复用RPCClient对象,这是一个重对象,包含了一个连接池的实例。
客户端容灾处理
FailoverRpcClient类实现了客户端的容灾处理,它也是装饰器模式的实现,基础了AbstractRpcClient,实现了RpcClient接口FailoverRpcClient主要是实现了失效转移,利用重试机制,当一个RpcClient失效,就使用下一个RpcClient重试RPC请求,直到成功,或者全部失败
FailoverRpcClient也维护了一个HostInfo列表,由HostInfo再找到对应的RpcClient。还维护了一个最大的重试次数maxTries
看一下它的append方法,实现了重试机制来做失效转移
百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网92to.com,您的在线图书馆!
来源: http://www.92to.com/bangong/2017/10-26/30430636.html