如何实现 gRPC 服务的活性和就绪端点?

moo*_*ara 5 go docker kubernetes grpc

我有一个 gRPC 服务,它使用 tcp 侦听器侦听端口。该服务是 Docker 化的,最终我想在 Kubernetes 集群中运行它。

我想知道实施活性就绪性探针来检查服务运行状况的最佳方法是什么?

  1. 我应该在另一个 goroutine 中运行单独的 http 服务器并响应/health/ready路径吗?
  2. 或者,我还应该对我的服务进行 gRPC 调用以确保其活跃性和就绪性,并使用 gRPC 客户端来查询这些端点吗?!

Zak*_*Zak 3

以前我在应用程序内运行了一个单独的http服务器,只是为了进行健康检查(这是因为AWS应用程序负载均衡器只有http检查,我不知道kube)。

如果你将 http 服务器作为单独的例程运行,而 grpc 服务器在主 goroutine 上运行,那么你应该避免 grpc 服务器宕机并且 http 仍然是 200 的情况 - OK(假设你还没有办法让 http 来健康检查你的 grpc)。

您还可以使用 goroutine 的 heatbeat 模式,它由 http 服务器控制并接受来自 grpc 服务器的心跳以确保一切正常。

如果您运行 2 台服务器,它们将需要在不同的端口上运行,这对于某些需要 1 个端口用于服务的调度程序(如 ECS)来说可能是一个问题。有一些示例和包允许您将多个协议复用到同一端口上。我猜 kube 支持多个端口服务,所以这可能不是问题。

链接到多路复用示例:

https://github.com/gdm85/grpc-go-多路复用/blob/master/greeter_多路复用_服务器/greeter_多路复用_server.go