sleuthというGoのライブラリでサービスディスカバリを試してみた
はじめに
Service autodiscovery in Go with sleuth - darian.afという記事を見かけて試してみたのでメモです。
github.com/ursiform/sleuthのセットアップ
Installationを見ながらセットアップします。
いきなりgo getでインストールしてみるとZeroMQ version 4が必要というエラーメッセージが出ました。
$ go get -u github.com/ursiform/sleuth
# github.com/pebbe/zmq4
In file included from ../../../pebbe/zmq4/ctxoptions_unix.go:7:0:
zmq4.h:2:2: error: #error "You need ZeroMQ version 4 to build this"
#error "You need ZeroMQ version 4 to build this"
^
Ubuntu 16.04では
sudo apt install -y libzmq3-dev
CentOS 7では
sudo yum install -y zeromq-devel
でZeroMQ 4.xのライブラリとヘッダファイルがインストールできます。
このあとで go get でsleuthをインストールすると今度は大丈夫でした。
$ go get -u github.com/ursiform/sleuth
動作確認のためエコーバックのサービスの例を試す
ExamplesのExample (1)にエコーバックのサーバとクライアントがあるのでそれを試します。
コードをコピペするのが面倒な人は
go get -d github.com/hnakamur/sleuth-echo-example
で取得できます。
以下のコマンドでプロジェクトのディレクトリに移動します。
cd $GOPATH/src/github.com/hnakamur/sleuth-echo-example
以下のコマンドでエコーバックのサーバを起動します。
(cd echo-server && go run main.go &)
起動すると以下のようなログが出力されます。
2016/06/15 06:54:06 [**warning**] sleuth: config.Interface not defined [801]
2016/06/15 06:54:06 [ listening ] sleuth: [SLEUTH-v0:5670][echo-service E13055]
以下のコマンドでクライアントを実行し、“It works.” と表示されれば成功です。
$ (cd echo-client && go run main.go)
It works.
curlでも試してみます。
$ curl -s -d Hello 127.0.0.1:9873/echo-service/
Hello
サービスディスカバリの例を試す
go get -u github.com/afshin/sleuth-example/...
でサンプルのコードと依存するライブラリを取得し
cd $GOPATH/src/github.com/afshin/sleuth-example
でプロジェクトのディレクトリに移動します。
この例にはarticle-serviceとcomment-serviceという2つのサービスが含まれています。
まずは article-service を起動します。article-serviceはポート9872で起動されます。
$ (cd article-service && go run main.go)
2016/06/14 22:38:08 [**warning**] sleuth: config.Interface not defined [801]
2016/06/14 22:38:08 [ listening ] sleuth: [SLEUTH-v0:5670][client-only EC740A]
2016/06/14 22:38:08 [**blocked**] sleuth: waiting for client to find [comment-service]
ログに書かれているようにcomment-serviceが見つからなくて待っている状態です。
別の端末を開いて以下のコマンドを実行してcomment-serviceを起動します。comment-serviceはポート9871で起動されます。
$ (cd comment-service && go run main.go)
2016/06/15 07:47:42 [**warning**] sleuth: config.Interface not defined [801]
2016/06/15 07:47:42 [ listening ] sleuth: [SLEUTH-v0:5670][comment-service 0DBE04]
ready...
comment-serviceを起動するとarticle-serviceの端末には以下のログが追加で出力されます。
2016/06/15 07:47:43 [*unblocked*] sleuth: client found [comment-service]
ready...
つまりarticle-serviceがcomment-serviceを発見(サービスディカバリ)出来たということです。
別の端末を開いて以下のコマンドを実行してcurlでarticle-serviceから記事のデータを1件取得してみます。
$ curl -s localhost:9872/articles/049cd8fc-a66b-4a3d-956b-7c2ab5fb9c5d | jq .
{
"success": true,
"data": {
"guid": "049cd8fc-a66b-4a3d-956b-7c2ab5fb9c5d",
"byline": "Kristen Rasmussen",
"headline": "Wanting the Unwanted: Why Eat Weeds",
"url": "http://www.rootedfood.com/musings/2015/4/1/a-foraged-affair",
"time": 1428168580
}
}
comment-serviceからコメントのデータを1件取得します。
$ curl -s localhost:9871/comments/06500da3-f9b0-4731-b0fa-fbc6cbe8c155 | jq .
{
"success": true,
"data": [
{
"guid": "d7041752-6854-4b2c-ad6d-1b48d898668d",
"article": "06500da3-f9b0-4731-b0fa-fbc6cbe8c155",
"text": "Star Trek, on the other hand, consistently presents an optimistic view of our capacity for civilization. I love science-fiction, even when it's dystopian. But why does so much of it have to be dystopian?",
"time": 1452738329
}
]
}
次に2つのサービスを連携させた使い方として、以下のコマンドで1件の記事とそれに紐づくコメントを取得します。
$ curl -s localhost:9872/articles/049cd8fc-a66b-4a3d-956b-7c2ab5fb9c5d?includecomments=true | jq .
{
"success": true,
"data": {
"guid": "049cd8fc-a66b-4a3d-956b-7c2ab5fb9c5d",
"byline": "Kristen Rasmussen",
"comments": [
{
"guid": "1b1e937b-8521-4c88-a13c-105d421ea030",
"article": "049cd8fc-a66b-4a3d-956b-7c2ab5fb9c5d",
"text": "I believe the premise to be false, while it is true that you can eat many different "weeds" I cannot find any methodology or theory where that doing so increases the efficiency of land use. There are some key things like nutrients in == nutrie
nts out and digestibility in humans which is not a given.<p>That said, there were some interesting recipes for what are nominally weeds in the Foxfire[1], and Euell Gibbons books[2] which were certainly edible although nothing I've tried really struck me as excepti
onal. As Boy Scouts we got a merit badge for creating a meal out of locally harvested plants, that was fun.<p>[1] <a href=\"http://www.foxfire.org/thefoxfirebooks.aspx\" rel=\"nofollow\">http://www.foxfire.org/thefoxfirebooks.aspx</a><p>[2]
<a href=\"http://www.amazon.com/Euell-Gibbons-Handbook-Edible-Plants/dp/0915442787\" rel=\"nofollow\">http://www.amazon.com/Euell-Gibbons-Handbook-Edible-Plants/d...</a>",
"time": 1428172888
},
{
"guid": "1ffa59ea-1b62-41fe-87c3-98ec6901d768",
"article": "049cd8fc-a66b-4a3d-956b-7c2ab5fb9c5d",
"text": "Something to keep in mind here is that once a viable market is found then the product will be fully commercialised and mass-produced. No longer will poor conditions be good enough when compared to the yield you get from ideal conditions.<p>Then we will
start fertilising them, then tweaking the seeds etc etc etc. And before long it will be just like anything else grown on the land.",
"time": 1428188859
},
…(略)…
"guid": "587b528f-f4fe-4620-959e-f0d087c97348",
"article": "049cd8fc-a66b-4a3d-956b-7c2ab5fb9c5d",
"text": "The premise that weeds are a suitable food for humans is wrong. Most of these plants are loaded with toxins. You can't eat them in any quantity for calories without getting poisoned.<p>Cows and goats and sheep can eat these things, though, because
they have more advanced digestive systems. The udder provides an added toxin filtration system.<p>In theory you might be able to design an efficient system to detoxify wild plants such as grass and weeds directly into a high quality human food. At this moment cheese is
already an incredibly effective way to use wild forage to make human food.",
"time": 1428192718
}
],
"headline": "Wanting the Unwanted: Why Eat Weeds",
"url": "http://www.rootedfood.com/musings/2015/4/1/a-foraged-affair",
"time": 1428168580
}
}
sleuthのQ & Aを見てみる
Q & Aを見ると、sleuthのメッセージプロトコルはJSONをgzipしてHTTPで通信しているとのことです。Protocol Buffersなどの他のライブラリに依存するのを避けたいという意図で、マイクロサービスのAPIレスポンスのほとんどは小さいのでJSONをgzipする方式で十分だし、そのほうがGo以外の言語でも利用しやすいので良いだろうということです。
sleuthは熊のグループの集合名詞とのことです。
おわりに
sleuthはzeromqとGoさえあれば使えるということでセットアップが簡単です。
サービスの実装sleuth-example/main.goとsleuth-example/main.goも、Goで普通にウェブサービスを実装したところに、sleuthを使うためのコードを少し足すだけでいいのでお手軽でいいですね。