基于Grpc的健康检查

1. Grpc健康检查

Grpc健康检查是通过一个普通的用户rpc调用进行实现,Grpc的健康检查定义了如下的protobuf,这样就能实现所有的Grpc协议健康检查的互通。

Firstly, since it is a GRPC service itself, doing a health check is in the same format as a normal rpc. Secondly, it has rich semantics such as per-service health status. Thirdly, as a GRPC service, it is able reuse all the existing billing, quota infrastructure, etc, and thus the server has full control over the access of the health checking service.

  1. syntax = "proto3";
  2. package grpc.health.v1;
  3. message HealthCheckRequest {
  4. string service = 1;
  5. }
  6. message HealthCheckResponse {
  7. enum ServingStatus {
  8. UNKNOWN = 0;
  9. SERVING = 1;
  10. NOT_SERVING = 2;
  11. SERVICE_UNKNOWN = 3; // Used only by the Watch method.
  12. }
  13. ServingStatus status = 1;
  14. }
  15. service Health {
  16. rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
  17. rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
  18. }

2 triple健康检查服务

  • Dubbo-go框架在启动后会自动向框架中注册健康检查服务,提供基于grpc health proto的健康检查服务,无需在配置文件中额外配置。
  • triple健康检查服务可以通过grpc-health-probe检查框架中服务的状态,也可以通过grpc调用该健康检查服务,但是不能通过triple客户端调用该健康检查服务(基于grpc的健康检查服务不通过注册中心注册),调用的服务名为“grpc.health.v1.Health”,接口为check。

2.1 通过gprc客户端调用健康检查服务:

  • 启动dubbo-go-samples中的triple服务,通过下面的grpc客户端便可以查看”org.apache.dubbogo.samples.api.Greeter”的状态。triple健康检查服务与grpc互通,所以可以通过grpc客户端查看基于triple协议服务的健康状态。
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. )
  7. import (
  8. "google.golang.org/grpc"
  9. "google.golang.org/grpc/credentials/insecure"
  10. healthpb "google.golang.org/grpc/health/grpc_health_v1"
  11. )
  12. const (
  13. address = "localhost:20000"
  14. )
  15. func main() {
  16. // Set up a connection to the server
  17. conn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials()))
  18. if err != nil {
  19. log.Fatalf("did not connect: %v", err)
  20. }
  21. defer func() {
  22. _ = conn.Close()
  23. }()
  24. checkHealth("org.apache.dubbogo.samples.api.Greeter", conn)
  25. }
  26. func checkHealth(service string, conn *grpc.ClientConn) {
  27. fmt.Printf(">>>>> gRPC-go check %s status", service)
  28. req := &healthpb.HealthCheckRequest{
  29. Service: service,
  30. }
  31. ctx := context.Background()
  32. rsp, err := healthpb.NewHealthClient(conn).Check(ctx, req)
  33. if err != nil {
  34. panic(err)
  35. }
  36. fmt.Printf("get service status = %+v\n", rsp)
  37. }

2.2 grpc-health-probe调试健康检查服务:

  • 启动dubbo-go-samples中的triple服务,提供org.apache.dubbogo.samples.api.Greeter服务。使用grpc-health-probe检查该服务的健康状态,grpc-health-probe -addr=localhost:20000 -service "org.apache.dubbogo.samples.api.Greeter"

image-health-check

参考:

最后修改 December 16, 2022: Fix check (#1736) (97972c1)