onlyliuxin / coding2017

217 stars 644 forks source link

现在流行微服务架构,微服务间大家怎么实现RPC呢? #481

Open amjack opened 7 years ago

amjack commented 7 years ago

希望大家不吝赐教。

msftgitsklsd commented 7 years ago

一个典型的RPC调用,A服务器中的应用传递对象给B服务器,B服务器根据A传递的对象参数给出特定的返回值。

因此,在A服务器应用中,会把对象序列化成二进制的流,再通过socket或者http等形式传输到B服务器,B服务器的应用收到二进制流之后,通过反序列化,转换成对象。

所以RPC调用的核心是序列化和反序列化,序列化的内容推荐看下http://kb.cnblogs.com/page/515982/。

序列化比较通用的是使用xml和json,好处是通用,不挑语言(java做服务端,php、python、go做客户端,或者反过来)。

针对高性能的场景,通常传递的对象非常大,序列化和反序列化的性能就成为非常重要的指标(RPC通常都提供自己的序列化和反序列化方式),最核心的两个是: 1.cpu开销,把对象转成2进制流,并反转成对象的cpu消耗,复杂的序列化协议会导致较长的解析时间,这可能会使得序列化和反序列化阶段成为整个系统的瓶颈。 2.序列化后用于传输的2进制流的大小。对于海量分布式存储来说数据量往往以TB计算,因此空间开销过大意味着高昂的硬件成本。

目前业界公认的,最为优秀的序列化反序列化方案有:google开源的protocol buffer(https://developers.google.com/protocol-buffers/ ) 和apache thrift(http://thrift.apache.org/ ) 和apache avro。

profocol buffer是google出品,thrift是facebook开发,后贡献给Apache,两个都是非常优秀的RPC框架。avro没有仔细了解过,不多说。

各大互联网公司 RPC 组件现状 Google: protobuf, 基于 protobuf的 RPC 框架 Stubby. Facebook: thrift 百度: sofa-pbrpc(基于protobuf) 腾讯: Tars、Pebble(c++) 阿里: Dubbo、HSF

wubingyang commented 7 years ago

dubbo使用的是netty作为网络框架 .spring_cloud则是使用http