ローカルSNSで使っている【MicroとgRPC】

  1. ローカルSNSで使っており、便利な技術です。

  2. Go-Microは、基盤となるプラットフォームがそれらを記述するために必要なプリミティブを定義し、外部の手段からアクセスするために必要なプリミティブを定義する理由である、このサービス開発モデルを念頭に置いて構築されています。Micro には、高速での使用が非常に簡単になる Go サービス フレームワークが含まれています。 本システムを構成するために使われており、カスタマイズに必要なアプリケーションについて説明します。全体は、microサービスで構成されており、gRPCアプリケーションの各サービスと技術について説明します。

  3. クラウドサービスの定義は、次のTwilioまたはStripeを構築するのに役立つものと考えています。クラウドサービスは、APIとして完全に消費されるように構築されたもののようにますます見ています。だから、マイクロは、そのモデルを念頭に置いて構築します。バックエンドにマイクロサービスを記述し、フロントエンドの単一の API としてそれらをつなぎ合わせます。 マイクロは、HTTP/JSON 要求を外部で処理し、バックエンド用に gRPC に変換する API ゲートウェイを提供します。これにより、バックエンドで効率的にパフォーマンスの高いサービスを構築し、相互に切り離されるが、消費者に単一のビューを提示するエクスペリエンスが大幅に簡素化されます。

  4. Microは、マルチ環境モデルに存在するだけでなく、最初にリモートモデルに存在するという知識を持って構築されました。そのため、CLI とローカル サービスの gRPC ID プロキシを構築し、任意の Micro サーバーにリモートで安全に接続し、認証サービスに格納されている資格情報を使用してそれらのサービスとリソースにアクセスできるようにします。 サービスはクラウドの第 1 時代に合わせて構築されているだけでなく、サービスへのアクセスもそのようにしていると考えることができます。

  5. M30 - M3OMicroを搭載した次世代クラウドプラットフォームです。10 倍の開発者エクスペリエンスを実現するために、1 つのプラットフォーム上で、より簡単なプログラム可能なビルディング ブロックとして、無料で有料の公開 API を探索、発見、消費します。

  6. プログラム可能な実世界マイクロサービスのレシピ - マイクロサービスは、あらゆる製品、アプリ、サービスの基本的な構成要素を提供します。これらは、単独で使用することも、組み合わせて強力な分散システムを作成することもできます。サービスは、RPC を使用して相互に使用され、Micro API を介して外部の世界から使用されることを意図しています。

  7. 参考資料

  • Go Micro - Go Microは分散システム開発のフレームワークです
  • Micro Services - プログラム可能な実世界マイクロサービス
  • Micro - マイクロは分散型クラウドオペレーティングシステムです。
  • Micro Document - マイクロへの高レベルの説明
  • M30 Micro Platform -
  • Next Generation Cloud - 10 倍の開発者エクスペリエンスを実現するために、単純なプログラム可能なビルディング ブロックとしてパブリック API を 1 つのプラットフォームで探索、検出、使用します。

マイクロサービスフレームワークGo-Microを使う前にgRPCが必要になりますので、gRPCからGo-Microと進みます。

1. gRPC

1-1. RPC 概説

RPC(Remote Procedure Call) はその名の通り外部のプログラムが提供する Procedure を呼び出す仕組みです。 各言語の普通の関数(stub 関数)を呼び出すとライブラリがネットワーク通信して外部で動作しているサーバーにリクエストを投げ、結果を受け取って関数の戻り値として返すのが普通です。

このような仕組みであるため、RPC の利用者視点ではネットワークや他の言語の知識を必要とすることなく、ただの関数として利用できます。

異なる言語間で RPC として呼び出せる関数を定義する場合、特定の言語に依らない独立の定義方法が必要になります。 一般に、RPC の関数やその引数を定義する言語を [Interface Description Language (IDL)][IDL] と言います。

