我已阅读以下文档、源代码和问题:
- https://github.com/grpc/grpc/blob/master/doc/health-checking.md
- https://github.com/grpc/grpc-node/blob/master/packages/grpc-health-check/test/health_test.js
- https://github.com/grpc/grpc/issues/10428
我提供一个例子并尝试解释:
// 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);
我不清楚以下几点:
- 中的服务名称是否
statusMap
需要与协议缓冲区文件中的服务名称相同?或者可以任意指定服务名称。如果是这样,服务名称如何映射到协议缓冲区中定义的服务?
从健康检查协议:
服务器应手动注册所有服务并设置个人状态
为什么我们需要手动注册?如果可以生成服务代码,为什么 grpc 不帮我们自动注册服务名
statusMap
呢?(想象一下,一一设置100个服务的状态)服务状态是硬代码,不能在应用程序运行时更改。如果我的服务在运行时由于配置错误等原因不可用,下游服务不可用,但服务的状态始终是服务(因为它是硬代码),如果是这样,健康检查是什么意思?
对于 RESTful API,我们可以提供一个/health-check
或/ping
API 来检查整个服务器是否正常运行。