著者:アレクサンダーLukyanchikovの
翻訳:Oopsguy
オリジナル:dzone.com/articles/microservice-architecture-with-spring-cloud-and-do
[編集者注]マイクロサービスアーキテクチャを構築するために春ブーツ、春の雲、ドッカーネットフリックスといくつかのオープンソースツールを使用する方法について説明します。春の起動、アプリケーションの例と概念スプリングクラウドドッカーを使用して、共通のマイクロサービスアーキテクチャ・モデルを理解するための出発点を提供するように構築。
コードはGitHubの上で利用可能で、ミラードッカーハブに設けられています。あなただけのシステム全体を起動するコマンドを必要としています。
https://github.com/sqshq/PiggyMetrics
私は、単一のアプリケーションのバックエンドにするために使用このシステムの基礎として古いプロジェクトを選択しました。このアプリケーションは、個人的な財政の処理を提供し、オーバーヘッド収入、貯蓄管理、統計解析を整理し、簡単な予測関数を作成します。
サービスの特徴
3つのコアマイクロサービスにアプリケーション全体。彼らはすべてのいくつかのビジネス機能、組織を中心に、独立したアプリケーションのデプロイすることができます。
アカウントサービス
貯蓄とアカウント設定を記録した収入/費用:それは、一般的な入力ロジックとユーザーの検証が含まれています。
統計サービス
各アカウントのための主要な統計パラメータの計算、およびキャプチャ時系列。これは、データポイント値と正規期間に基づく通貨が含まれています。このデータは、ライフサイクルのアカウントを移動するキャッシュフローを追跡するために使用することができます。
通知サービス
ユーザの連絡先情報と(例えば、リマインダ、バックアップ頻度など)通知設定を格納します。他のサービスからスタッフに必要な情報のための手配が電子メールサブスクリプションの顧客を収集し、送信してください。
ご注意ください
-
各サービスは、独自のマイクロデータベースを持っているので、直接アクセス永続データへのAPIバイパスする方法はありません。
-
このプロジェクトでは、私は、各サービスのためのマスターデータベースとしてのMongoDBを使用しています。永続化アーキテクチャ(ポリグロットの永続化アーキテクチャ)の複数の種類を持っていることも重要です。
-
ルームサービス(サービス・ツー・サービス)通信は非常に簡単です:だけ同期通信を使用したマイクロサービスのREST API。一般的な方法は、実際にシステムがインタラクティブなスタイルの組み合わせを使用することです。例えば、GET要求は、サービスおよびメッセージ・バッファとの間のカップリングを解放するように、非同期メッセージブローカ(ブローカ)/更新操作を介して方法を使用して作成した同期データと実行を取得します。しかし、これは私たちに究極の一貫性を与えています。
インフラストラクチャサービス
分散システムの共通パターン、コアサービスは、それがどのように動作するかで記述するために私たちを助けることができます。春の雲は、これらのパターンを実装するために、スプリングブートアプリケーションの振る舞いを高めることができる強力なツールを提供します。私は簡単に説明します:
コンフィギュレーションサービス
春クラウドConfigが拡張サービスの分散システムレベルの集中構成です。このようなプラグイン可能な層(リポジトリ層)としてローカルストレージのGitとSubversionリポジトリの現在のサポートを使用します。
このプロジェクトでは、私はネイティブのプロファイルを使用し、それは単にローカルクラスパスからコンフィギュレーション・ファイルをロードします。あなたは、構成サービスのリソースで共有ディレクトリを表示することができます。さて、その形状、構成にサービス応答バックは、(すべてのクライアントアプリケーション間で共有)/通知service.ymlおよび共有/ application.ymlを共有し、サービス要求通知。
クライアントの使用
ただ、使用SPRNG-クラウドスターター-config設定は、ビルド春ブートアプリケーションを依存して、自動的に他の作業を実行するように構成されます。
今、任意の組み込みのプロパティを必要としないアプリケーションは、アプリケーション名のみとサービスのURLの設定にbootstrap.ymlを提供する必要があります。
spring:
application:
name: notification-service
cloud:
config:
uri: http://config:8888
fail-fast: true
使用春の雲Configが、あなたは、動的にアプリケーションの設定を変更することができます
例えば、EmailService Beanは@RefreshScopeコメントを使用しました。あなたは通知サービスアプリケーションを再構築し、再起動することなく、電子メールの内容や対象を変更することができることをこれが意味。
まず、コンフィギュレーションサーバのために必要な属性を変更します。その後、通知サービスリフレッシュ要求:カール-H「認可:ベアラ#トークン#」-XPOST http://127.0.0.1:8000/notifications/refresh。
また、このプロセスを自動化するウェブフックを使用することができます。
http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_push_notifications_and_spring_cloud_bus
ご注意ください
-
ダイナミックリフレッシュ、いくつかの制限があります。@RefreshScope一緒に@Configuraionクラス動作しない、と@Scheduled方法には作用しません。
-
春のブート構成アプリケーションがサービスに接続できない場合は、すぐに起動に失敗することをフェイルファスト財産手段。あなたはすべて一緒にアプリケーションを起動すると、これは非常に便利です。
-
以下の重要な安全性のヒント
正規サービス
承認のための部分的な原因は、完全にバックエンドリソースへのOAuth2トークンサービスを提供して別のサーバに抽出されます。周辺機器、通信中のユーザー間の認証とセキュリティのための認証サーバー。
このプロジェクトでは、(それが唯一のローカルアプリケーションUIで使用されているため)私は、許可の種類として、パスワードの資格情報を使用し、マイクロ正規サービスとしてクライアントの資格情報は、ユーザー認証の種類を承認しました。
それは簡単にサーバー側またはクライアントに実装することができるように春のクラウドのセキュリティは、便利な注釈や自動構成を提供します。あなたは、ドキュメント内のより多くの情報を見つけること、および認証サーバのコードで構成の詳細を確認することができます。
認証サーバコードます。https://github.com/sqshq/PiggyMetrics/tree/master/auth-service/src/main/java/com/piggymetrics/auth
ビューのクライアントの観点から、すべてが正確に、従来のセッションベースの認証と同じです。あなたは、ユーザーの役割および他の発現ベースのアクセス制御と@PreAuthorize注釈の内容を確認し、要求からPrincipalオブジェクトを取得することができます。
ブラウザのUI表示のためのバックオフィスサービス用サーバー:PiggyMetricsは、各クライアント(口座サービス、統計サービス、通知サービス、およびブラウザが)範囲を持っています。例えば、外部アクセス保護コントローラを避けることができ、我々はそう:
@PreAuthorize("#oauth2.hasScope('server')")
@RequestMapping(value = "accounts/{name}", method = RequestMethod.GET)
public List<DataPoint> getStatisticsByAccountName(@PathVariable String name) {
return statisticsService.findByAccountName(name);
}
APIゲートウェイ
あなたが見ることができるように、3つのコアサービスがあります。これらは、外部のクライアントAPIにさらされています。実際のシステムでは、この数は非常に迅速に成長することができ、システム全体が非常に複雑になります。実際には、サービスの数百人を含むことができる複雑なページをレンダリングします。
理論的には、クライアントが直接、各マイクロサービスに直接リクエストを送信することができます。しかし、これはあなたがそれぞれの情報のためのHTTPリクエストを実行されたすべてのエンドポイントのアドレスを知る必要がある場合の課題や制限は、合併がクライアントにもたらすことが方法です。もう一つの問題は、これはウェブフレンドリーなプロトコルのみをバックエンドに使用してもよいではないということです。
通常、より良いアプローチは、APIゲートウェイを使用することです。これは、適切なバックエンドサービスへのルート要求によって、またはバックエンドサービスとの重合結果の複数を呼び出すことによって、要求を処理するために、システムの単一のエントリポイントです。加えて、認証、洞察力、ストレステスト、テスト・カナリア(カナリアテスト)、移行サービスのために使用され、積極的に静的応答処理の管理を変換することができます。
重合の結果します。http://techblog.netflix.com/2013/01/optimizing-netflix-api.html
このようなエッジオープンソースNetflixのサービス、今や春の雲で、我々はそれを可能にするために@EnabledZuulProxyアノテーションを使用することができます。このプロジェクトでは、私はZuul店の静的コンテンツ(UIアプリケーション)を使用して、要求が適切なマイクロサービスにルーティングされます。以下は、通知サービス設定をルーティング単純なプレフィックス(プレフィックスベース)に基づいています。
zuul:
routes:
notification-service:
path: /notifications/**
serviceId: notification-service
stripPrefix: false
/通知に対するすべての要求が通知サービスの開始時にルーティングされることをこれが意味。あなたが見ることができるように、何のハードコーディングされたアドレスがありません。Zuulサービス発見メカニズムは、以下に説明するように、検索およびサービスインスタンスブレーカとロードバランサを通知するために使用されます。
サービス検出
もう一つの一般的なアーキテクチャのパターンは、サービスの発見です。これは、自動拡張およびアップグレード障害ので、動的にアドレスを割り当てることができる、ネットワーク・サービス・インスタンスの位置を自動的に検出することができます。
サービスの発見の重要な部分が登録されています。私は、クライアントが(使用登録サーバ)、クロスプラットフォームの場所と負荷分散の要求を使用することができるサービスインスタンスを決定する責任があるときNetflixのユーレカは、このプロジェクトを行って使用し、ユーレカクライアントは、パターン発見の良い例です。
使用春ブーツは、あなたが簡単にユーレカプロパティレジストリ(ユーレカレジストリ)を構築するために、ばねクラウドスターターユーレカ・サーバーに依存し、@ EnabledEurekaServerメモや簡単な構成を使用することができます。
クライアントのサポートを有効にするアプリケーションの名前を使用@EnabledDiscoveryClient注釈とbootstrap.yml:
spring:
application:
name: notification-service
さて、アプリケーションの起動時、それはユーレカサーバに登録されますと、このようなホストとポートヘルス・インディケーターURL、家などとして、メタデータを提供しています。ユーレカは、サービスの各下位のインスタンスからハートビートメッセージを受信します。ハートビートが設定されたスケジュールを超えて失敗した場合、例は、レジストリから削除しました。
します。http:// localhost:8761また、ユーレカもシンプルなインターフェースを提供しています、あなたはそれを介してサービスと利用できるのインスタンスを実行しているの数を追跡することができます
ロードバランシング、回路ブレーカとHTTPクライアント
NetflixのOSSは、優れたツールの別のセットを提供します。
リボン
リボンは、HTTPを十分に制御することができ、クライアントのロードバランサ、およびTCPクライアントの動作です。伝統的なロードバランサと比較すると、各ラインの呼び出しは、余分なジャンプを必要としない - あなたは直接所望のサービスを連絡することができます。
これは、春のクラウドサービスが統合され、箱から出しすることができました。ユーレカクライアントが利用可能なサーバーの動的なリストを提供し、リボンは、このようにそれらの間でバランスをとることができます。
Hystrix
Hystrixは、ネットワークアクセス失敗と遅延に依存することによって制御することができる回路遮断器の一の実施形態です。中心的な考えはマイクロサービスの数が多いと、分散環境でのカスケードの失敗を停止することです。自己修復フォールトトレラントシステムは非常に重要であるに - これはすぐに失敗し、できるだけ早く回復するのに役立ちます。
遮断器制御に加えて、哺乳は、使用中に、デフォルト値を取得するために呼び出される主なコマンドの障害が発生した場合のバックアップ方法を追加することができます。
また、Hystrixは、各コマンドの結果と遅延メトリックを生成、我々は、システムの動作を監視するためにそれを使用することができます。
見せ掛けます
装うは、宣言型のHTTPクライアント、リボンやHystrixとのシームレスな統合です。実際には、春・クラウド・スターター・装う依存と@EnabledFeignClients注釈によって、あなたは、負荷分散、回路ブレーカおよびHTTPクライアントのセットを使用することができ、かつ合理的なデフォルトの設定が付属しています。
以下は、アカウントサービスの例を示します。
@FeignClient(name = "statistics-service")
public interface StatisticsServiceClient {
@RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
void updateStatistics(@PathVariable("accountName") String accountName, Account account);
}
-
必要なのはインターフェイスです
-
あなたはSpring MVCのコントローラメソッドと装うの間@RequestMappingセクションを共有することができます
-
統計サービス、ユーレカ自動検出のおかげで(どうやらあなたが任意のリソースにアクセスするために、特定のURLを使用することができます) - 上記の例の指定のみサービスがIDが必要。
監視ダッシュボード
このプロジェクトの構成では、Hystrixは(AMQPブローカー経由)春の雲バスを介してマイクロサービスは、タービンへのインデックスをプッシュします。わずかな春のブートアプリケーションタービンとHystrixダッシュボードを使用してプロジェクトを監視します。
レスポンスアカウントサービスコールの統計情報サービスとそのアナログディレイの変化:私たちは、負荷の下でシステムの動作を見てみましょう。1秒に応じてタイムアウトしきい値セット。
ログ分析
分散環境で問題を発見しようとしたときの集中ログは非常に便利です。Elasticsearchは、LogstashとKibana技術スタックを使用すると、簡単に検索し、ログ、使用率とネットワークアクティビティデータを分析することができます。別のプロジェクトでは、私は準備ができてドッカー構成されています。
セキュリティ
高度なセキュリティ設定は、この概念的な事業の範囲を超えています。より現実的にするためには、実際のシステムをシミュレートしたマイクロサービスのパスワードへのHTTPSおよびJCEのコンテンツ暗号鍵ストアのプロパティを使用することを検討して(詳細については、マニュアルを参照してください)サーバーを設定します。
インフラ自動化
彼らは相互に依存しているため、単一のアプリケーションを展開するためのはるかに複雑なプロセスよりマイクロサービスの展開。完全に自動化された基本セットは非常に重要です。私たちは、連続的送達の方法により、以下のメリットを受けることができます。
-
任意の時点でソフトウェアの機能を公開。
-
いずれの建物は、最終的にリリースになる可能性があります。
-
工作物の建設(アーティファクト)はかつて、必要に応じて、展開します。
これは、このプロジェクトで実装簡単な連続配信ワークフロー、次のとおりです。
この構成では、各成功したGitのためのトラビスCIは、画像タグを作成するためにプッシュします。そのため、最新の各マイクロドッカーハブサービスは、ミラーがあるでしょうが、それ以上の年齢のGitのミラーイメージは、ハッシュマークを使用して提出しました。必要な場合は、簡単にそれらのいずれかを展開し、かつ迅速にロールバックすることができます。
すべてを実行するには?
それは本当に簡単です、私はあなたがそれを試すことをお勧めします。あなたは8春ブートアプリケーション、4つのMongoDBインスタンスとRabbitMQのを開始したいということを覚えておいてください。お使いのマシンに4GBのメモリがあることを確認してください。あなたは、ゲートウェイ、レジストリ、コンフィギュレーション、認証およびアカウントサービスセンターの運用を通じて、常に重要なサービスをすることができます。
実行する前に
-
インストールとドッカードッカー作曲。
-
設定の環境変数:CONFIG_SERVICE_PASSWORD、NOTIFICATION_SERVICE_PASSWORD、STATISTICS_SERVICE_PASSWORD、ACCOUNT_SERVICE_PASSWORD、MONGODB_PASSWORD
生産のモード
このモードでは、すべての最新のミラーはハブドッカーから引っ張られます。コピードッキングウィンドウ-compose.ymlと-dまでドッキングウィンドウ-コンを実行するには、することができます。
開発モデル
あなたがあなた自身のイメージを構築したい場合(例えば、コード内のいくつかの変更)は、すべての倉庫(倉庫)を複製し、Mavneビルドの成果物(アーティファクト)を使用する必要があります。その後、ドッキングウィンドウ・コン-fを実行するドッキングウィンドウ-compose.yml -fドッキングウィンドウ-compose.dev.ymlアップ-d
ドッキングウィンドウ-compose.dev.ymlは、ドッキングウィンドウ-compose.ymlを継承し、追加の設定が付属して、ミラーをローカルに構築することができ、開発を容易にするために、すべてのコンテナ港にさらされます。
重要なエンドポイント(エンドポイント)
-
ローカルホスト:80 - ゲートウェイ
-
localhostを:8761 - ユーレカダッシュボード
-
localhostを:9000 - Hystrixダッシュボード
-
localhostを:8989 - タービンストリーム(Hystrixダッシュボードのソース)
-
ローカルホスト:15672 - RabbitMQの管理
ご注意ください
すべての春ブートアプリケーションが起動する設定サーバを実行する必要があります。春ブーツのおかげでフェイルファストプロパティおよび再起動をドッキングウィンドウは、compsoe:常にオプションは、我々は同時にすべてのコンテナを開始することができます。すべてのコンテナに依存していることを、この手段は、構成サーバーまで、これまで実行しているまで再起動を試みます。
すべてのアプリケーションが起動した後、さらに、サービスディスカバリメカニズムは、ある程度の時間がかかります。、そのローカルキャッシュにユーレカ・サーバとクライアントが同じメタデータを持っている前の例では、サービスは、それが3拍子をとることができ、任意のクライアントの発見のためには使用できません。30秒のデフォルトのハートビート間隔。