Skip to content

Instantly share code, notes, and snippets.

@nota-ja
Last active December 30, 2015 19:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nota-ja/7873363 to your computer and use it in GitHub Desktop.
Save nota-ja/7873363 to your computer and use it in GitHub Desktop.
gibsonを使ってみる

 この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 <suraci.alex@gmail.com>
Date:   Sun Nov 3 08:20:24 2013 -0800
..

 確かに古い。

git fetch
(略)
git pull
(略)
git log
commit 6387bd1d06da5680d9d8231a529ea5df45852c9f
Author: Glenn Oppegard <goppegard@pivotallabs.com>
Date:   Wed Dec 4 10:57:56 2013 -0700
..
commit eabc687ddc7278984279fa76f2936db64d28dde4
Author: Alex Suraci <asuraci@pivotallabs.com>
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)

 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で試します。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について適当に書いてお茶を濁すつもりです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment