go-microではじめるマイクロサービス
go-micro(micro/go-micro) はマイクロサービス開発を簡素化するためのGoフレームワークです。様々なマイクロサービスフレームワークが開発されていますが、そのなかでも go-micro は現在(2020/08/02)で ★13.8k(https://github.com/micro/go-micro のみ) と勢いのあるマイクロサービスフレームワークとなっています。
この記事では、go-micro と チュートリアルとして簡単な gRPC アプリケーションを作成し動かすところまでを紹介したいと思います。
go-micro
go-micro はそれを取り巻くツールセットやライブラリとして、
- フレームワーク: 分散システム開発のためのGoフレームワーク
- ランタイム: クラウドのための分散システムランタイム
- クライアント: マイクロサービスと通信するためのクライアント
- プラグイン: go-microの機能を拡張するプラグイン
で構成されています。
フレームワークとプラグイン
このフレームワークとプラグインでは、
- Registry: 名前解決のための Service Discovery 機能
- Broker: メッセージブローカーなどを用いた非同期通信機能
- Transport: サービス間での同期通信機能
- Selector: Registry に基づいて構築されるフィルターやロードバランサー機能
- Server: サービスを構築しリクエストを受け付けるためのサーバー
- Client: サービスにリクエストするためのクライアント
- Codec: 転送時に利用するメッセージのエンコード・デコード
- Config: 動的にロードできるコンフィグ機能
- Store: 軽量なデータストレージとして利用するkey/valueなストア機能
といったシンプルなビルディングブロックを提供しています。これらを利用することでマイクロサービス開発を簡素なものにしてくれます。
クライアント
Protocol Buffer から Go / Java / JavaScript / Python / Ruby / Rust のコード生成をサポートしており、様々な言語から gRPC を利用して go-micro で作成したサービスにリクエストすることも可能になっているようです。
ランタイム
サービスとクライアントがあり、クライアントでは、
- 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
も利用できます。
サービスを作ってよう
では早速、 go-micro を使ってサービスを作ってみましょう!数コマンド実行するだけでプロジェクトを作成できるようになっているのでお試しください。(面倒な方は下記を参照ください)
インストール
まず、 github.com/micro/micro をインストールします。現在(2020/08/02) v2.9.3 が Stable としてリリースされているのでそちらを利用します。
# From Source
go get github.com/micro/micro/v2
# Using a docker image
docker pull micro/micro:v2.9.3
# MacOS
curl -fsSL https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh | /bin/bash
# Linux
wget -q https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh -O - | /bin/bash
# Windows
powershell -Command "iwr -useb https://raw.githubusercontent.com/micro/micro/master/scripts/install.ps1 | iex"
でインストールしていきます。
サービスを作成する
次は雛形よりサービスを作成するため、下記のコマンドを実施します。今回は helloworld として service を作成します。(ここで設定している namespace や service は Service Discovery にて利用する key となります)
$ micro new --namespace kzmake.example --type service -alias helloworld --plugin=registry=etcd:broker=rabbitmq helloworld
Creating service kzmake.example.service.helloworld in helloworld
.
├── main.go
├── generate.go
├── plugin.go
├── handler
│ └── helloworld.go
├── subscriber
│ └── helloworld.go
├── proto
│ └── helloworld
│ └── helloworld.proto
├── Dockerfile
├── Makefile
├── README.md
├── .gitignore
└── go.mod
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/v2/cmd/protoc-gen-micro
compile the proto file helloworld.proto:
cd helloworld
make proto
上記の output にあるように、 ProtoファイルからGoコードを生成するために
$ cd helloworld
$ go get -u github.com/golang/protobuf/protoc-gen-go
go: found github.com/golang/protobuf/protoc-gen-go in github.com/golang/protobuf v1.4.2
go: google.golang.org/protobuf upgrade => v1.25.0
$ go get -u github.com/golang/protobuf/proto
go: found github.com/golang/protobuf/proto in github.com/golang/protobuf v1.4.2
go: google.golang.org/protobuf upgrade => v1.25.0
$ go get github.com/micro/micro/v2/cmd/protoc-gen-micro
go: found github.com/micro/micro/v2/cmd/protoc-gen-micro in github.com/micro/micro/v2 v2.9.3
を実施します。
(plugin.goの修正)
plugin.go で import している go-plugins を v2 を参照するように修正が必要です!
package main
import (
_ "github.com/micro/go-plugins/registry/etcd/v2"
_ "github.com/micro/go-plugins/broker/rabbitmq/v2"
)
サービスをビルドする
make コマンドを実施することで protoc & go build できるようになっています!
$ make build
protoc --proto_path=. --micro_out=Mproto/imports/api.proto=github.com/micro/go-micro/v2/api/proto:. --go_out=Mproto/imports/api.proto=github.com/micro/go-micro/v2/api/proto:. proto/helloworld/helloworld.proto
2020/08/04 01:40:02 WARNING: Missing 'go_package' option in "proto/helloworld/helloworld.proto",
please specify it with the full Go package path as
a future release of protoc-gen-go will require this be specified.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
go build -o helloworld-service *.go
gRPCサービスを起動する
生成されたアプリケーションは --registry value で Registry を起動時に指定可能です。今回は etcd を Service Discovery に利用するので下記の用に指定します。(あらかじめ etcd を起動しておく必要があります)
## $ brew install etcd
## $ etcd
$ ./helloworld-service --registry etcd
2020-08-03 00:45:48 file=v2@v2.9.1/service.go:200 level=info Starting [service] kzmake.example.service.helloworld
2020-08-03 00:45:48 file=grpc/grpc.go:864 level=info Server [grpc] Listening on [::]:59081
2020-08-03 00:45:48 file=grpc/grpc.go:881 level=info Broker [http] Connected to 127.0.0.1:59082
2020-08-03 00:45:48 file=grpc/grpc.go:697 level=info Registry [etcd] Registering node: kzmake.example.service.helloworld-09084685-0696-4467-8970-8b3cbbb44d04
2020-08-03 00:45:48 file=grpc/grpc.go:730 level=info Subscribing to topic: kzmake.example.service.helloworld
リクエストしてみる
サービスの動作を確認するためリクエストを投げてみましょう!
リクエスト用のコマンド micro call を用いることで gRPC リクエストできます。
$ micro --registry etcd call kzmake.example.service.helloworld Helloworld.Call '{"name": "alice"}'
{
"msg": "Hello alice"
}
さいごに
go-micro と簡単な gRPC アプリケーションを作成し動かすところまでを紹介しました。
生成されたコードを読んでみると、フレームワークのサポートが協力なため実装が最小限 となっているかとおもいます。Service Discovery や gRPC Server、Broker の実装が go-plugins / go-micro で提供されており、 Registry など抽象化されたインターフェースを用いて、ビルディングブロックを組み込むだけとなっていますね!
まだまだたくさんの機能があるので、別の note で他の機能もまとめようかと思います😋
この記事が気に入ったらサポートをしてみませんか?