首页 > 解决方案 > 如何为 gRPC 服务实现 liveness 和 readiness 端点?

问题描述

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

我想知道为检查我的服务的健康状况而实施活动性和就绪性探测的最佳方法是什么?

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

标签: dockergokubernetesgrpc

解决方案


以前我在应用程序中运行了一个单独的 http 服务器,仅用于运行状况检查(这是因为 AWS 应用程序负载均衡器只有 http 检查,我不了解 kube)。

如果您将 http 服务器作为单独的例程运行,并将 grpc 服务器运行在主 goroutine 上,那么您应该避免 grpc 服务器出现故障并且 http 仍然为 200 - OK(假设您还没有方法让 http健康检查您的 grpc)。

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

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

多路复用示例的链接:

https://github.com/gdm85/grpc-go-multiplex/blob/master/greeter_multiplex_server/greeter_multiplex_server.go


推荐阅读