ScalaPB(0): 找寻合适的内部系统微服务集成工具

时间:2024-01-23 07:10:33

   前一段时间我们探讨了SDP的一个基于集群的综合数据平台解决方案,由多种数据库组成,包括:JDBC, Cassandra 及MongoDB。其中Cassandra和MongoDB属于分布式数据库,可以在集群中任何部署节点调用。而JDBC数据库则是非分布式的,无法部署在多个节点。假设我们把每种数据库的数据处理功能以微服务microservice形式提供出来的话,任何从其它集群节点对JDBC数据库微服务的调用都需要进行数据的序列化(serialization)。虽然Cassandra和MongoDB是分布式的,但也只限在它们已部署的不同节点上*交流。现在看来,不同的数据微服务之间的交互还是需要通过serialization来实现的。也就是说数据需要经过序列化marshalling才能发送,接收后反序列化unmarshalling才能还原数据。曾经花了点时间研究了一下akka-http:当时我初选的所谓系统集成工具,它是通过json格式数据交换来集成系统的。json是个标准数据格式,所以可以实现异类系统之间的数据交换。一直在考虑,如果SDP数据平台微服务之间是通过akka-http进行数据交换的形式实现集成的话,这个集成的体系内部交互效率会非常低,这是因为1、json是一种字符型的数据,占据空间较大,传输效率自然低。2、受制于http1.0交互模式,方便了数据下行但上行数据只限于请求指令。这种模式在系统层面的交互能力很有限,或者很不自然,很不方便。为此也郁闷了一阵。实际上使用akka-http需要的门槛很高,即使akka-http已经提供了许多帮助http操作的类型,但光是理解http协议内容及httprequest,httpresponse细节、构建、使用方法就花去了我几个星期的精力,而且才刚刚达到枯浅的理解水平,如果在实际应用中能够真正调动自然,则需要添加更多的努力了。

   google gRPC是一种全新的RPC框架,在开源前一直是google内部使用的集成工具。gRPC支持通过http/2实现protobuf格式数据交换。protobuf即protocol buffer,是google发明的一套全新的序列化传输协议serialization-protocol,是二进制编码binary-encoded的,相对java-object,XML,Json等在空间上占有优势,所以数据传输效率较高。由于gRPC支持http/2协议,可以实现双向通讯duplex-communication,解决了独立request/response交互模式在软件编程中的诸多局限。这是在系统集成编程方面相对aka-http占优的一个亮点。protobuf格式数据可以很方便的转换成 json格式数据,支持对外部系统的的开放协议数据交换。这也是我决定选择gRPC作为大型系统微服务集成开发工具的主要原因。更重要的是:用protobuf和gRPC进行client/server交互不涉及任何http对象包括httprequest,httpresponse,很容易上手使用,而且又有在google等大公司内部的成功使用经验,用起来会更加放心。

gRPC支持下面四种交互协议:

1、Unary:独立的一对client-request/server-response,是我们常用的http交互模式

2、Server-Streaming:client发出一个request后从server端接收一串多个response

3、Client-Streaming:client向server发送一串多个request后从server接收一个response

4、Bidirectional-Streaming:还是由client首先发送request启动连接,然后在这个连接上client/server双方可以不断交互信息。

感觉第4种方式最适合程序流程层面的交互。也就是说它可以代表一种自然的程序流程,虽然它还是需要client主动发起交互连接。由于产生的源代码中不涉及任何http协议相关类型及操作,使用起来更容易上手。

在scala编程世界里我们可以用scalaPB来实现对gRPC和protobuf的使用。

google gRPC的使用流程如下:

1、创建一个.proto文件,用IDL语言(Interface Definition Language)定义数据类型和服务

2、对.proto文件进行编译后产生相关的java数据类型和抽象服务框架

3、在java编程中可以直接调用编译产生的数据类型及对数据进行操作

4、继承并实现产生的服务类

scalaPB是一个scala版的protobuf编译器。编译.proto文件后产生scala语言的数据类型和抽象服务类,这样我们就可以在scala环境里使用protobuf和gRPC实现微服务的集成编程了。

我将会在下面几篇博文里介绍使用scalaPB进行protobuf数据转换、gRPC微服务实现、gRPC的流式操作以及gRPC流与json之间转换方法等。