type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Mar 24, 2024 03:12 AM
Parent item
领域
在本章中,我们将展示如何使用 gRPC 在服务之间构建强大的内部通信。我们还介绍了为谷歌云设置身份验证和 TLS 所需的一些额外配置。
gRPC通信效率是REST的10倍以上。当您的 API 每秒处理数百万个请求时,可能需要进行成本优化。不过在像 Wild Workouts 这样的应用程序中,流量可能低于 10 个请求/秒,这点性能优势并不重要。
生成gRPC服务
目前,我们在 Wild Workouts 中没有很多 gRPC 端点。我们可以更新教练的可用时间和学员的培训余额(学分)。让我们检查一下 Trainer gRPC 服务。为了定义我们的 gRPC 服务器,我们需要创建
trainer.proto
文件使用make命令生proto对应的代码(先安装proto的工具和插件):
生成的代码类似如下:
HTTP 和 gRPC 之间的区别在于,在 gRPC 中我们不需要关心应该返回什么以及如何返回。如果我将可信度与 HTTP 和 gRPC 进行比较,就像比较 Python 和 Go 一样。这种方式更加严格,并且不可能返回或接收任何无效值 - 编译器会让我们知道这一点。 Protobuf 还具有处理字段弃用和处理向后兼容性的内置功能。这在拥有许多独立团队的环境中非常有帮助。
接下来就是实现业务接口:
注册该实现,启动grpc服务:
内部的gRPC客户端
客户端结构也是从proto文件生成的:
客户端可以配置
- 身份验证,
- TLS 加密,
- “服务发现”(我们使用
Terraform
通过TRAINER_GRPC_ADDR
环境变量提供的服务的硬编码名称)。
创建好了客户端,可以调用任何方法了:
通过Terraform使用TLS认证
接下来通过
[]grpc.DialOption
传给客户端:支持已经对gRPC的服务端和客户端进行了简单介绍, 但是并没有解决项目内部通信的所有问题,gRPC 非常适合同步通信,但并非每个进程本质上都是同步的。在任何地方应用同步通信最终会创建一个缓慢且不稳定的系统。目前,Wild Workouts 没有任何异步流程。我们将在接下来的章节中通过实现新功能来更深入地讨论这个主题。