本文主要讲解thrift的服务化改造, 这边侧重于阐述对client(服务调用方)的改造和设计思想.
1.基础概念:
传统对client的优化, 主要是Client Manager化, 优化方式包括引入连接池, 支持Failover/LoadBalance机制. 上一篇文章中我们已经实践了thrift服务客户端对象池的技术改造 PRC服务化, 对于client(服务调用方)而言, 应该隐藏client和server端的交互细节(包括failover/loadbalance), 唯一需要暴露/使用的是服务方提供的接口. 简而言之, 通过service接口进行rpc服务, 而不是采用client的api去访问. 用thrift api作为例子
面向接口编程: 先来看下thrift生成的类有那些
其生成的类有如下所示:
评注: HelloService.Iface就是同步HelloService的接口定义, 而HelloService.Client则是与服务端交互的具体客户端实例.
面向接口编程, 采用装饰者模式(Decorator Pattern, 接口+组合), 借助实现HelloService.Iface接口, 握有HelloService.Client实例的方式去实现. 这样能达到服务化的初步雏形, 但这远远不够.
2.服务化的基本特征:
RPC Client服务化的基本特征(个人观点), 可以分为如下: 1). 泛型化, 作为一个服务框架存在, 而不是只用于具体模块 2). 内部封装的client需要实现client-manager化, 即支持连接池/failover/loadbalance 3). 通过订阅服务的方式, 透明的调用服务提供方(不需要知道服务提供方的server ip:port 列表) 本文主要阐述思路, 服务订阅放在后续的文章, 弱化Client-Manager, 但支持泛型化来实现一个简单的client service解决方案.
3服务化改造解决方案:
3.1服务端改造:
对泛型Thrift Service的支持, 通过采用spring配置以及反射的方式来实现.
对于一个服务提供者来说,需要提供端口,接口以及接口实现类,因此在接口中spring中配置
当然userServiceImpl需要提前声明,例如:
接下来定义ThriftServerProxy类,定义bean中需要用到的3个属性,接下来通过反射来实现服务的启动。
编写服务端测试:
3.2客户端改造:
对于客户端,从连接池里面获取一个可用的服务端连接,通过反射的方式获取客户端,在spring-client.xml中配置如下:
连接池采用commons-pool提供的连接池,在spring启动的时候,注入到bean中,
关键代码如下:
客户端的代理对象获取client代码:
客户端测试:
当前的不足: 没有使用订阅服务列表, 使得在配置中, 需要指定ip:port列表,后续会通过zookeeper编写发布/订阅服务列表的实现方案。
参考demo地址如下:
码云:http://git.oschina.net/shunyang/thrift-all/tree/master/thrift-springgithub:https://github.com/shunyang/thrift-all/tree/master/thrift-spring
欢迎关注我的公众号,获取更多文章,并与我交流沟通。
领取专属 10元无门槛券
私享最新 技术干货