Chapter 01

はじめに

さき(H.Saki)
さき(H.Saki)
2022.06.19に更新

この本について

ウェブAPIのアーキテクチャとして、多くの人が真っ先に思い浮かべるのはREST APIだと思います。
URLのパスで対象のオブジェクトを、メソッドでそのオブジェクトへの操作を表現するというRESTのやり方はHTTP通信の概念と密接に関連しており、それゆえどのようにリクエストを送り、レスポンスを受け取ればいいのかが直感的かつ理解しやすいものとなっています。

それに対してgRPCは概念自体が抽象的で、実際にどのような通信なのかをパッとイメージするのは難しいのではないかと思います。
この本では、gRPCを全く知らないという状態から、gRPCで動くサーバーを動かすのに必要になる知識をまとめました。

本の構成

基礎編

gRPCを実装するにあたり、最低限ここは理解が必要というポイントをまとめてあります。

2章 RPCの具現化であるgRPC

そもそもgRPCとはどのような考え方で作られた通信方式なのかを学んだ上で、それを実現させるためにどのような技術が使われたのかを紹介します。

3章 protoファイルでProcedureを定義する

gRPCにはメソッドというものが用意されており、その「メソッドを呼び出す」という形で通信が行われます。
この章ではメソッドの形を定義するためのprotoファイルの書き方を簡単に触れておきます。

4章 protoファイルからコードを自動生成する

protoファイルで「gRPCでどのようなメソッドを呼び出したいか」が定義されたので、そこから実際にそのような通信をするためのGoのコードを作っていきます。
そしてprotoファイルからはgRPCクライアント/サーバー内で使うコードを自動生成させることができるのです。
この章ではそのコード自動生成のやり方を学びます。

5章 gRPCサーバーを動かしてみよう

protoファイルから自動生成されたコードを使って、簡単なgRPCサーバーを実装します。

6章 gRPCクライアントを動かしてみよう

protocコマンドから作られたコードで作れるのは、サーバーだけではありません。
今度はgRPCクライアントを実装し、5章で作ったサーバーにリクエストを送ってみます。

7章 gRPCで実現できるストリーミング処理

gRPCは「1リクエスト-1レスポンス」の通信だけではなく、リクエストとレスポンスがN:Mのストリーミングも行うことができます。
ここでは、gRPCが扱うストリームの種類について説明した後、それをHTTP/2を使ってどのように実現しているのかについて簡潔に触れたいと思います。

8章 サーバーストリーミングの実装

この章では、サーバーストリーミングRPCのコードをサーバー側・クライアント側ともに実装して動かしてみます。

9章 クライアントストリーミングの実装

ここでは、クライアントストリーミングRPCを実装し動かします。

10章 双方向ストリーミングの実装

ここでは、gRPCが行うことができる3つ目のストリーミング処理、双方向ストリーミングを実装して動かします。

応用編

ここからは「これを知っているとちょっとレベルの高いことができる」というAdditionalな内容をまとめてあります。

11章 gRPCにおけるステータスコード

HTTPレスポンスステータスコードのように、gRPCでもサーバー内での処理の成功・失敗を表すための独自ステータスコードが存在します。
この章では、エラーが起きたときに適切なステータスコードを使用してレスポンスを返すためにはどうしたらいいかを説明します。

12章 インターセプタの導入 - サーバーサイド編

通常のHTTPサーバーでは、ハンドラの処理前後に別の処理を差し込むのはミドルウェアの役割です。
そして、gRPCで同じ役割を果たすのはインターセプタと呼ばれています。
この章では、gRPCサーバーに導入するインターセプタを作成し導入するやり方を紹介します。

13章 インターセプタの導入 - クライアントサイド編

gRPCにおいて、インターセプタというのは何もサーバーサイドだけのものではありません。
クライアントがリクエストを送信・レスポンスを受信するときに前後処理を挟むものもインターセプタと呼ばれています。
ここではクライアントサイドのインターセプタを作成・導入する方法を説明します。

14章 メタデータの送受信

メッセージデータ以外にも、認証情報やContent-Type、クライアントの種類などメタデータを送りたいという時があるかと思います。
ここでは、gRPCでメタデータの送受信をどう実装するかについて見ていきます。

15章 gRPCとGoの並行処理

gRPCのサーバー・クライアントコードを書くにあたって、どのような処理がゴールーチンセーフなのかをまとめて紹介します。

デプロイ編

ここからは、gRPCサーバーをAWSにデプロイして動かすときに必要になる知識をまとめてあります。

16章 gRPCサーバーをAWS上で動かす

せっかく作ったgRPCサーバーなのですから、ローカルだけではなくて実環境上でも動かしてみたいはずです。
この章では、AWSのECS/EKSでgRPCコンテナをデプロイする手順について簡単に紹介します。

17章 gRPCコンテナにヘルスチェックを実行する

せっかくクラウド上にgRPCサーバーをデプロイできたのですから、クラウドの便利機能を上手く活かした運用がしたいと思うはずです。
ここでは、ECSでのヘルスチェック機能を使うために必要になるgRPCサーバー・AWSでの設定を説明します。

使用する環境・バージョン

  • OS: macOS Catalina 10.15.7
  • go version go1.18 darwin/amd64

読者に要求する前提知識

  • Goの基本的な文法の読み書きができること
  • HTTP通信の基礎を理解していること
    (リクエストメソッド・パス・レスポンスコードなど)

また、デプロイ編を読む方々には追加で以下の知識を前提とします。

  • ECS/EKSを動かす上での基礎知識があること
    (VPC, ALB, タスク定義, k8sのリソースなど)
  • (任意)Terraformのコードを見てなんとなく設定の意味が推察できること