IDL にはコンパイラが付属し、サポートしている言語用に関数呼び出しのためのコードを自動生成します。 例えばクライアントが Python でサーバーが Go の場合、Python の文字列リストをネットワークで送れるようバイト列に serialize し、Go では受け取ったバイト列を deserialize して Go の文字列スライスにしないといけません。 IDL コンパイラはこのような serialize / deserialize コードを生成してくれます。

1-2. gRPC の特徴

gRPC は RPC の実装の一つで、以下の特徴があります。

  • IDL として仕様が小さく拡張性の高い Protocol Buffers を採用

    つまり学習コストが低いということです。

  • 通信プロトコルとして HTTP/2 を採用

    HTTP/2 のフレームを使って独自のプロトコルを構築しているため、HTTP/1 とは互換性がありません。 そのため、例えば HTTP/2 を受け付けるリバースプロキシが、バックエンドには HTTP/1 でしか接続できない場合、gRPC のリバースプロキシはできません。 詳しいことは [gRPC over HTTP2][http2] を読んでください。

  • 単純な関数呼び出しに加え、ストリーム処理を提供

    ストリームとは、不定長の連続したデータです。 gRPC では単純なリクエスト・レスポンス形式(Unary RPC)以外に、サーバーから不定長のメッセージを受け取るモード、クライアントから不定長のメッセージを受け取るモード、そして双方向にメッセージを送り続けるモードがあります。

  • リクエストチェーン全体に渡るタイムアウトやキャンセルをプロトコルレベルでサポート

    タイムアウトやキャンセルが gRPC のプロトコルとしてサポートされているため、各言語の実装で簡単に実装できるようになっています。 これは、複数のマイクロサービスを跨いでいるリクエストを制御するのにとても強力な仕組みです。

1-3. 参考資料

  • 公式資料
    • [grpc.io][]: gRPC の公式サイトです。仕様だけでなく、各言語のチュートリアルもあります。
    • [grpc.github.io][]: 詳細なドキュメント群です。
    • [gRPC over HTTP2][http2]: 上記サイトの一ドキュメントです。HTTP/2 をどう利用しているかの仕様書です。
    • [developers.google.com/protocol-buffers][]: Protocol Buffers の公式サイトです。
  • チュートリアル・本
    • [The complete gRPC course][course]: ステップバイステップ形式で進むチュートリアルです。非常に良い。
    • [gRPC: Up and Running][book]: gRPC と Protocol Buffers の本です。これを読めば十分だったりします。
    • [Securing your gRPCApplication][secure]: KubeCon 2019 NA のセッションの一つで、gRPC の認証・認可の実装方法を詳しく解説しています。

1-4.通信の種類

バックエンドでmicroサービス間の通信を行う規格。

  1. 普通の通信:(1:1)
  2. サーバーストリーミング:(1:n)Push通信などで使われる。1回のリクエストで返信を続けるときなど。
  3. クライアントストリーミング:(n:1)クライアントからファイルアップロードするときなどに使う。
  4. 双方向ストリーミング:(n:n)チャット、ゲーム:gRPCだけが実装できる。

1-5. 手順

