本記事では、gRPCについて体系的に取り上げ、開発方法や運用方法を書いていこうと思います。私はgRPCは使ったことも、運用したこともあります。同じRPCにを実現する方法としてJSONRPCというプロトコルがあります。一年くらい前に取り上げた記事です。よかったら見てみてください。www.1915keke.comまた、今回の使用言語はGolangです。LBに注意して運用するという例も参考文献gRPCについてgRPCとはgRPCとはHTTP2上でRPCを実現するオープンソースな普遍的なフレームワークのことですRPCとはRPCとはRESTfulのようにルーティングや、クエリストリングを正しく指定しないいけないわけではなくて、関数を直接呼び出しているようにサーバー間通信を実現するものです。JSONPRC2.0だと以下のようなJSONをルートURLに送れば使うことができます。3}"このようにURLなどを意識せずに外部の関数を実行できるわけです。これはクライアント内のexexMethod(param)のように、ローカルで関数を呼び出すように簡単に外部メソッドを呼び出せるので、従来のようにhttpリクエストを何行か書いて実装して、unMarshalして......みたいなことはなくなり、すっきりします。サービス定義ほとんどのRPCシステムのようにgRPCはパラメータと戻り値を定義することで呼び出せるようになっている。いくつかの定義方法がある。HTTP1のようにリクエストを送って、サーバーがレスポンスを返す形だと以下のようになる。HelloResponse){}クライアントがストリームで処理を送って、サーバーがそれを待ってストリームが終わると読み込んでレスポンスを返すものは以下のものである。{}今後は双方向バインディングである。それぞれは独立に動作し、順序関係なくクライアントもサーバーも読み書きができる。特徴としては以下のような項目があります。Buffersとおなじスキーマを定義するものですが、少し詳しい記事が以下の通りです。www.1915keke.com特にRESTfulなサーバーだとAPIエンドポイントやパラメーターのドキュメント化はないがしらにされがちで、運用としてもコストがかかります。Buffersはあらかじめ定義しなければならないので運用が楽になります。コードは.protoファイルから生成する(generate)することになります。.protoは以下のようになっています。Bufferコンパイラprotocでコンパイルして、特定の言語のデータアクセスできるコードを生成します。1;}とすれば描くことはできます。Bufferのドキュメントには直接書いてないかもしれません。Serviceとは、簡単にいうとクライアントとサーバーが通信するプロトコルをひとまとまりです。messageとはリクエストとレスポンスの中身です。いろんな言語とプラットフォームで使える執筆時には、よく使う言語では実装が終わっていたので、簡単に導入できました。対応言語は以下の通りです。一行でランタイムや開発環境をインストールしてRPCをすぐ使い倒せます。双方向ストリームと統合的な認証gRPCはHTTP2を使っているので双方向のやりとりができます。v3をインストール以下のリンクでReleaseをダウンロードしてください。github.comそれかcurlでインストールしてください。そのあとに解凍します。PATH=$PATH:$GOPATH/bin次にprotocをインストールします。protobufまた、go用のprotocプラグインをインストールします。github.com/golang/protobuf/protoc-gen-goそしてコンパイルして雛形を作ります。fileである.protoを指定して、go_outでpluginsにgrpc渡して.ディレクトリに出力しています。ドキュメントも同時に作成できます。以下のように実装しました。server.Serve(listenPort)}.pb.goにあるinterfaceを実装するだけなのでserviceは解説しません。grpc.NewServerでサーバーをインスタンスを作って、server.serve(listenport)でサーバーを起動します。ここでserviceはpb.RegisterXXServiceでserverとserviceを渡して登録します。Client側まず以下のように実装します。err)}ここから少し解説します。grpc.WithInsecure())によって、まずコネクションを確立します。次にクライアントをインスタンス化します。pb.NewXXClient(conn)これはDIパターンですね。アプリケーションそれぞれですが、Serviceにおくるデータの構造体を初期化します。&pb.GetXXXMessage{"hogd"}そして呼び出します。message実行サーバーとクライアントそれぞれ実行します。client.goすると以下のように返ってきました。rpcの引数と戻り値で定義される。Serverの実装Server側のコードは以下のような手順を踏まないといけません。Service構造体を作るinterfaceに準拠するためにレスポンスを受け取ってリプライを返すにするサーバー自体はserverを作って、Service構造体を登録しサーバーを起動する印象としてはサーバー中身のロジックを書いて起動するだけだけです。ClientClient側は以下の手順を踏まないといけません。接続を確立してクライアントを作成しメソッドを叩く印象としてはただpbでclientを作成後、clientメソッドを叩くだけです。感じたポイントは以下の通りです。Buffer)を書くため、ドキュメントやスキーマが古い、メンテされてない状況が生まれないので良い。middlewareがコミュニティのおかげで増えてる。CNCFに採択されていることから将来性も高いHTTP2を勝手にやってくれるので機能実装に集中でき、開発コストが抑えられるパフォーマンスがいい。エンコード・デコード処理も早くなり、データ量も小さくなる。ベストプラクティスとして感じたことは以下の通りです。Repoにモジュールわけして、特定のアプリケーションでメンテするのを防ぐ。Dataフィールド番号バイナリフォーマットでどれがどのフィールドに一致をするかを指定するユニークな番号である。これによってスキーマが変更されても、耐えることができる。番号は一位であればいくらでもいいのだが、1~15までは1バイトで16~1024は2バイトである。JSONPRCではクライアントはサーバーが要求する順番にパラメーターを渡さないといけなかった。1;}サービスとメソッド名どちらもキャメルケースをつかうべき。Buffersのためにいくつかプラグインを提供しているので使うにはimportする。2;}KubernetesとgRPC相性HTTP2は一度コネクションを確立すると、永続化をするため特定のPodと接続すると仮に新しいPodが作成されたとしてもそのPodにはリクエストを送らない仕様になっている。LBでサービスを構築しているのならばgRPCでは全くスケールしない。Balancer(LB)との相性が悪く、LBが提供するのはL4のロードバランシングである。それに対してL7のロードバランシングが必要です。L4のロードバランシングはIPアドレスによるもので、L7によるロードバランシングはURLやHTTPヘッダーなどによるロードバランシング方法です。ここで登場するのがIstioで使われているEnvoyかLinkerdで使われているProxyである。Patternである。Uber製のEnvoyがデフォルトスタンダートになっているらしい。以下のようにProxy(HTTP2が使えるようなもの)とClientをgRPCで接続して、バックエンドの負荷分散をする仕組みである。これはIstioを使うことで簡単に設定できる。www.1915keke.com詳しくは以下の記事をご覧ください。Balancing)あらかじめいろんなサーバーと接続を確立して、どれかに実行することによって分散をする仕組みである。Serviceを使うことで解決できるらしいです。これがやっているのは定期的にDNSに問い合わせて、PodのIPアドレスを取得しているものです。grpc.WithBalancer(balancer))ここでNewDNSResolverWithFreqはデフォルト値は30minなのでPodがAutoscaleする間隔に設定するのがいいでしょう。クライアントがシンプルでバックエンドを知らなくて済む。アプリケーションを書き換えなくていい。データの流れの中にProxyが入ってくる。パフォーマンスがいい。クライアントが複雑になり、クライアントがヘルスチェックなどをしないといけない。LBが良いと思います。LBに注意して運用するという例もたとえばPodはスケールしないようにすることもできます。alpha版ではありますがKuberenetesにはVerticalPodAutoScaleというものがあるのでそれを適用してスケールアップしてもいいかもしれません。Kubernetesのいろは。2018の14日目の...2018-12-23Concourseで継続的デリバリー。2018の第3日目の記事です。»プロフィール学生エンジニア。忘れてしまうので備忘録です。flaskでServerlessにホストするTelepresence概論スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。