runtime.WithHealthzEndpoint()
是 gRPC Gateway 提供的一个选项,可以用于自定义健康检查端点的路径和响应内容。
这个选项需要传入两个参数:
path
:健康检查端点的路径,默认为 “/healthz”。handler
:健康检查处理函数,返回一个http.Handler
。
例如,我们想要将健康检查端点路径改为 “/my-healthz”,并且返回自定义的响应内容,可以这样写:
mux := runtime.NewServeMux(
// 自定义健康检查端点
runtime.WithHealthzEndpoint("/my-healthz", func() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("custom health check response"))
})
}),
)
if err := myservice.RegisterMyServiceHandlerFromEndpoint(ctx, mux, endpoint, opts); err != nil {
log.Fatalf("failed to register handler: %v", err)
}
log.Printf("starting HTTP server at %s", addr)
if err := http.ListenAndServe(addr, mux); err != nil {
log.Fatalf("failed to serve: %v", err)
}
在上面的代码中,我们使用 runtime.NewServeMux()
创建了一个 ServeMux 实例,并使用 runtime.WithHealthzEndpoint()
方法来覆盖默认的健康检查端点。我们传入了 “/my-healthz” 作为新的路径,并实现了一个匿名函数来处理该端点的请求。在该函数内部,我们直接向客户端返回了自定义的响应内容。
注意,在自定义健康检查端点时,我们需要确保返回的 HTTP 状态码是 200 OK。如果返回其他状态码,gRPC Gateway 将会认为服务不健康,并将该状态码传递给 Kubernetes 或 Istio 等服务管理平台,可能会导致服务被重启或重新部署等操作。