マイクロベークの概念とマルチテナンシーを介して.開発用にローカルでサーバーを実行し、ステージングと運用用のクラウドでサーバーを実行し、CLI コマンドと を使用してサーバー間をシームレスに切り替えます。Environments Namespaces micro env set [environment] micro user set [namespace]

  1. .protoファイルを作る

  2. コードを自動生成

  3. ロジックを追加

  4. クラウドサービス クラウドサービスの定義は、次のTwilioまたはStripeを構築するのに役立つものと考えています。クラウドサービスは、APIとして完全に消費されるように構築されたもののようにますます見ています。だから、マイクロは、そのモデルを念頭に置いて構築します。バックエンドにマイクロサービスを記述し、フロントエンドの単一の API としてそれらをつなぎ合わせます。 マイクロは、HTTP/JSON 要求を外部で処理し、バックエンド用に gRPC に変換する API ゲートウェイを提供します。これにより、バックエンドで効率的にパフォーマンスの高いサービスを構築し、相互に切り離されるが、消費者に単一のビューを提示するエクスペリエンスが大幅に簡素化されます。

  5. リモートファースト Microは、マルチ環境モデルに存在するだけでなく、最初にリモートモデルに存在するという知識を持って構築されました。そのため、CLI とローカル サービスの gRPC ID プロキシを構築し、任意の Micro サーバーにリモートで安全に接続し、認証サービスに格納されている資格情報を使用してそれらのサービスとリソースにアクセスできるようにします。 サービスはクラウドの第 1 時代に合わせて構築されているだけでなく、サービスへのアクセスもそのようにしていると考えることができます。

  6. マイクロサービス マイクロサービスは、あらゆる製品、アプリ、サービスの基本的な構成要素を提供します。これらは、単独で使用することも、組み合わせて強力な分散システムを作成することもできます。サービスは、RPC を使用して相互に使用され、マイクロ API を介して外部の世界から使用されることを意図しています。

  7. マイクロサービスのツールキットとして、各サーバ/サービスツールをそれぞれ分割して別々にパッケージされたもの。中核となるgo-micro、Webサービスを展開するためのgo-web、モニタリングツールのmonitor-web、サービスをトレースするためのtrace-web など、マイクロサービスを構築および運用するためのパッケージが揃っている。

2.分散システム開発のフレームワークGo-Micro

2-1. 概要

Go-Micro は、RPC およびイベント駆動型通信を含む分散システム開発の中核的な要件を提供します。Go-Microの考え方は、デフォルトでプラグ可能なアーキテクチャを持っています。

2-2. 機能

