このgistは Cloud Foundry Advent Calendar 2013 の9日目の記事です。
昨日の記事が思わぬ大作になってしまったので,今日は軽めで行きたいと思います。
本家cloudfoundryのGitHubに,gibsonというリポジトリーがあります。READMEを読むと,Routerに対して,アプリへのrouteを登録/登録解除する,Goで書かれたライブラリー/ツールとのことです。何のためにそんなものが必要なのかは今のところ不明ですが,今日はこれを動かしてみることにします。
まずGitHubからgibsonをcloneして,registrarというツールをinstallします。
cd $GOPATH/src/github.com/cloudfoundry
git clone https://github.com/cloudfoundry/gibson.git
(略)
cd gibson/
go install ./registrar
# github.com/cloudfoundry/gibson/registrar
registrar/main.go:50: undefined: yagnats.ConnectionCluster
何か失敗しました。どうやら私の$GOPATH内にあるyagnatsが古いようなので,更新します。
cd ../yagnats/
git checkout master
(略)
git log
commit cec45ba1bd3a54a0c322d7c2fead169b66049063
Author: Alex Suraci <[email protected]>
Date: Sun Nov 3 08:20:24 2013 -0800
..
確かに古い。
git fetch
(略)
git pull
(略)
git log
commit 6387bd1d06da5680d9d8231a529ea5df45852c9f
Author: Glenn Oppegard <[email protected]>
Date: Wed Dec 4 10:57:56 2013 -0700
..
commit eabc687ddc7278984279fa76f2936db64d28dde4
Author: Alex Suraci <[email protected]>
Date: Thu Nov 14 12:01:27 2013 -0800
basic clustering support
Add ConnectionCluster connection provider which simply picks a random
..
どうやらこのコミットが必要だったようです。
気を取り直してinstallします。
go install ./registrar
今度は文句を言われませんでした。 実行できるかどうか確認します。
registrar -help
Usage of registrar:
-ip="": IP address of the machine to route to
-natsAddresses="": comma-separated list of NATS cluster member IP:ports
-natsPassword="": authentication password for connecting to NATS
-natsUsername="": authentication user for connecting to NATS
-routes="": routes to register, in the form of port:uri,port:uri,port:uri
何か出ました。ちゃんとinstallできているようです。
Ruby Router (v2) をNATSサーバーに接続しただけの状態で起動します(起動コマンドは面倒なので省略)。このNATSサーバーにはこのRouterしかつないでいない(Cloud Controller も DEA もつないでいない)ので,現状ではこのRouterに登録されているアプリへのrouteはゼロです。これをvarzにアクセスして確認します。
curl ****:****@192.168.14.111:****/varz
{
"type": "Router",
"index": null,
(略)
"urls": 0,
"droplets": 0,
(略)
}
いよいよ本題。先ほどinstallしたregistrarを使って,アプリへのrouteをRouterに登録します。アプリにアクセスするわけではないので,適当なホストとポートを登録すればOKです。
registrar -ip=127.0.0.1 -natsAddresses=192.168.14.111:4222 -natsUsername=**** -natsPassword=**** -routes=30000:abc.example.org
2013/12/09 22:00:59 configuring nats server: 192.168.14.111:4222
registrarは一度起動すると与えられたrouteをずっと登録し続けます。が,同じrouteなので数は変わりません。
再びvarzにアクセスして確認します。
curl ****:****@192.168.14.111:****/varz
{
"type": "Router",
"index": null,
(略)
"urls": 1,
"droplets": 1,
(略)
}
確かに1に増えています。
今度はrouteの登録解除をしよう..と思ったら,registrarでは登録しかできませんでした。しょうがないので,今回は手抜きで,registrarのディレクトリーを丸ごとunregistrarというディレクトリーにコピーして,中身を多少書き換えて,unregistrarというツールを作ります。
cp -pr registrar unregistrar
emacs unregistrar/main.go
(略)
編集内容は以下です。
git diff --no-index -- registrar/main.go unregistrar/main.go
diff --git a/registrar/main.go b/unregistrar/main.go
index dccb032..9b705dd 100644
--- a/registrar/main.go
+++ b/unregistrar/main.go
@@ -13,7 +13,7 @@ import (
var ip = flag.String("ip", "", "IP address of the machine to route to")
-var routes = flag.String("routes", "", "routes to register, in the form of port:uri,por
+var routes = flag.String("routes", "", "routes to unregister, in the form of port:uri,p
var natsAddresses = flag.String("natsAddresses", "", "comma-separated list of NATS clus
var natsUsername = flag.String("natsUsername", "", "authentication user for connecting
@@ -74,8 +74,6 @@ func main() {
log.Fatalln("invalid route port:", err)
}
- client.Register(port, routePair[1])
+ client.Unregister(port, routePair[1])
}
-
- select {}
}
修正は3箇所だけです。[Rr]egisterを[Uu]nregisterに書き換えました。また,Unregisterは1回投げればOK(投げ続ける必要は無い)ので,最後のselectは削りました。
installして実行してみます。
go install ./unregistrar
unregistrar -ip=127.0.0.1 -natsAddresses=192.168.14.111:4222 -natsUsername=**** -natsPassword=**** -routes=30000:abc.example.org
2013/12/09 22:16:40 configuring nats server: 192.168.14.111:4222
varzを確認。
curl ****:****@192.168.14.111:****/varz
{
"type": "Router",
"index": null,
(略)
"urls": 0,
"droplets": 0,
(略)
}
ちゃんとゼロに戻っています。
今度は,同じことをGorouterで試します。Gorouterは既にbuild済みで,先ほどの Ruby Router (v2) と同様,単独でNATSサーバーにつながっているものとします。
まずは事前の状態を知るために,varzにアクセスします。Gorouterのvarzは Ruby Router (v2) のvarzと見た目がかなり違います。
curl ****:****@192.168.14.111:****/varz
{"bad_gateways":0,"bad_requests":0,(略),"droplets":0,(略)}
dropletはゼロです。
では,registrarを実行します。
registrar -ip=127.0.0.1 -natsAddresses=192.168.14.111:4222 -natsUsername=**** -natsPassword=**** -routes=30000:abc.example.org
2013/12/09 23:32:29 configuring nats server: 192.168.14.111:4222
varzにアクセスして確認。
curl ****:****@192.168.14.111:****/varz
{"bad_gateways":0,"bad_requests":0,(略),"droplets":1,(略)}
ちゃんと1になっています。
unregistrarを実行します。
unregistrar -ip=127.0.0.1 -natsAddresses=192.168.14.111:4222 -natsUsername=nats -natsPassword=nats -routes=30000:abc.example.org
2013/12/09 23:32:29 configuring nats server: 192.168.14.111:4222
varzにアクセスして確認。
curl ****:****@192.168.14.111:****/varz
{"bad_gateways":0,"bad_requests":0,(略),"droplets":0,(略)}
ゼロに戻っています。
ということで,今回はgibsonを紹介しました。次回(明日)は,時間が取れたらこれを使ってもう少しいろいろやってみようと考えています。時間が取れなかったら,gorouterについて適当に書いてお茶を濁すつもりです。