gpt4 book ai didi

grpc - 对健康检查协议(protocol)感到困惑

转载 作者:行者123 更新时间:2023-12-05 04:59:08 24 4
gpt4 key购买 nike

我已阅读以下文档、源代码和问题:

我举个例子来解释一下:

// Import package
let health = require('grpc-health-check');

// Define service status map. Key is the service name, value is the corresponding status.
// By convention, the empty string "" key represents that status of the entire server.
const statusMap = {
"ServiceFoo": proto.grpc.health.v1.HealthCheckResponse.ServingStatus.SERVING,
"ServiceBar": proto.grpc.health.v1.HealthCheckResponse.ServingStatus.NOT_SERVING,
"": proto.grpc.health.v1.HealthCheckResponse.ServingStatus.NOT_SERVING,
};

// Construct the service implementation
let healthImpl = new health.Implementation(statusMap);

// Add the service and implementation to your pre-existing gRPC-node server
server.addService(health.service, healthImpl);

我不清楚以下几点:

  1. statusMap 中的服务名称是否需要与 Protocol Buffer 文件中的服务名称相同?或者可以任意指定服务名称。如果是这样,服务名称如何映射到 Protocol Buffer 中定义的服务?

来自健康检查协议(protocol):

The server should register all the services manually and set the individual status

  1. 为什么我们需要手动注册?如果可以生成服务代码,为什么grpc不帮我们在statusMap中自动注册服务名称呢? (想象一下,一一设置100个服务的状态)

  2. 服务状态是硬编码,无法在应用程序运行时更改。如果我的服务在运行时由于某种原因不可用,例如配置错误,下游服务不可用,但服务的状态始终是服务(因为它是硬代码),如果是这样,健康检查的意义是什么?

对于RESTful API,我们可以提供一个/health-check或者/ping API来检查整个服务器是否正常运行。

最佳答案

关于服务名称,第一个链接文档是这样说的:

The suggested format of service name is package_names.ServiceName, such as grpc.health.v1.Health.

这确实对应于 Protobuf 定义中定义的包名称和服务名称。

服务需要“手动”注册,因为状态是在应用程序级别确定的,grpc 库不知道这一点,注册的服务名称只有与相应的状态一起才有意义。另外,上面提到的命名格式只是一种约定;健康检查服务用户不受此限制,服务器上的实际服务也不受限于使用标准的/package_names.ServiceName/MethodName方法命名方案。

关于第三点,服务状态不应该硬编码,可以在运行时改变。问题代码中使用的 HealthImplementation 类有一个 setStatus 方法,可用于更新状态。

此外,正如问题代码中的注释中所述,

By convention, the empty string "" key represents that status of the entire server.

这可以用作 /health-check/ping REST API 的等价物。

关于grpc - 对健康检查协议(protocol)感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63635064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com