今更ながらの
「マイクロサービス」
Innovation Hub 九州 Developer Day
Hideaki Tokida
⽇本情報通信株式会社
ArchitectureとBluemixでの実装⽅法のヒント
0 ) 0 r e
4 0 0
0
• k dinp ah
• m U A IH
M TA @lc
sxu
• O U o
• @ . ( O
• 40 lc !
• tCG BW
• 0 4 4
¥30
6 4 1/0 2:
-
89 73
⽬標
• マイクロサービスとは何か?
• Bluemix上でマイクロサービスアーキテクチャを実装する際のヒント
マイクロサービスの本格化
• 海外の代表的なIT企業(Netflix,Amazon, Uber,Twitterなど)がここ数年
で従来型のアーキテクチャからマイクロサービスアーキテクチャを採⽤。
それはこれまでとアプリケーションに対する要求が変わってきたから
• マイクロサービスは従来のモノリスなアーキテクチャに対してスケーラビ
リティ、効率、新しい技術の適応と⾔った所で効果的があるとされていま
す。
2004-2017 までの検索⼈気の⽐較
(マイクロサービス vs サービス指向アーキテクチャ)
2017年の”マイクロサービス”の分布 2017年の”サービス指向アーキテクチャ”の分布
Service-Oriented Architecture
• SOAは、複数のサービスが連携して⼀つの機能を提供するための設計⼿法。
• 問題が⾊々あった→どの位⼩さくサービスを分けるべきかという⽅法論、
通信プロトコルやSOA「製品」に帰属する問題。
• マイクロサービスは、SOAの⼿法の⼀つ。
モノリスなシステム
モジュール
コードの凝縮性を⾼める
変更する理由が同じものは集める、理由が違うものは分ける
似たよ
うな機能が
マイクロサービス
変更する
サービス
サービス
サービスの境界
=ビジネスの境界
⼗分に⼩さく、ちょうどいい⼤きさ
2週間で書き直せるもの
あまりに⼩さすぎても複雑さを増す
⾃⽴性
他には何も変更せずに、単独でサー
ビスのデプロイが⾏えるか?
API
マイクロサービス(⾃律性)
変更する
サービス
サービス
独⽴したプロセス, または個別のOS上で動く
API
分散システムと相性がよく、マイクロサービスは分散システムの利点を引き継いでいる
マイクロサービス(技術異質性)
変更する
サービス
PHP Nodejs
Java Java
PHP
Java
Golang
各サービスは分離されており、サービスごとに適
切な技術を利⽤することが出来る
API
やりたいことに応じてリスクが低
い事、逆に新しい技術に挑戦をす
ることが可能となる
回復性
モジュー
似
た
変更する
サービス
サービス
障害が発⽣した点
モノリシックなアプリケーションの場合には障
害が全体に波及
よくある対策
回避するために同じものを⽤意
マイクロサービスの場合には箇所に応じて機能
低下させて継続動作
スケール性
モジュー
似
API
Bluemixのようなクラウドを利⽤することによりサーバ⾃体
もオンデマンドプロビジョニング出来る
モノリシックなアプリケーションの場合には全
対を⼤きく拡⼤
マイクロサービスの場合には必要な部分だけを
スケール
(インスタンスを増やす、サイズを⼤きくする)
現実的には単⼀のサーバである事が
多く物理的な限界が有る
似て⾮なるもの
• 共有ライブラリ
• ⾔語標準的な分解テクニック。ライブラリは⾔語にいぞするため技術異
質性(多様性)が失われる。ライブラリ単独ではスケールできない。DLL
以外の場合には新しいライブラリのために全体を起動する必要がある。
• モジュール
• ⾔語ごとにモジュールを利⽤する⼿段は違う。モジュールが過度に結合
する事があり得る。共有ライブラリと同じ問題点を持つ。
疎結合と⾼凝縮性
変更する
サービス
疎結 疎結
疎結
必要最低限の事のみ知っている
他のサービスでは変更なくデプロイが出来る
F
F
F
F
同じ機能はまとめる
→⾼凝縮性
モジュールの境界
モジュー
ル
モジュー
ル
モジュー
ル
F
F
F
F
ドメイン
ドメイン
ドメイン
モジュールとの境界が⼀致しているべき
=マイクロサービス
推奨されるスタート
• Monolithでアプリケーションを作成
• 初期の段階で適切にどのように分割するかわかることは難しい
• ドメインを正確に理解した後にマイクロサービスに分割
• より柔軟なリソースの変化に耐えるためにクラウドサービスの利⽤を推
奨
• 特に結合しがちなDBなどは注意が必要
モノリスからの分解
フロントエンド バックエンド データストア
3階層型アーキテクチャ
⼀般的なモノリス構造の場合、データベースがアプリケーションの密結合の核になっているケースが多い。
マイクロサービス化をしていくためには、どのコードがどのデータ(テーブル)を利⽤してるかを理解する。
最終的には、サービスの境界をまたがる可能性があるテーブルを理解する(外部からの参照されているキー等)
モノリスからの分解
バックエンド機能
機能
A
機能
B
単⼀
スキーマ
バックエンド機能
機能
A
機能
B
機能A
スキーマ
機能B
スキーマ
機能A
サービス
機能B
サービス
機能A
スキーマ
機能B
スキーマ
現実の世界では2フェーズコミットなど⾊々実装していたものをマイクロサービス上でも実装が必要となる。
その為全体のトランザクションをコントロールする機能を⽤意したりする
マイクロサービス間のやり取り
機能A
サービス
機能B
サービス
XML-RPC
SOAP
Protocol Buffer
REST
API
(Application Programing Interface)
伝統的に利⽤されていたRPCよりもより技術⾮依存であるRESTが⽀持されている。
(特定の分野ではProtocol Bufferなどを利⽤するほうが良いこともあるため何でも
かんでもRESTというわけではない)
REST
• RESTは、通信プロトコルは定義されていないがHTTP上で利⽤されるのが
⼀般的である。
• 特にHTTP動詞(GET, POST , PUT等)と、URLをリソースとして扱うこ
とで⾮常に相性がよく利⽤することが出来る。例えばSOAPもHTTPで利
⽤されているが動詞部分はXML内で定義され通常はGETのみ
• REST上で流れるデータ構造はJSONそしてXMLが利⽤されます。JSONは
より容易に書くことが出来る反⾯XMLの持つリンクや厳格なデータ構造を
持つことが困難です。
コンウェイの法則
• 「あらゆる組織は、必ずその組織のコミュニケーション構造に倣った構造を持
つ設計を⽣み出す」 Melvin Conway
• 組織はアーキテクチャに、アーキテクチャは組織に倣う
• マイクロサービスアーキテクチャを採⽤する場合には、組織もそのドメインに
そうことが望ましい(有名なのは、Amazon Web Servicesにて採⽤さている
two-pizza / 2枚のピザで⾜りないほどの⼤きなチームにすべきではない)
• マイクロサービスアーキテクチャを駆動させるプラットフォーム(インフラ
層〜アプリ層までの間)を管理するチームは必要→クラウド利⽤の利点
Bluemix上でマイクロサービスを作るためには
• 最終的な各サービスは何かしらの機能を持ちそれはHTTP(S)通信を利⽤して
RESTを利⽤しJSON(またはXML)でやり取りするサービスを作る必要がありま
す。
• そしてそれらの各サービスはより容易に試験を⾏い本番環境、開発環境などに
デプロイされる必要があります。
• クラウドサービスを利⽤することでマイクロサービスを実装するのに必要なプ
ラットフォームを⼿に⼊れることが可能です。そしてマイクロサービスを実⾏
する時のハードルとなるマイクロサービスのプラットフォーム⾃体の運⽤とい
う部分を⾏わなくても良いことが最⼤のメリットです。
主なクラウドで利⽤する機能
• 継続的インテグレーション・継続的デリバリ
• 様々な形式でのアプリケーションの実装の選択肢
• API利⽤における⽀援
• 総合的なログ運⽤の実装
継続的デリバリ
• Continuous Delivery を⾏うための Build Pipelineを作ることが出来るツー
ル郡が⽤意されている。
• Build Pipelineではコードがコミットされたことを検出し、コードをチェッ
クアウトしビルド・テストそしてデプロイすることが出来る。
• 標準のBuild Pipelineでは、Cloud Foundry Application , Kubernets
ContaienrをBluemix環境にDeployするための設定がプリセットされている
ためすぐにでも継続的デリバリを始めることが出来る
Source Code
Repository
(git.ng.bluemix.net
)
Build Pipeline
(ServiceA)
serviceA
Build -002
Service B
Build-002
Service C
Build-002
Build Pipeline
(ServiceB)
Build Pipeline
(ServiceC)
Repositoryの変更を監視 Pipelineサービス上で定義された
Buildライン
成果物をサービスとしてデプロイ
Build TEST Deploy
複数の定義を組み込むことが可能
(Shellが利⽤出来るので必要があれば柔軟に対応することが出来る) 成果物 成果物
Bluemix Platform
(CF or Kubernnets)
Deploy
UNIT
テスト
性能
テスト
ひつように応じて複数のテストを実施
Bluemixという実装
• BluemixのようなPaaSやContainer環境に対してサービスをDepoyする場合に
は、利⽤者はより抽象化された中で作業を⾏う。
• 具体的にはどの物理(仮想)サーバでBuild成果物が動作しているかは⾃動的に
プロビジョニングされるため意図的な操作は不要です。またBluemixの場合には
成果物以外にもデータベースなどのサービスも簡単に利⽤する事が出来るように
構成されています。
• Buildフェーズでは、CFの場合にはソースをチェックアウトし適切なBuildpack
を元にBuild処理が実⾏され成果物(droplet)が製造される。これはVM等の場合、
⾃⾝でChef,Ansibleなどを⽤意することから⽐べれば多くの作業を軽減出来る。
成果物 成果物
Bluemix Platform
(CF or Kubernnets)
Deploy
コンテナ
コンテナ コンテナ
Buildpack
App
OS
App
OS
App
ホスト
カーネル
VM
成果物はそれぞれの⽅式
で適切に配置される
Bluemixにおける購⼊単位
適切なアーキテクチャの選択
責任範囲
ステー
トレス
従来か
らの互
換性
Blue
mix
サー
ビス
連携
開発速
度
Standar
d
Portabili
ty
Securit
y
Performan
ce
Reliabilit
y
HW OS
Bin
Lib
Code
IaaS ✓ ✓ ✓ ✓ ◎ X X ◎ ☓ ◎ ◎ ◎
Docker ✓ ✓ ○ ◎ ○ ◎ ◎ △ ◎ ○
Cloud
Foundry
✓ △ ◎ ◎ △ △ (IBM) ○ ○
Cloud
Functions
✓ ○ ☓ ☓ ◎ ☓ ☓ (IBM) ○ ○
より⼩さい機能の提供
• Function as a Serviceとしての IBM Cloud Functions (旧OpenWhisk)
• 主な2つの機能
• イベント駆動型
• あるサービスの変化(イベント)に応じて処理が実⾏される(状態変
化を監視するプログラム無しで実⾏される)現⾏では
CloudantNoSQL、MessagingHubなどと連携可能
• 関数型
• シンプルなリクエスト/レスポンス型の処理が実⾏される。特に
Function as a Serviceの場合には処理(具体的には、⾔語のFunction
部分)のみを記述することで動作する
• クラウドらしい料⾦体系
• 実⾏した回数、実⾏時間、実⾏時のメモリで課⾦がされる。
https://github.com/IBM/openwhisk-serverless-apis
マイクロサービス間の連携
変更する
サービス
PHP Nodejs
Java Java
PHP
Java
Golang
API
• 各サービス間の連携はおもにRESTで接続される
• 各サービス感は必要最低限の情報のみをやり取りする
• あるアプリケーションから見て、他のサービスはアタッチ可能な
リーソースのように振るまう
マイクロサービス間の連携
PHP
API
•Cloud Foundry, Cloud Functions のアプリケーションは、標
準でAPI保護機能を持っている。(ワンクリックでAPIのみを公
開する⽤に定義することが出来る)
•API Managementの機能はシンプルだがSwaggerをサポート
しておりスモールスタートとしては⼗分の機能を備えている
Golang
API
API
•Coustom API (Service) の機能を利⽤すると、アプリケーショ
ンからアプリケーションへ接続するための情報を環境変数として
引き渡すことが出来る。(Bluemix上のサービスのように振る舞
う。ここでは実体はなくVCAP_SERVICESのやり取りのみ)
•任意の値をJSONで引き渡すことが可能。
認証
• Cloud Foundry , Cloud Functions では API Managementの機能を利⽤
するとAPIキー発⾏の機能やOAuth連携を有効にすることが出来る。
• より⾼度な認証・認可のためにAPI Connectを利⽤することも可能。個々
のアプリケーションの認証のためには Single Signon サービスが提供さ
れている。
• (現⾏のBluemixでは発⾏されたAPIキーの操作ログを取得するサービスが
提供されていないので監査⽬的の場合にはリクエストを受ける側などで実
装が必要 or IBM Cloud Active Tracker)
統合されたログ蓄積
• Bluemixでは、Log Analyticsサービスを利⽤することでログを収集することが出来る。(サー
ビスを利⽤することで保管する容量や⼀⽇あたりの検索可能な容量を変更することが可能)
• ログ検索では標準的になってきたElasticSearch+Kibana5を利⽤
Log Analytics
サービス
Cloud Foundry
Kubernetes
VM/Bere
Loggre
gator
STDOUT,STDERR
STDOUT,STDERRLogコレ
クター
Logstas
h
LOG
Kibana
IBMの公開している情報
Microservices with IBM Cloud Functions and Cloud
Foundry
Microservices with Kubernetes
まとめ
• マイクロサービスは、様々な変化に対応する事が⽬的です。リソースの拡⼤
や新しいリリースを⾃由にする出来る事が必要です。そのために機能毎に⾃
律性・技術特異性などを持たせる必要があります。
• 現在のシステムを将来的にマイクロサービス化するかしないかにかかわらず
ドメインでシステムを分離する(またはどこが密結合しているか)を調べる
ことはシステムの安定した運⽤(障害時の影響範囲の推測など)にも有⽤
• 出来るところからマイクロサービス化/合わせてクラウドサービスの利⽤を
検討する
参考⽂献
書籍
1. マイクロサービスアーキテクチャ OʼReilly Japan / Sam Newman
2. プロダクションレディ マイクロサービス OʼReilly Japan / Susan J.Fowler
3. エリック・エヴァンスのドメイン駆動設計 (IT ArchitectsʼArchive ソフトウェア開発の実践)
Web上の情報
• Microservices https://www.ibm.com/devops/method/content/architecture/
microservices/2_0
• The Twellve Factor Apps(⽇本語)https://12factor.net/ja/

今更ながらの「マイクロサービス」