1.2.2 Thrift
最初是由Facebook开发的内部系统跨语言的RPC框架,2007年贡献给了Apache。轻量级的跨语言RPC通信方案,支持多达25种编程语言。为了支持多种语言,跟gRPC一样,Thrift也有一套自己的接口定义语言IDL,可以通过代码生成器,生成各种编程语言的Client端和Server端的SDK代码,这样就保证了不同语言之间可以相互通信。
架构
特性
- 序列化格式
Binary、Compact、JSON、Multiplexed等。 - 通信方式
Socket、Framed、File、Memory、zlib等。 - 服务端支持多种处理方式
Simple 、Thread Pool、Non-Blocking等。
选型
那么涉及跨语言的服务调用场景,到底该选择gRPC还是Thrift呢?
从成熟度上来讲,Thrift因为诞生的时间要早于gRPC,所以使用的范围要高于gRPC,在HBase、Hadoop、Scribe、Cassandra等许多开源组件中都得到了广泛地应用。而且Thrift支持多达25种语言,这要比gRPC支持的语言更多,所以如果遇到gRPC不支持的语言场景下,选择Thrift更合适。
但gRPC作为后起之秀,因为采用了HTTP/2作为通信协议、ProtoBuf作为数据序列化格式,在移动端设备的应用以及对传输带宽比较敏感的场景下具有很大的优势,而且开发文档丰富,根据ProtoBuf文件生成的代码要比Thrift更简洁一些,从使用难易程度上更占优势,所以如果使用的语言平台gRPC支持的话,建议还是采用gRPC比较好。
总结
所以若你的业务场景仅一种语言,可选择跟语言绑定的RPC框架
如果涉及多个语言平台之间的相互调用,必须选择跨语言平台的RPC框架。
支持多语言是RPC框架未来的发展趋势。正是基于此判断,各个RPC框架都提供了Sidecar组件来支持多语言平台之间的RPC调用。
Dubbo也引入Sidecar组件来构建Dubbo Mesh提供多语言支持,如 dubbo-go。
Motan也开源了其内部的Sidecar组件:Motan-go,目前支持PHP、Java语言之间的相互调用。
Spring Cloud也提供了Sidecar组件spring-cloud-netflix-sideca,可以让其他语言也可以使用Spring Cloud的组件。
所以语言不会成为使用上面这几种RPC框架的约束,而gRPC和Thrift虽然支持跨语言的RPC调用,但是因为它们只提供了最基本的RPC框架功能,缺乏一系列配套的服务化组件和服务治理功能的支撑,所以使用它们作为跨语言调用的RPC框架,就需要自己考虑注册中心、熔断、限流、监控、分布式追踪等功能的实现,不过好在大多数功能都有开源实现,可以直接采用。