LoginSignup
27
25

More than 5 years have passed since last update.

Javaで使えそうなServiceDiscoveryを試す

Last updated at Posted at 2016-05-06

Service Discoveryとは

ここでは、マイクロサービスアーキテクチャなどで作成したサービスを登録するして検索出来るようにするようなミドルウェアを指す。

なぜ必要かであるが、

  • 動的にサービス稼働しているノードが増えたり、減ったりするのにClient側が追従する
  • 各ノードへのアクセスを負荷分散させるため

などが大きな理由として挙げられる

役割的なものを軽く図にまとめておく

Network Diagram.png

Javaで使えるもの

探せばたくさんあると思うが、メジャーなものとして

  • Zookeeper
  • etcd
  • Consul
  • Eureka

がある。このうちEurekaはJavaだけに向けた設計になっている。

今回はConsulとEurekaを見てみる。2つとも管理画面があるのと、Client向けライブラリが一応あったためという理由。

他の2つについては、

  • etcdはKVSを拡張したような感じと見受けられたので、直接マイクロサービスの基盤として使うにはちょっと気が引けたので未着手
  • Zookeeperは、Kafkaなどでも利用しているので見てみようかと思ったが、ServiceDiscoveryとしては少し古い的な話が多かったので、これも気が引けて未着手

という感触であった。

Consul

Hashi Corp社が開発。
Go言語で作られているので、各プラットフォーム毎のバイナリをダウンロードして実行するだけで起動する。

機能としては、SerivceDiscoveryの他にKVS(Key/Value Storage)機能もある。

Consulの起動

dockerで構築されている事例が多いようではあるが、通常のOS上でも稼働する

基本的には、コマンドライン一発

consul agent -server -bootstrap -client=127.0.0.1 -dc=local -data-dir=/tmp/consul -bind 127.0.0.1 -node agent-hoge -ui-dir /opt/consul/ui -config-dir /opt/consul/consul.d/

consulの設定はコマンドライン引数にて行う。
-ui-dirについて触れてみるが、Consulクラスタの管理uiを起動するためのオプションになる。
Consulバイナリと同様にダウンロードして展開して出来たディレクトリを起動オプションとして指定するだけ。

(uiのデモはこちら)
http://demo.consul.io/ui/

Javaによるサービスの登録

Javaからサービスを登録する場合には、OSSライブラリを利用するのが一般的。

上記2つともドキュメントを読めば大体使い方が分かるはず。

ヘルスチェック

consulのヘルスチェックとしては何種類か用意されている

  • Script + Interval − HTTP + Interval
  • TCP + Interval
  • Docker + Interval
  • TTL

このうちTTL以外は、Consulからサービス側に向けたヘルスチェックとなる。

コマンドラインで起動する時の -config-dirオプションにて指定したディレクトリにヘルスチェック向けの設定を記載する。もしくは、ConsulのHTTP APIにてヘルスチェック設定を登録出来る模様。

Eureka

Netflix社からOSSとして公開されているJavaベースのServiceDiscovery。
AWSでの動作を想定して作成されているが、オンプレのデータセンターでも動作させることは出来る。

Eureka画像

サンプルの動作させ方などは以下を見ると大体分かるはず。

Eureka Server起動

Eureka Serverはwarモジュールとして提供されているため、Tomcatなどで動かすのが手っ取り早い
サンプル動作のためには、warを自前でビルドするよりも

から取得するので良いのではないか。
Tomcatのwebapps配下にwarを置き、8080番ポートでHttpを起動すると管理コンソールが見れる

http://localhost:8080/eureka

Untitled.png

Javaによるサービスの登録

設定内容の詳細は、Exampleを見て確認するのが良い。また公式ドキュメントも役立つはず。

サンプルサービスの起動は、githubをcloneしてJavaのパスが通っているなら、以下にて可能

./gradlew :eureka-examples:runExampleService

Clientからのアクセスロードバランス機能

Consul, Eurekaともに対象サービスが登録されているホストのIPアドレス、ポート番号を取得出来る。

  • consul-clientの例
Consul consul = Consul.builder().build(); // connect to Consul on localhost
HealthClient healthClient = consul.healthClient();
List<ServiceHealth> nodes = healthClient.getHealthyServiceInstances("DataService").getResponse(); 
  • Eureka Clientの例

Eureka Clientでゴリゴリ記載しても出来そうではある。これはExampleを参照のこと。

nextServerInfo = DiscoveryManager.getInstance()
                    .getEurekaClient()
                    .getNextServerFromEureka(vipAddress, false);

またサンプルプログラムも以下にて起動出来る

./gradlew :eureka-examples:runExampleClient

どちらにしても、アクセスロードバランスについては、同じNetflix製OSSのribbonを利用したいところ

特に同じNetflix社製のEurekaとの連携はモジュールもあり導入しやすそう

まとめ

Service Discoveryとして、ConsulとEurekaの単純なセットアップをまとめた。

  • Consul
    Javaでの利用に特化しているわけでもなく、かつService Discoveryだけでなく、KVSやDNS連携もあり広範囲な使い方を想定したミドルウェアのようだ

  • Eureka
    Javaでマイクロサービスを構築するためのService Discoveryに特化しており、他のNetflix製OSSと組み合わせることでJavaにおいては大幅な実装削減が期待できると感じた。

以上、2016年のGWに調べたことを忘れないうちにまとめてみた。

27
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
25