如何在grpc-dart实现中实现适配Kubernetes的gRPC健康检查功能
Dart gRPC 健康检查实现方案
Dart官方gRPC库确实没有内置健康检查服务,你可以按照以下步骤手动实现,完全兼容gRPC标准健康检查协议和Kubernetes探针规则:
1. 编写标准健康检查Proto文件
gRPC官方有统一的健康检查协议定义,直接复用即可,创建health.proto文件内容如下:
syntax = "proto3"; package grpc.health.v1; message HealthCheckRequest { string service = 1; } message HealthCheckResponse { enum ServingStatus { UNKNOWN = 0; SERVING = 1; NOT_SERVING = 2; SERVICE_UNKNOWN = 3; } ServingStatus status = 1; } service Health { rpc Check(HealthCheckRequest) returns (HealthCheckResponse); rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse); }
2. 编译生成Dart侧代码
执行以下命令编译proto为Dart可用的代码,需要提前安装好protoc和Dart gRPC插件:
protoc --dart_out=grpc:lib/src/generated -Iprotos protos/health.proto
将命令中的路径替换为你项目中对应存放proto和生成代码的路径即可。
3. 实现健康检查服务逻辑
自定义类继承生成的HealthServiceBase,实现对应的业务逻辑:
import 'package:grpc/grpc.dart'; import 'generated/health.pbgrpc.dart'; class HealthServiceImpl extends HealthServiceBase { // 存储各服务的健康状态,空字符串对应全局服务状态 final Map<String, HealthCheckResponse_ServingStatus> _statusMap = { '': HealthCheckResponse_ServingStatus.SERVING, }; // 提供方法动态更新服务状态 void setStatus(String service, HealthCheckResponse_ServingStatus status) { _statusMap[service] = status; } @override Future<HealthCheckResponse> check( ServiceCall call, HealthCheckRequest request) async { final status = _statusMap[request.service] ?? HealthCheckResponse_ServingStatus.SERVICE_UNKNOWN; return HealthCheckResponse()..status = status; } @override Stream<HealthCheckResponse> watch( ServiceCall call, HealthCheckRequest request) async* { // 简单实现直接返回当前状态,需要实时推送的话可以监听状态变化事件推送 yield HealthCheckResponse() ..status = _statusMap[request.service] ?? HealthCheckResponse_ServingStatus.SERVICE_UNKNOWN; } }
4. 注册服务到gRPC服务器
启动gRPC服务器时把健康检查服务注册进去即可:
final server = Server( [ // 你自己的其他业务服务 HealthServiceImpl(), ], ); await server.serve(port: 50051);
5. Kubernetes探针配置
Kubernetes 1.23及以上版本原生支持gRPC类型探针,直接配置即可:
livenessProbe: grpc: port: 50051 # 检查特定服务状态的话填对应服务名,空字符串检查全局状态 service: "" initialDelaySeconds: 5 periodSeconds: 10
低版本Kubernetes可以使用grpc_health_probe命令行工具执行检查。
内容的提问来源于stack exchange,提问作者Daniel Armas
相关产品推荐
相关产品推荐