Go-Microは分散システムの詳細を抽象化します。主な機能を次に示します。

  1. API - パスベースの解決を使用して HTTP/json リクエストを RPC に動的にマップする HTTPゲートウェイ

  2. 認証 - jwt トークンとルールベースのアクセス制御を使用した認証と認証を使用します。

  3. ブローカー - 非同期通信と通知の配布のための一時 pubsub メッセージング

  4. Config - サービス レベル構成の動的構成とシークレット管理を再起動する必要はありません。

  5. イベント - 順序付きメッセージングによるイベントストリーミング、オフセットからの再生、永続ストレージ

  6. ネットワーク - すべての内部要求トラフィックに対するサービス間ネットワーキング、分離、およびルーティングプレーン

  7. プロキシ - リモート アクセスと外部 grpc 要求トラフィックに使用される ID 対応プロキシ

  8. ランタイム - 自動ビルドの実行ソースをサポートするサービスライフサイクルとプロセス管理

  9. レジストリ - 機能豊富なメタデータを使用した、集中型サービス検索および API エンドポイント エクスプローラー

  10. ストア - TTL の有効期限と永続的な crud を使用したキーバリュー ストレージにより、マイクロサービスをステートレスに保ちます。

  11. 認証 - 認証は、ファーストクラスの技術として組み込まれています。認証と承認により、すべてのサービスに ID と証明書を提供することで、セキュリティで保護されたゼロ信頼ネットワークを実現できます。これには、ルール ベースのアクセス制御も含まれます。

  12. 動的構成 - 任意の場所から動的構成をロードし、ホット リロードします。config インターフェイスは env vars やファイルなど、あらゆるソースからアプリケーション レベルの設定をロードする方法を提供します。ソースをマージし、フォールバックを定義することもできます。

  13. データストレージ - レコードの読み取り、書き込み、および削除を行うシンプルなデータストア インターフェイス。メモリ、ファイル、CockroachDBのサポートがデフォルトで含まれています。状態と永続性はプロトタイプを作成する以上の中核的な要件となり、Microはそれをフレームワークに組み込むように見えます。

  14. サービス検出 - サービスの自動登録と名前解決。サービスの検出は、マイクロ サービス開発の中核です。サービス A がサービス B に通信する必要がある場合、そのサービスの場所が必要です。デフォルトの検出メカニズムはマルチキャスト DNS (mdns) であり、ゼロ conf システムです。

  15. 負荷分散 - サービス検索に基づいて構築されたクライアント側の負荷分散。サービスの任意の数のインスタンスのアドレスを持ったら、ルーティング先のノードを決定する方法が必要になります。ランダムハッシュロードバランシングを使用して、サービス全体に均等な分散を提供し、問題がある場合は別のノードを再試行します。

  16. メッセージ エンコーディング - コンテンツの種類に基づく動的メッセージ エンコーディング。クライアントとサーバーは、コーデックとコンテンツタイプを使用して、Go型をシームレスにエンコードおよびデコードします。さまざまなメッセージをエンコードし、さまざまなクライアントから送信できます。クライアントとサーバーは、デフォルトでこれを処理します。これには、デフォルトでprotobufとjsonが含まれます。

  17. RPC クライアント/サーバー - 双方向ストリーミングをサポートする RPC ベースの要求/応答。同期通信の抽象化を提供します。サービスに対する要求は自動的に解決され、負荷分散され、ダイヤルされ、ストリーミングされます。

  18. 非同期メッセージング - Pub/Sub は、非同期通信とイベント駆動型アーキテクチャの第一級市民として組み込まれています。イベント通知は、マイクロサービス開発の中核となるパターンです。デフォルトのメッセージング システムは、HTTP イベント メッセージ ブローカーです。

  19. イベントストリーミング - Pub/Subは非同期通知に最適ですが、より高度なユースケースの場合はイベントストリーミングが推奨されます。オフセットとアッキングから消費し、永続的なストレージを提供します。Go-Micro には、NATS JetstreamRedis streamのサポートが含まれています。

  20. 同期 - 分散システムは、最終的に一貫性のある方法で構築されることがよくあります。分散ロックとリーダーシップのサポートは、Syncインターフェイスとして組み込まれています。最終的に整合性のあるデータベースを使用する場合、またはスケジュール設定を行う場合は、Sync インターフェイスを使用します。

  21. プラグ可能なインタフェース - Go-Microは、各分散システム抽象化に対してGoインタフェースを使用します。このため、これらのインターフェイスはプラグ可能であり、Go-Micro はランタイムに依存しません。よって、任意の基礎技術をプラグインすることができます。

2-3. ツールセットやライブラリ

  • フレームワーク: 分散システム開発のためのGoフレームワーク
  • ランタイム: クラウドのための分散システムランタイム
  • クライアント: マイクロサービスと通信するためのクライアント
  • プラグイン: go-microの機能を拡張するプラグイン

2-4. フレームワークとプラグイン

マイクロは、サービス開発のためのGoフレームワークに組み込まれています。Goフレームワークは、定型文の線と線をつなぎ合わせておくなくても、サービスを書くのが簡単です。自動構成とデフォルトでの初期化は、インポートしてすぐに開始するだけです。

  • Registry: 名前解決のための Service Discovery 機能
  • Broker: メッセージブローカーなどを用いた非同期通信機能
  • Transport: サービス間での同期通信機能
  • Selector: Registry に基づいて構築されるフィルターやロードバランサー機能
  • Server: サービスを構築しリクエストを受け付けるためのサーバー
  • Client サービスにリクエストするためのクライアント
  • Codec: 転送時に利用するメッセージのエンコード・デコード
  • Config: 動的にロードできるコンフィグ機能
  • Store: 軽量なデータストレージとして利用するkey/valueなストア機能

2-5. クライアント

Protocol Buffer から Go / Java / JavaScript / Python / Ruby / Rust のコード生成をサポートしており、様々な言語から gRPC を利用して go-micro で作成したサービスにリクエストすることも可能になっています。

2-6. ランタイム

