5分钟学会 gRPC(上)

简介: 我猜测大部分长期使用 Java 的开发者应该较少会接触 gRPC,毕竟在 Java 圈子里大部分使用的还是 Dubbo/SpringClound 这两类服务框架。我也是近段时间有机会从零开始重构业务才接触到 gRPC 的,当时选择 gRPC 时也有几个原因

介绍


我猜测大部分长期使用 Java 的开发者应该较少会接触 gRPC,毕竟在 Java 圈子里大部分使用的还是 Dubbo/SpringClound 这两类服务框架。


我也是近段时间有机会从零开始重构业务才接触到 gRPC 的,当时选择 gRPC 时也有几个原因:


网络异常,图片无法展示
|


  • 基于云原生的思路开发部署项目,而在云原生中 gRPC 几乎已经是标准的通讯协议了。


  • 开发语言选择了 Go,在 Go 圈子中 gRPC 显然是更好的选择。


  • 公司内部有部分业务使用的是 Python 开发,在多语言兼容性上 gRPC 支持的非常好。


经过线上一年多的平稳运行,可以看出 gRPC 还是非常稳定高效的;rpc 框架中最核心的几个要点:


  • 序列化


  • 通信协议


  • IDL(接口描述语言)


这些在 gRPC 中分别对应的是:


  • 基于 Protocol Buffer 序列化协议,性能高效。


  • 基于 HTTP/2 标准协议开发,自带 stream、多路复用等特性;同时由于是标准协议,第三方工具的兼容性会更好(比如负载均衡、监控等)


  • 编写一份 .proto 接口文件,便可生成常用语言代码。


HTTP/2


学习 gRPC 之前首先得知道它是通过什么协议通信的,我们日常不管是开发还是应用基本上接触到最多的还是 HTTP/1.1 协议。


网络异常,图片无法展示
|


由于 HTTP/1.1 是一个文本协议,对人类非常友好,相反的对机器性能就比较低。

需要反复对文本进行解析,效率自然就低了;要对机器更友好就得采用二进制,HTTP/2 自然做到了。


除此之外还有其他优点:


  • 多路复用:可以并行的收发消息,互不影响


  • HPACK 节省 header 空间,避免 HTTP1.1 对相同的 header 反复发送。


Protocol


gRPC 采用的是 Protocol 序列化,发布时间比 gRPC 早一些,所以也不仅只用于 gRPC,任何需要序列化 IO 操作的场景都可以使用它。


它会更加的省空间、高性能;之前在开发 github.com/crossoverJi… 时就使用它来做数据交互。


package order.v1;
service OrderService{
  rpc Create(OrderApiCreate) returns (Order) {}
  rpc Close(CloseApiCreate) returns (Order) {}
  // 服务端推送
  rpc ServerStream(OrderApiCreate) returns (stream Order) {}
  // 客户端推送
  rpc ClientStream(stream OrderApiCreate) returns (Order) {}
  // 双向推送
  rpc BdStream(stream OrderApiCreate) returns (stream Order) {}
}
message OrderApiCreate{
  int64 order_id = 1;
  repeated int64 user_id = 2;
  string remark = 3;
  repeated int32 reason_id = 4;
}


使用起来也是非常简单的,只需要定义自己的 .proto 文件,便可用命令行工具生成对应语言的 SDK。


具体可以参考官方文档:grpc.io/docs/langua…


调用


protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    test.proto


网络异常,图片无法展示
|


生成代码之后编写服务端就非常简单了,只需要实现生成的接口即可。


func (o *Order) Create(ctx context.Context, in *v1.OrderApiCreate) (*v1.Order, error) {
  // 获取 metadata
  md, ok := metadata.FromIncomingContext(ctx)
  if !ok {
    return nil, status.Errorf(codes.DataLoss, "failed to get metadata")
  }
  fmt.Println(md)
  fmt.Println(in.OrderId)
  return &v1.Order{
    OrderId: in.OrderId,
    Reason:  nil,
  }, nil
}


网络异常,图片无法展示
|


客户端也非常简单,只需要依赖服务端代码,创建一个 connection 然后就和调用本地方法一样了。


这是经典的 unary(一元)调用,类似于 http 的请求响应模式,一个请求对应一次响应。


网络异常,图片无法展示
|


相关文章
|
安全 网络安全
Kali渗透测试:使用Armitage扫描网络
Kali渗透测试:使用Armitage扫描网络
228 3
|
11月前
|
安全 数据挖掘 数据安全/隐私保护
国产CRM品牌巡礼:系统品牌的核心优势与特色
本文深度解析国产CRM系统的四大知名品牌:销售易、神州云动、销帮帮和天衣云。 销售易:中国领先的CRM解决方案提供商,提供全渠道获客、智能化销售流程及AIGC技术应用,赢得500强企业信赖。 神州云动:以PaaS+SaaS模式、灵活定制和行业解决方案著称,支持企业实现客户关系管理的数字化和智能化。 销帮帮:面向中小企业的实用型CRM系统,提供销售跟踪、客户视图等功能,提高销售效率和客户满意度。 天衣云:专注于云端部署,提供快速部署、高安全性的CRM解决方案,确保企业信息安全。 各品牌各有特色,企业应根据自身需求选择合适的CRM系统,以实现客户关系的全面管理,提升业务效率和客户满意度。
|
前端开发
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(七)
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(七)
481 0
|
11月前
|
负载均衡 算法 应用服务中间件
Nginx的负载均衡
Nginx 是一款高性能的Web服务器与反向代理服务器,支持负载均衡功能,能有效提升系统性能与可靠性。其负载均衡策略包括基于轮询和权重的分配方法,以及IP哈希、最小连接数等算法,可根据实际需求灵活选择。
373 5
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
237 3
Mysql(4)—数据库索引
|
安全 Linux
探索Linux操作系统的启动过程
在这篇文章中,我们将深入探讨Linux系统的启动流程,从电源开启到登录界面呈现的每一个步骤。我们将揭示BIOS、引导加载器、内核以及初始化进程如何协同工作,使Linux系统顺利启动。通过了解这些过程,读者将能更好地理解Linux系统的工作原理,并为可能出现的启动问题提供解决思路。
262 14
|
人工智能 自然语言处理 数据库
RAG 技术:让 AI 从 “书呆子” 变身 “开卷小天才”!
鳄叔介绍了RAG(检索增强生成)技术,这是一种让AI既能查资料又能灵活作答的方法,如同“开卷考试”的学霸。RAG结合了检索能力和生成能力,使AI能够实时获取最新信息,提供更专业、精准的回答,广泛应用于企业客服、法律咨询、医疗诊断和教育等领域。
313 0
|
Java Spring 容器
什么情况下会导致@Async异步方法会失效?
什么情况下会导致@Async异步方法会失效?
263 1
|
测试技术 Python
python 命令行参数 argparse详解
这篇文章是关于Python命令行参数解析库`argparse`的详细解释和使用教程。文中提供了完整的代码模板,包括如何定义命令行参数、如何添加位置参数、可选参数和布尔参数,以及如何解析和使用这些参数。文章还包含了示例代码和测试用例,以展示如何在实际程序中应用`argparse`库。
237 0
|
机器学习/深度学习 人工智能 自然语言处理
【AI 生成式】生成式人工智能如何在虚拟现实和游戏中使用?
【5月更文挑战第4天】【AI 生成式】生成式人工智能如何在虚拟现实和游戏中使用?