You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:39:02