基于 Grpc 的健康检查
1. Grpc 健康检查
Grpc 健康检查是通过一个普通的用户 rpc 调用来实现的。 Grpc 健康检查定义了以下 protobuf,以便实现所有 Grpc 协议健康检查的互通。
首先,因为它本身就是一个 GRPC 服务,所以进行健康检查的格式与普通的 rpc 相同。其次,它具有丰富的语义,例如每个服务的健康状态。第三,作为 GRPC 服务,它能够重用所有现有的计费、配额基础设施等,因此服务器可以完全控制对健康检查服务的访问。
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; // Used only by the Watch method.
}
ServingStatus status = 1;
}
service Health {
rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
}
2 三重健康检查服务
- Dubbo-go 框架会在启动后自动向框架注册健康检查服务,并基于 grpc health proto 提供健康检查服务,无需在配置文件中进行额外配置。
- 三重健康检查服务可以通过 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”的状态。三重健康检查服务与 grpc 通信,因此可以通过 grpc 客户端检查基于三重协议的服务的健康状态。
package main
import (
"context"
"fmt"
"log"
)
import (
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
healthpb "google.golang.org/grpc/health/grpc_health_v1"
)
const (
address = "localhost:20000"
)
func main() {
// Set up a connection to the server
conn, err := grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer func() {
_ = conn.Close()
}()
checkHealth("org.apache.dubbogo.samples.api.Greeter", conn)
}
func checkHealth(service string, conn *grpc.ClientConn) {
fmt.Printf(">>>>> gRPC-go check %s status", service)
req := &healthpb.HealthCheckRequest{
Service: service,
}
ctx := context. Background()
rsp, err := healthpb. NewHealthClient(conn). Check(ctx, req)
if err != nil {
panic(err)
}
fmt.Printf("get service status = %+v\n", rsp)
}
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"
参考
- https://github.com/grpc/grpc/blob/master/doc/health-checking.md
- https://github.com/grpc/grpc-go/tree/master/health
上次修改时间:2024 年 1 月 17 日:修复损坏的链接 (6651e217e73)