布団の中にいたい

Elasticsearchいじったり、Androidアプリ書いたり。最近は数学の勉強が楽しくなってきました。

grpc-goを使った際のヘルスチェック

grpcを使ったアプリケーションを作る時にヘルスチェックをどうしようかと思って色々調べたのでメモ。

grpcでヘルスチェックを行う場合、公式にかかれているGRPC Health Checking Protocolを使うと良さそうです。

https://github.com/grpc/grpc/blob/master/doc/health-checking.md

上記のページで記載されているヘルスチェック用のサービス定義自体は非常にシンプルでリクエストを送ると、サーバーのステータスを返すだけのものになっています。

自身でこのサービスを定義して利用してもいいのですが、grpc-go自体にヘルスチェック用のサービスから吐き出されたファイルを含んでいるのでそちらを使うだけで問題ありませんでした。

簡単に使うと以下のような感じ。

import (
    health "google.golang.org/grpc/health"
    healthpb "google.golang.org/grpc/health/grpc_health_v1"
)

func main() {
    listenPort, err := net.Listen("tcp", ":20001")
    if err != nil {
        log.Fatalln(err)
    }
    server := grpc.NewServer()

    healthpb.RegisterCatServer(server, health.NewServer())
    reflection.Register(server)
    
    if err := server.Serve(listenPort); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

加えてGRPC Health Checking Protocolに従うことで、grpc-ecosystemにあるgrpc_health_probeを使うことができます。

https://github.com/grpc-ecosystem/grpc-health-probe

このコマンド自体もgoで書かれており、内部でgrpc-goのhealth.pb.goを読み出して利用しています。

grpc_health_probeをサービスのヘルスチェックの中に組み込めば完了です。