当我们淡到RPC服务框架,放眼世界范围,我目前知道的主流有thrift,fingle,grpc等。当然大型互联网公司都会有自己的RPC服务与治理框架。经过一段时间的调研,本着简单,高效的原则,最终选择thrift.具体原因,等接下来写到服务篇的时候再细说。
对于曾经使用过thrift来开发RPC服务的同学来讲,经常碰到就是client去连server端的时候,程序首先要声明连接协议,我们以socket为例。然后开始连接到服务端,调用远端的方法,关闭连接。
代码片断如下:
伴随着服务越来越多,如果我们的代码中充斥这些duplicate code,心里总是痒痒的,非得把它干掉。联想到当初最开始写 jdbc常用的crud方法那段时间,代码里面也是挺多的open,close种种。其实想想,如果能有连接池,这个问题也就好解决了。于是,首先在github上找找,有没有现成的实现。果然,有一位前辈已经实现了。于是果断下载,地址是https://github.com/PhantomThief/thrift-pool-client。
下面是这个客户端所实现的功能,感觉还是相当不错的。
A Thrift Client pool for Java
raw and type safe TServiceClient pool
Multi backend servers support
Backend servers replace on the fly
Backend route by hash or random
Failover and failback support
jdk 1.8 only
不过,看了md之后,发现only support jdk8。心里凉了半截,难道老外都在用jdk8了?于是花了半天时 间,熟读了新的语法之后,准备改造前辈的代码。通读代码之后,发现里面有好几个类使用lambda语法,flatmap,collection,filter.另外就是函数是编程function.最后还有Supplier。好在guava已经实现了后两者,我只需要改改lambda的语法。
核心类说明:
ThriftClientImpl:它是客户端的实现类,主要是业务方经常用到的iface方法,先看图:
里面有两段代码需要改动。第一个就是设置执行的方法过滤,第二个是代理方法里面调用,实际就是业务方真正调用的方法块。关键点是javassist它是一种字节码处理技术,可以动态改变方法块。本段代码其实类似一个代理工厂,它代理了所有业务服务的执行片断
DefaultThriftConnectionPoolImpl,ThriftConnectionFactory:thrift连接池实现,基本是apache pool的通用连接池处理。
其中sokcet.open对应着makeobject.socket.close对应着destroyobject
ThriftClientUtils:这个类有一个获取接口中所有方法的名称集合的方法,把lambda的语法改成熟悉的方式。
其它类也是做了相关调整,这里就不一一说明了。最后讲一下调用。
1连接池初始化
2 构建单例的rpc服务,因为rpc服务可能在多台机器上,所以会有分片
3 协议的声明
4 调用
5结果,因为我有一个简单的计算服务,已经发布在测试机器了,这里就是1+99的结果。
主体写完了,改天会把github的地址贴上来,请随时关注。
posted on 2016-06-29 18:14
alexcai 阅读(1515)
评论(2) 编辑 收藏