首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Thrift RPC实战 Spring集成Thrift,实现服务端和客户端代理

本文主要讲解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

欢迎关注我的公众号,获取更多文章,并与我交流沟通。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180406G03H5P00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券