gRPC介绍
gRPC
gRPC----基于Golang和Java的调用流程
- client向client stub发起方法调用请求;
- client stub接收到请求后,将方法名,请求参数等信息进行编码序列化;
- 然后client stub通过配置的 ip 和端口利用socket通过网络向远程服务器server发起请求;
- 远程服务器server接收到请求,解码反序列化请求信息;
- server将请求信息交给server stub,server stub找到对应的本地真实方法实现;
- 本地方法处理调用请求并将返回数据交给server stub;
- server stub 将数据编码序列化交给操作系统内核,使用socket将数据返回;
- client 端socket接收到远程服务器的返回信息;
- client stub将信息进行解码反序列化;
- client 收到远程服务器返回的信息。
stub(存根)
stub负责接收本地方法调用,并将它们委托给各自的具体实现对象。
server端stub又被称为skeleton(骨架)。可以理解为代理类。而实际上基于Java的RPC框架stub基本上也都是使用动态代理。
我们所说的client端和server端在RPC中一般也都是相对的概念。
而所谓的RPC框架也就是封装了上述流程中2-9的过程,让开发者调用远程方法就像调用本地方法一样。
常用RPC框架选型
-
Duboo:
阿里开源的基于TCP的RPC框架,基本上是国内生产环境应用最广的开发框架了。使用zookeeper做服务的注册与发现,使用Netty做网络通信。遗憾的是不能跨语言,目前只支持Java。
-
Thrift:
Facebook开源的跨语言的RPC框架,通过IDL来定义RPC的接口和数据类型,使用thrift编译器生成不同语言的实现。据说是目前性能最好的RPC框架,只是暂没使用过。
-
gRPC:
这个是我们今天要聊的重点。gRPC是Google的开源产品,是跨语言的通用型RPC框架,使用Go语言编写。 Java语言的应用同样使用了Netty做网络通信,Go采用了Goroutine做网络通信。序列化方式采用了Google自己开源的Protobuf。请求的调用和返回使用HTTP2的Stream。
-
SpringCloud:
SpringCloud并不能算一个RPC框架,它是Spring家族中一个微服务治理的解决方案,是一系列框架的集合。但在这个方案中,微服务之间的通信使用基于HTTP的Restful API,使用Eureka或Consul做服务注册与发现,使用声明式客户端Feign做服务的远程调用。这一系列的功能整合起来构成了一套完整的远程服务调用。
如何选择:
如果公司项目使用Java并不牵扯到跨语言,且规模并没有大到难以治理,我推荐Dubbo。如果项目规模大,服务调用错综复杂,我推荐SpringCloud。
如果牵扯到跨语言,我推荐gRPC,这也是目前我司的选择。即使Thrift性能是gRPC的2倍,但没办法,它有个好爹,现在我们的开发环境考虑最多的还是生态。
gRPC框架原理
一个RPC框架必须有两个基础的组成部分:数据的序列化和进程数据通信的交互方式。
对于序列化gRPC采用了自家公司开源的Protobuf。什么是Protobuf?先看一句网络上 大部分的解释:
Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。
上句有几个关键点:它是一种数据存储格式,跨语言,跨平台,用于通讯协议和数据存储。这么看和我们熟悉的JSON类似,但其实着重点有些本质的区别。
-
JSON主要是用于数据的传输,因为它轻量级,可读性好,解析简单。
-
Protobuf主要是用于跨语言的IDL,它除了和JSON、XML一样能定义结构体之外,还可以使用自描述格式定于出接口的特性,并可以使用针对不同语言的protocol编译器产生不同语言的stub类。所以天然的适用于跨语言的RPC框架中。
关于进程间的通讯,无疑是Socket。Java方面gRPC使用了成熟的开源框架Netty。使用Netty Channel作为数据通道。传输协议使用了HTTP2。
通过以上的分析,我们可以将一个完整的gRPC流程总结为以下几步:
- 通过.proto文件定义传输的接口和消息体。
- 通过protocol编译器生成server端和client端的stub程序。
- 将请求封装成HTTP2的Stream。
- 通过Channel作为数据通信通道使用Socket进行数据传输。
公司使用Server:Golang + Client:Java
使用:https://rejoiner.io/ 提供查询测试
rejoiner能够从gRPC微服务和其他Protobuf源生成统一的GraphQL schema,具有以下功能:
● 从微服务创建统一的GraphQL模式
● 可灵活定义GraphQL模式并组成共享组件
● 从Proto定义生成GraphQL类型
● 基于GraphQL查询参数填充请求Proto
● 提供一个DSL来修改生成的模式
● 通过注释获取数据的方法来加入数据源
● 基于GraphQL选择器创建Proto FieldMasks
你应当热爱自由!
作者:Leejk,转载请注明原文链接:https://www.cnblogs.com/leejk/p/16040419.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?