如何解决Ruby gRPC健康检查出现的NOTFOUND错误?
gRPC Ruby健康检查返回GRPC::NotFound错误解决方案
错误原因
该报错由Grpc::Health::Checker实例中未提前注册对应服务的健康状态导致:代码中在check方法内每次收到请求才实例化Checker,新实例无任何服务状态记录,无法匹配请求的服务参数,直接返回GRPC::NotFound错误。
解决方案
- 调整Checker实例初始化时机:将Checker改为全局/类单例实例,在服务启动阶段完成初始化和服务状态注册,不要在请求处理逻辑中实例化
- 保证注册服务名与请求参数一致:客户端请求时传入的
service参数需要和注册时使用的服务名完全匹配,通用全局健康检查可注册空字符串为服务名 - 可直接使用内置Checker作为服务,无需额外继承封装,减少冗余代码
正确代码示例
require 'grpc/health/v1/health_pb' require 'grpc/health/checker' # 服务启动阶段完成初始化和状态注册 health_checker = Grpc::Health::Checker.new # 注册全局健康状态(对应service参数为空的请求) health_checker.add_status('', Grpc::Health::V1::HealthCheckResponse::ServingStatus::SERVING) # 按需注册单个服务的健康状态 health_checker.add_status('your.custom.service', Grpc::Health::V1::HealthCheckResponse::ServingStatus::SERVING) # 若无需自定义健康检查逻辑,可直接将checker实例挂载到gRPC服务端,不需要自定义Service类 server = GRPC::RpcServer.new server.handle(health_checker) server.add_http2_port('0.0.0.0:50051', :this_port_is_insecure) server.run
常见踩坑点
- 动态实例化Checker:每次请求生成新的Checker实例,所有注册的状态都会丢失
- 服务名不匹配:注册时使用完整服务名,客户端请求时仅传服务简称,导致匹配失败
- 未注册空服务名:K8s等环境的gRPC健康探针默认会传入空字符串作为service参数,未注册该状态会直接返回NotFound
内容的提问来源于stack exchange,提问作者Rasna Shakya
相关产品推荐
相关产品推荐