サービスとクライアントがあり、クライアントでは、

  • api: Service Discoveryを使用し動的ルーティングを提供する API Gateway
  • bot: slack 内から直接 micro を操作できる Bot
  • cli: コンソールからの操作を可能にする CLI
  • proxy: 設定やVPN無しでリモートに接続するための Proxy
  • web: サービスやエンドポイントを参照できる Dashboard

を提供しています。また micro で利用可能なコアサービスを提供しており、以下も利用します。

  • auth
  • broker
  • config
  • debug
  • network
  • registry
  • runtime
  • store

2-7. 開発

Micro はマイクロサービス開発モデルに焦点を当てており、これは、1 つのことをうまく行うツールを記述するという UNIX の哲学から取り上げています。Rails モノリシック Web アプリのデータベース テーブル レベルで知るようになったドメイン境界は、ネットワークと名前付けレイヤーのサービス境界に移動すると考えています。

たとえば、ブログ アプリは Rails アプリのテーブルとして投稿、コメント、タグなどで構成されますが、Micro ではこれらは独立したサービスとして定義されます。これらは、1つのことをうまく行い、必要に応じてネットワーク経由またはpubsubメッセージングを介して通信するMicroサービスとして。

Microは、基盤となるプラットフォームがそれらを記述するために必要なプリミティブを定義し、外部の手段からアクセスするために必要なプリミティブを定義する理由である、このサービス開発モデルを念頭に置いて構築されています。Micro には、高速での使用が非常に簡単になる Go サービス フレームワークが含まれています。

3. ProtobufとgRPCをインストール

ここでは、マイクロサービスGo-Microの依存関係にあるProtobufgRPCインストールします。その後、Go-Microをインストールします。

3-1.Protobuf(3.19.2)の環境を構築します。

  1. Protoc3 : Protocol buffers コンパイラ(protoc)をインストール
  • protoc:install

  • proto3ダウンロードサイト ダウンロードサイトから最新版 protoc をダウンロード。今回は v3.19.4 の protoc-3.19.4-linux-x86_64.zip をダウンロードして展開した。 注意事項

    • 展開した bin フォルダにパスを通すこと
    • zip に含まれる include フォルダも展開すること(protoc が参照するファイルが入ってるため)
  • apt-getで既にインストールした場合、アンインストールします。

sudo apt-get remove protobuf-compiler
sudo apt-get remove libprotobuf-dev
sudo apt-get remove libprotobuf-lite10
 #ダウンロード
$ curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-linux-x86_64.zip
 # 解凍
$ unzip protoc-3.19.4-linux-x86_64.zip -d protoc3
 # pathが通っている場所へ移動
