<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Protocol Buffers on Go言語用ポストイット</title><link>https://go.genzouw.com/category/protocol-buffers/</link><description>Recent content in Protocol Buffers on Go言語用ポストイット</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Sat, 19 Jun 2021 06:46:55 +0900</lastBuildDate><atom:link href="https://go.genzouw.com/category/protocol-buffers/index.xml" rel="self" type="application/rss+xml"/><item><title>gRPC の概要を掴むために、特徴、アーキテクチャ、ライフサイクルを理解する</title><link>https://go.genzouw.com/2021/05/26/post-244/</link><pubDate>Wed, 26 May 2021 07:53:15 +0900</pubDate><guid>https://go.genzouw.com/2021/05/26/post-244/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;gRPC の概要を掴むために、特徴、アーキテクチャ、ライフサイクルについて理解した内容を整理しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;gRPC&lt;/strong&gt; ってそもそもなに？という方は&lt;a href="https://go.genzouw.com/2021/05/19/post-240/"&gt;前回のエントリ&lt;/a&gt;を読んで頂くと理解が深まると思います。&lt;/p&gt;&#10;&lt;h2 id="grpc-を使いためにはサービス定義が必要"&gt;gRPC を使いためには「サービス定義」が必要&lt;/h2&gt;&#10;&lt;p&gt;多くの RPC システムと同じように、 &lt;strong&gt;gRPC&lt;/strong&gt; も &lt;strong&gt;「サービスを定義」&lt;/strong&gt; するという思想に基づいています。&#10;&lt;strong&gt;サービス&lt;/strong&gt; は &lt;strong&gt;メソッド&lt;/strong&gt; を所有しています。&#10;&lt;strong&gt;メソッド&lt;/strong&gt; はリモートから呼び出されることを想定していて、1 つ以上のパラメータを受け取り、1 つ以上の値を返却します。&lt;/p&gt;&#10;&lt;p&gt;「サービス定義」の構成要素を視覚化すると以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; サービス X&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; メソッド A&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; パラメータ(インプットとなるメッセージ)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; 戻り値(アウトプットとなるメッセージ)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; メソッド B&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; メソッド C&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; サービス Y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; サービス C&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;gRPC&lt;/strong&gt; では &lt;strong&gt;インターフェイス定義言語(IDL)&lt;/strong&gt; として &lt;strong&gt;Protocol Buffers&lt;/strong&gt; を利用します。&#10;&lt;strong&gt;IDL&lt;/strong&gt; を使って、「サービス」のメソッドインターフェイスと、サービスメソッドのパラメータや戻り値となる「メッセージ」のデータ構造を定義します。&lt;/p&gt;</description></item><item><title>gRPCの概要を理解し `proto` ファイルから `protoc` でコードを生成してみる</title><link>https://go.genzouw.com/2021/05/19/post-240/</link><pubDate>Wed, 19 May 2021 19:19:49 +0900</pubDate><guid>https://go.genzouw.com/2021/05/19/post-240/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ここ2ヶ月、時間を見つけてはGo言語を学んでいきました。&#10;素人ながら簡単なロジックならなんとか組めるようになってきました。（ 組み込みライブラリの使い方はまだまだですが。 ）&lt;/p&gt;&#10;&lt;p&gt;そして、ようやくここまで来ました。&#10;Go言語を学習し始めたのも、 &lt;strong&gt;gRPC&lt;/strong&gt; を習得したかったからと言っても過言では有りません。&lt;/p&gt;&#10;&lt;p&gt;まずは概要を学んだので、その内容をエントリにまとめておきます。&#10;また、 &lt;code&gt;proto&lt;/code&gt; ファイルという定義ファイルを作成し、 &lt;code&gt;protoc&lt;/code&gt; というコマンドを使って定義ファイルからクライアントコード、サーバコードを生成してみました。&lt;/p&gt;&#10;&lt;h2 id="grpc-って"&gt;gRPC って？&lt;/h2&gt;&#10;&lt;p&gt;gRPCの特徴を列挙してみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Remote Procedure Call ( RPC )&lt;/strong&gt; のひとつ&lt;/li&gt;&#10;&lt;li&gt;近年開発されたオープンソースの &lt;strong&gt;フレームワーク&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;多くの環境で実行可能&lt;/li&gt;&#10;&lt;li&gt;負荷分散、トレーシング、ヘルスチェックなどの機能にも対応可能な仕組み&lt;/li&gt;&#10;&lt;li&gt;通信効率が良い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;その他に以下のような特徴もあります。 ( 公式ページを参照したものなので、抽象度が高くあまりピンと来ません。 )&lt;/p&gt;&#10;&lt;h3 id="サービス定義が簡単"&gt;サービス定義が簡単&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Protocol Buffers&lt;/strong&gt; を使ってサービスを定義できます。&#10;通信はシリアライズされたバイナリデータに変換されるため、転送効率が良いです。&lt;/p&gt;&#10;&lt;h3 id="すぐに始められてかつスケーラビリティに優れている"&gt;すぐに始められて、かつスケーラビリティに優れている&lt;/h3&gt;&#10;&lt;p&gt;ランタイムと開発環境を 1 行でインストールできます。&#10;それにも関わらず、1 秒間に 100 万回の RPC リクエストを処理可能なスケーラビリティを持っています。&lt;/p&gt;&#10;&lt;h3 id="さまざまな言語と実行環境に対応"&gt;さまざまな言語と実行環境に対応&lt;/h3&gt;&#10;&lt;p&gt;さまざまな言語と実行環境に対応しています。&#10;適切な「クライアント」と「サーバ」のスタブコードを自動生成できます。&lt;/p&gt;&#10;&lt;h3 id="双方向ストリーミングと統合認証"&gt;双方向ストリーミングと統合認証&lt;/h3&gt;&#10;&lt;p&gt;「双方向ストリーミング」と「統合認証」の機能が組み込まれています。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="grpc-はprotocol-buffers-をどのように利用している"&gt;gRPC は　&amp;ldquo;Protocol Buffers&amp;rdquo; をどのように利用している？&lt;/h2&gt;&#10;&lt;p&gt;もう少しだけ具体的な話に掘り下げてみたいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;gRPC&lt;/strong&gt; は、 &lt;strong&gt;Protocol Buffers&lt;/strong&gt; という技術を利用してます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Protocol Buffers&lt;/strong&gt; は、 &lt;strong&gt;gRPC&lt;/strong&gt; の中で大きく 2 つの目的で利用されています。&lt;/p&gt;</description></item></channel></rss>