| # Health |
| |
| gRPC provides a health library to communicate a system's health to their |
| clients. It works by providing a service definition via the |
| [health/v1](https://github.com/grpc/grpc-proto/blob/master/grpc/health/v1/health.proto) |
| api. |
| |
| Clients use the health library to gracefully avoid servers that encounter |
| issues. Most languages provide an out-of-box implementation, which makes it |
| interoperable between systems. |
| |
| ## Try it |
| |
| ``` |
| go run server/main.go -port=50051 -sleep=5s |
| go run server/main.go -port=50052 -sleep=10s |
| ``` |
| |
| ``` |
| go run client/main.go |
| ``` |
| |
| ## Explanation |
| |
| ### Client |
| |
| Clients have two ways to monitor a server's health. They use `Check()` to probe |
| a server's health or `Watch()` to observe changes. |
| |
| In most cases, clients do not directly check backend servers. Instead, they do |
| this transparently when you specify a `healthCheckConfig` in the [service |
| config](https://github.com/grpc/proposal/blob/master/A17-client-side-health-checking.md#service-config-changes) |
| and import the [health |
| package](https://pkg.go.dev/google.golang.org/grpc/health). The `serviceName` in |
| `healthCheckConfig` is used in the health check when connections are |
| established. An empty string (`""`) typically indicates the overall health of a |
| server. |
| |
| ```go |
| // import grpc/health to enable transparent client side checking |
| import _ "google.golang.org/grpc/health" |
| |
| serviceConfig := grpc.WithDefaultServiceConfig(`{ |
| "loadBalancingPolicy": "round_robin", |
| "healthCheckConfig": { |
| "serviceName": "" |
| } |
| }`) |
| |
| conn, err := grpc.NewClient(..., serviceConfig) |
| ``` |
| |
| See [A17 - Client-Side Health |
| Checking](https://github.com/grpc/proposal/blob/master/A17-client-side-health-checking.md) |
| for more details. |
| |
| ### Server |
| |
| Servers control their serving status. They do this by inspecting dependent |
| systems, then update their status accordingly. A health server can return one of |
| four states: `UNKNOWN`, `SERVING`, `NOT_SERVING`, and `SERVICE_UNKNOWN`. |
| |
| `UNKNOWN` indicates the system does not yet know the current state. Servers |
| often show this state at startup. |
| |
| `SERVING` means that the system is healthy and ready to service requests. |
| Conversely, `NOT_SERVING` indicates the system is unable to service requests at |
| the time. |
| |
| `SERVICE_UNKNOWN` communicates the `serviceName` requested by the client is not |
| known by the server. This status is only reported by the `Watch()` call. |
| |
| A server may toggle its health using |
| `healthServer.SetServingStatus("serviceName", servingStatus)`. |