$ sudo mv protoc3/bin/* /usr/local/bin/
$ sudo mv protoc3/include/* /usr/local/include/
 # 念のため権限の変更
$ sudo chown [user] /usr/local/bin/protoc
$ sudo chown -R [user] /usr/local/include/google
 # 権限確認
$ ls /usr/local/bin/ -al
-rwxr-x---  1 matsu matsu  5407624 Jan 28 13:34 protoc
$  ls /usr/local/include/google -al
drwxr-xr-x 6 matsu root 4096 Feb 13 23:48 protobuf
 # バージョン確認
$ protoc --version
libprotoc 3.19.4
$ which protoc
/usr/local/bin/protoc
 # 余計なファイルを削除
$ rm -rf protoc-3.19.4-linux-x86_64.zip protoc3
  1. Protocol Buffersのインストール
  • Go:quich start
  • (注意)protoc-gen-microについては、動作確認ができないが、動作する。
  • GO111MODULE=onにしておきます。
$ go env -w GO111MODULE=on
$ go env
GO111MODULE="on"
 #~/go/bin/にインストールされる
$ go get google.golang.org/grpc
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
$ go install github.com/micro/micro/v3/cmd/protoc-gen-micro@master
$ export PATH=$PATH:$GOPATH/bin # ~/.bashrc に追加
 # $ export PATH="$PATH:$(go env GOPATH)/bin"
$ source .bashrc

$ protoc --version
  libprotoc 3.19.2
$ which protoc
/usr/local/bin/protoc

$ protoc-gen-go --version
 protoc-gen-go v1.26.0

$ protoc-gen-go-grpc --version
 protoc-gen-go-grpc 1.1.0

 ### protoc-gen-microについては、動作確認ができないが、動作する。

3-2. Get the example code

gRPCのServerを起動し、gRPCのClientからメッセージを通信します。

 #ここでは、$GOPATH/src/github.com検証します。
$ cd $GOPATH/src/github.com
$ git clone -b v1.43.0 https://github.com/grpc/grpc-go
$ cd grpc-go/examples/helloworld
$ go run greeter_server/main.go
$ go run greeter_client/main.go
Greeting: Hello world
 #Clientターミナルで実行します。
$ go run greeter_client/main.go
2022/02/14 01:49:28 Greeting: Hello world
 #Serverターミナルの表示
$  go run greeter_server/main.go
go: downloading google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98
2022/02/14 01:48:59 server listening at 127.0.0.1:50051
2022/02/14 01:49:28 Received: world

4. Microのインストールとサービスの作り方

4-1.依存関係

  • コードを生成するためには、以下の3つが必要です。
  1. protobuf
  2. protoc-gen-go
  3. protoc-gen-micro

以下の2つは、インストールしています。

  • protoc –version libprotoc 3.19.2
  • protoc-gen-go-grpc –version protoc-gen-go-grpc 1.1.0
  • (注意)Go1.17の場合 エラーの対策としては、go install@versionとします。
$ go install golang.org/x/tools/gopls@latest
 # ~/でインストールしています。
$ wget -q  https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh -O - | /bin/bash
$ export PATH=($PWD)/bin:$PATH
$ source .bashrc
$ micro --version
 micro version v3.9.0
 # 以下のgo get はinstallが入っているためgo1.17では使えません。
 # $ go get github.com/micro/micro/v3/cmd/protoc-gen-micro
$ go install go-micro.dev/v3/cmd/protoc-gen-micro@v1.18.0
  • Dockerで起動する場合
 # Docker Image
$ docker pull micro/micro
$ docker build --tag=<micro/micro> .
$ docker run -it -p <8080:8080> <tag>

4-2.サービスの実行

  1. サービスを開始するために実行
$ micro server
  1. 開始されたサービスと対話する前に、ログインします。
  • id ‘admin’ and password ‘micro’:
$ micro login
Enter username: admin
Enter password: 
Successfully logged in.
  1. 正常に実行されたことを確認するために、実行は次のサービスを実行します。
$ micro services
api
auth
broker
config
events
network
proxy
registry
runtime
store
web
  1. 「Hello World」というサービスを起動します。
$ micro run github.com/micro/services/helloworld
  1. サービスの実行状況を表示します。
$ micro status
NAME            VERSION SOURCE                                  STATUS  BUILD   UPDATED    METADATA
helloworld      latest  github.com/micro/services/helloworld    running n/a     2m1s ago   owner=admin, group=micro
  1. サービス「helloworl」のログの表示します。
$  micro logs helloworld
go: downloading google.golang.org/protobuf v1.27.1
go: downloading github.com/golang/protobuf v1.5.2
...

4-3.サービスを呼び出します

  1. CLI コマンド ライン ツール Micro は、サービスの CLI コマンドを自動的に生成します: micro [service] [method] は、既定のメソッド “Call” です。

次のコマンドを使用してサービスを呼び出すことができます。

$ micro helloworld --name=Jane
{
    "msg": "Hello Jane"
}
  1. シェル管理サービスのヘルプ情報を確認します。
$ micro helloworld --help
NAME:
        micro helloworld
VERSION:
        latest
USAGE:
        micro helloworld [command]
COMMANDS:
        call
        stream
  1. シェルサービス メソッドのヘルプ情報を表示します。
$ micro helloworld call --help
NAME:
        micro helloworld call
USAGE:
        micro helloworld call [flags]
FLAGS:
        --name string

4-4. API インターフェイス

Micro はポート 8080 で http API を公開するため、8080 を介して対応するサービスに直接アクセスできます。

$ curl "http://localhost:8080/helloworld?name=RAIZN"
{"message":"Hello RAIZN"}
  • WebBrowser:http://localhost:8080/helloworld?name=RAIZN

4-5. その他のサービス

helloworld サービスを呼び出す小さなクライアントについて記述します。

  1. main.go ファイル作成
 # ~/go/src/my_workspace/example
$ mkdir example
$ cd example
$ touch main.go
package main
 
import (
    "context"
    "fmt"
    "time"
 
    "github.com/micro/micro/v3/service"
    proto "github.com/micro/services/helloworld/proto"
)
 
func main() {
    // create and initialise a new service
    srv := service.New()
 
        // create the proto client for helloworld
        client := proto.NewHelloworldService("helloworld", srv.Client())
 
        // call an endpoint on the service
        rsp, err := client.Call(context.Background(), &proto.Request{
            Name: "John",
        })
        if err != nil {
            fmt.Println("Error calling helloworld: ", err)
            return
        }
 
        // print the response
        fmt.Println("Response: ", rsp.Msg)
        
        // let's delay the process for exiting for reasons you'll see below
        time.Sleep(time.Second * 5)
}
  1. サービスを実行します
$ go mod init exapmple
├── go.mod
├── go.sum
└── main.go
$ micro run .
  1. 実行状態を確認し、通常、ここで正しい 2 つのサービスが必要です。
$ micro status
NAME            VERSION SOURCE                                  STATUS  BUILD   UPDATED         METADATA
example         latest  /home/matsu/go/src/my_workspace/example running n/a     48m11s ago      owner=admin, group=micro
helloworld      latest  github.com/micro/services/helloworld    running n/a     46m34s ago      owner=admin, group=micro
  • 先ほど書いたサンプル サービスのログを見ると、呼び出されたため、サービスの戻り値が返されます。Hello WorldHello World
$ micro logs example
Response:  Hello John
Response:  Hello John

5. サービスの作り方

gRPCとGo-Microの準備ができましたのでサービスを作ります。 多言語 grpc によって生成されたクライアントを公開して、サービスを照会し、micro を使用します。

  1. micro newコマンドで新しいサービスを作成します。
  • 下記の出力からわかるように、最初のサービスを構築する前に、次のツールをインストールする必要があります。
    • protoc
    • protobuf/proto
    • protoc-gen-micro

上記の 3 つのライブラリは、proto ファイルから Go 言語コードへの変換に必要なため、インストールされます。

$ micro new helloworld
Creating service helloworld
.
├── .gitignore
├── Dockerfile
├── Makefile
├── README.md
├── generate.go
├── go.mod
├── handler
│   └── helloworld.go
├── main.go
├── micro.mu
└── proto
    └── helloworld.proto
download protoc zip packages (protoc-$VERSION-$PLATFORM.zip) and install:
visit https://github.com/protocolbuffers/protobuf/releases
download protobuf for micro:
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get github.com/micro/micro/v3/cmd/protoc-gen-micro
compile the proto file helloworld.proto:
cd helloworld
make proto
  1. proto ファイルから 2つのGo コードを生成するには、次のコマンドを使用します。
$ make proto
/proto
├── helloworld.pb.go
├── helloworld.pb.micro.go
└── helloworld.proto

6. ストレージ

Micro には、他の便利な組み込みサービスに加えて、データを永続化するためのサービスが含まれています。

6-1. CLI コマンド ライン ツール

  1. 基本的なstore CLIコマンド
  • go-microを起動します。
  • microにログインします。
$ micro store write key1 value1
  • UNIX スタイルの出力なしは、それが楽しく保存されていることを示します。
  • データの読み取り:
$ micro store read key1
val1
  • –verbose または -v を使用して、よりユーザー化されたデータ インプレッションを実行できます。
$ micro store read -v key1
  • @prefix または -p を使用して、キーに特定のプレフィックスを持つデータを検索できます。 これを確認するには、まず別の値を保存します。
$ micro store write key2 val2

次に、key1 キーと key2 キーの両方が共通のプレフィックスを共有するため、キー 1 キーとキー 2 キーを一覧表示できます。
2. その他のサービス

  • コマンドの作業方法は、Go Micro サービスからデータへのアクセスを非常に簡単に行います。 次に、サービスが読み取ることができるエントリを作成します。 ただし、今回は、各サービスがストア内に独自のテーブルを持つため、Go Micro ストレージ サービスの書き込みコマンドのテーブルも指定します。
$ micro store write --table=example mykey "Hi there"
  • サービスを呼び出すのではなく、ストアから上記の値を読み取るように、以前に記述したサンプル サービスを変更してみましょう。
package main
 
import (
    "fmt"
    "time"
 
    "github.com/micro/micro/v3/service"
    "github.com/micro/micro/v3/service/store"
)
 
func main() {
    srv := service.New(service.Name("example"))
    srv.Init()
 
    records, err := store.Read("mykey")
    if err != nil {
        fmt.Println("Error reading from store: ", err)
    }
 
    if len(records) == 0 {
        fmt.Println("No records")
    }
    for _, record := range records {
        fmt.Printf("key: %v, value: %v\n", record.Key, string(record.Value))
    }
 
    time.Sleep(1 * time.Hour)
}

6-2. サービスの更新

サンプル サービス (サービス) を変更しました。 そして、このサービスは実行中なので、再びそれを実行することはできませんので、サービスを更新するためにmicro updateを使用する必要があります。

  1. update コマンドを使用して直接更新できますが、サンプル サービスのルートに戻ることを確認してください。
$ micro update .
  1. ステータスの表示:
$ micro status example
example    latest    n/a        running    n/a        7s ago    owner=admin, group=micro
  1. 何らかの理由でプログラムが死んだ場合は、次の方法で再起動できます。
$ micro kill example
$ micro run .
  1. ログを再検討し、保存されたデータが返された場合は、更新が成功したことを示します。
$ micro logs example
key: mykey, value: Hi there

7. 構成

7-1. CLI コマンド ライン ツール

構成情報とキー情報は、任意の運用システムの重要な部分であり、Go Micro Config がどのように機能するかを見てみましょう。

  1. 簡単な使用例
$ micro config set key val
$ micro config get key
val

このペアの形式だけで、多くのアプリケーション シナリオが満たされています。

  1. これだけで非常に多くのユースケースに十分ですが、組織化の目的で、Microはキーのドット表記もサポートしています。 以前に設定したキーを上書きしましょう。
$ micro config set key.subkey val
$ micro config get key.subkey
val
  1. この入れ子になった構成を取得すると、Json の方法でデータが返されます。
$ micro config get key
{"subkey":"val"}
  1. JSON のデータ形式で返される新しい構成セット。
$ micro config set key.othersubkey val2
$ micro config get key
{"othersubkey":"val2","subkey":"val"}

7-2. その他のサービス

  1. 他のサービスで呼び出されるのは、実際には似ています。
package main
 
import (
    "fmt"
 
    "github.com/micro/micro/v3/service"
    "github.com/micro/micro/v3/service/config"
)
 
func main() {
    // setup the service
    srv := service.New(service.Name("example"))
    srv.Init()
 
    // read config value
    val, _ := config.Get("key.subkey")
    fmt.Println("Value of key.subkey: ", val.String(""))
}
  1. 上記の方法でサービスを更新すると、更新が成功すると結果が出力されます。
$ micro logs example
Value of key.subkey:  val
以上