Microservice-architecture-quick-guide
マイクロサービスアーキテクチャ-はじめに
マイクロサービスは、サービスベースのアプリケーション開発方法論です。 この方法論では、大きなアプリケーションは最小の独立したサービスユニットに分割されます。 マイクロサービスは、アプリケーション全体を相互接続されたサービスのコレクションとして分割することにより、サービス指向アーキテクチャ(SOA)を実装するプロセスであり、各サービスは1つのビジネスニーズのみに対応します。
Going Microのコンセプト
サービス指向アーキテクチャでは、ソフトウェアパッケージ全体が小さな相互接続されたビジネスユニットに細分されます。 これらの各小規模ビジネスユニットは、異なるプロトコルを使用して互いに通信し、クライアントにビジネスを成功させます。 さて、問題は、Microservice Architecture(MSA)がSOAとどう違うのかということです。 一言で言えば、SOAは設計パターンであり、MicroserviceはSOAを実装するための実装方法論です。または、MicroserviceはSOAの一種と言えます。
以下は、マイクロサービス指向のアプリケーションを開発する際に留意する必要があるいくつかのルールです。
- 独立-各マイクロサービスは独立して展開可能でなければなりません。
- カップリング-すべてのマイクロサービスは、一方の変更が他方に影響を与えないように、互いに疎結合する必要があります。
- ビジネス目標-アプリケーション全体の各サービスユニットは、最小であり、1つの特定のビジネス目標を達成できる必要があります。
マイクロサービスを詳細に理解するためのオンラインショッピングポータルの例を考えてみましょう。 次に、このEコマースポータル全体を、ユーザー管理、注文管理、チェックイン、支払い管理、配送管理などの小規模ビジネスユニットに分割します。 1つの注文を成功させるには、特定の時間枠内でこれらすべてのモジュールを進める必要があります。 以下は、1つの電子商取引システムに関連付けられたさまざまなビジネスユニットの統合イメージです。
これらの各ビジネスモジュールには、独自のビジネスロジックと利害関係者が必要です。 特定のニーズのために、他のサードパーティベンダーソフトウェアとも通信します。 たとえば、注文管理はユーザー管理と通信してユーザー情報を取得できます。
ここで、前述のこれらすべてのビジネスユニットでオンラインショッピングポータルを実行していることを考慮すると、フロントエンド、バックエンド、データベースなどの異なるレイヤーで構成されるエンタープライズレベルのアプリケーションが必要になります。 アプリケーションが1つのwarファイルでスケーリングおよび完全に開発されていない場合、典型的なモノリシックアプリケーションとして呼び出されます。 IBMによると、典型的なモノリシックアプリケーションは、すべてのユーザーリクエストを処理するエンドポイントまたはアプリケーションが1つだけである場合、内部的に次のモジュール構造を持つ必要があります。
上の画像では、さまざまなユーザーとビジネスデータを保存するためのデータベースなど、さまざまなモジュールを見ることができます。 フロントエンドには、使用するユーザーまたはビジネスデータを通常レンダリングする別のデバイスがあります。 途中には、ユーザーエンドからのリクエストを受け入れ、リソースの助けを借りてそれを処理し、ユーザーに戻すレンダリング可能なEARまたはWARファイルである1つのパッケージがあります。 ビジネスが上記の例の変更を必要とするまで、すべてがうまくいきます。
ビジネスニーズに応じてアプリケーションを変更する必要がある次のシナリオを検討してください。
ビジネスユニットでは、「検索」モジュールにいくつかの変更が必要です。 次に、検索プロセス全体を変更し、アプリケーションを再デプロイする必要があります。 その場合、他のユニットを変更せずに再デプロイします。
ここでも、ビジネスユニットは「ウォレット」オプションを含めるために「チェックアウト」モジュールでいくつかの変更が必要です。 「チェックアウト」モジュールを変更し、サーバーに再デプロイする必要があります。 ソフトウェアパッケージのさまざまなモジュールを再デプロイしていることに注意してください。ただし、変更は加えていません。 ここに、マイクロサービスアーキテクチャにより固有のサービス指向アーキテクチャの概念があります。 ソフトウェアの各モジュールが独立したユニットとして動作し、単一のビジネスタスクを独立して処理できるように、モノリシックアプリケーションを開発できます。
次の例を考えてください。
上記のアーキテクチャでは、コンパクトなエンドツーエンドサービスでearファイルを作成していません。 代わりに、ソフトウェアのさまざまな部分をサービスとして公開することで分割しています。 ソフトウェアのどの部分でも、それぞれのサービスを消費することで簡単に相互に通信できます。 これが、最新のWebアプリケーションでマイクロサービスが大きな役割を果たす方法です。
マイクロサービスのラインでのショッピングカートの例を比較しましょう。 「検索」、「フィルター」、「チェックアウト」、「カート」、「推奨」などのさまざまなモジュールでショッピングカートを分類できます。 ショッピングカートポータルを構築する場合は、上記のモジュールを互いに接続して、24時間365日の優れたショッピングエクスペリエンスを提供できるように構築する必要があります。
長所と短所
以下は、モノリシックアプリケーションを使用する代わりにマイクロサービスを使用する利点に関するいくつかのポイントです。
利点
- サイズが小さい-マイクロサービスはSOA設計パターンの実装です。 できる限りサービスを維持することをお勧めします。 基本的に、サービスは複数のビジネスタスクを実行するべきではないため、他のモノリシックアプリケーションよりも明らかにサイズが小さく、保守が容易です。
- Focused -前述のように、各マイクロサービスは1つのビジネスタスクのみを提供するように設計されています。 マイクロサービスを設計する際、アーキテクトはサービスの焦点、つまり成果物について心配する必要があります。 定義上、1つのマイクロサービスは本質的にフルスタックであり、1つのビジネスプロパティのみを提供することに専念する必要があります。
- 自律-各マイクロサービスは、アプリケーション全体の自律的なビジネスユニットである必要があります。 したがって、アプリケーションはより疎結合になり、メンテナンスコストの削減に役立ちます。
- テクノロジーの不均一性-マイクロサービスは、1つのビジネスユニットで互いに通信するためのさまざまなテクノロジーをサポートしています。これにより、開発者は正しい場所で正しいテクノロジーを使用できます。 異種システムを実装することにより、最大のセキュリティ、速度、およびスケーラブルなシステムを取得できます。
- レジリエンス-レジリエンスは、ソフトウェアユニットを分離する特性です。 マイクロサービスは、方法論の構築において高いレベルの回復力を備えているため、1つのユニットが失敗しても、ビジネス全体に影響を与えることはありません。 復元力は、非常にスケーラブルで結合の少ないシステムを実装するもう1つのプロパティです。
- 展開の容易さ-アプリケーション全体が小さなユニットに分割されているため、すべてのコンポーネントは本質的にフルスタックである必要があります。 これらはすべて、同じ種類の他のモノリシックアプリケーションとは異なり、時間の複雑さを軽減しながら、あらゆる環境に非常に簡単に展開できます。
次に、マイクロサービスアーキテクチャの欠点に関するいくつかのポイントを示します。
デメリット
- 分散システム-技術的な異質性により、マイクロサービスのさまざまな部分を開発するためにさまざまなテクノロジーが使用されます。 この巨大な異種分散ソフトウェアをサポートするには、熟練した専門家の膨大なセットが必要です。 したがって、分散と不均一性は、マイクロサービスを使用することの最大の欠点です。
- コスト-さまざまなビジネスタスクのためにさまざまなサーバースペースを維持する必要があるため、マイクロサービスはコストがかかります。
- エンタープライズ対応-技術は日々進化しているため、マイクロサービスアーキテクチャはさまざまな技術の集合体と考えることができます。 したがって、マイクロサービスアプリケーション企業を従来のソフトウェア開発モデルと比較する準備を整えることは非常に困難です。
SOAを介したマイクロサービス
次の表に、SOAとマイクロサービスの特定の機能をリストし、SOAよりもマイクロサービスを使用することの重要性を示します。
Component | SOA | Microservice |
---|---|---|
Design pattern | SOA is a design paradigm for computer software, where software components are exposed to the outer world for usage in the form of services. | Micro Service is a part of SOA. It is a specialized implementation of SOA. |
Dependency | Business units are dependent on each other. | All business units are independent of each other. |
Size | Software size is bigger than the conventional software. | Software size is small. |
Technology | Technology stack is less than Microservice. | Microservice is heterogeneous in nature as exact technologies are used to perform a specific task. Microservices can be considered as a conglomerate of many technologies. |
Autonomous and Focus | SOA applications are built to perform multiple business tasks. | Microservice applications are built to perform a single business task. |
Nature | Monolithic in nature. | Full stack in nature. |
Deployment | Deployment is time-consuming. | Deployment is very easy. Hence, it will be less time-consuming. |
Cost-effectiveness | More cost-effective. | Less cost-effective. |
Scalability | Less compared to Microservices. | Fully scaled. |
Example |
Let us consider one online CAB booking application. If we want to build that application using SOA, then its software units will be −
a |
同じアプリケーションがマイクロサービスアーキテクチャを使用して構築されている場合、そのAPIは次のようになります-
|
マイクロサービスアーキテクチャ-スケーリング
スケーリングとは、異なる単位でソフトウェアを分解するプロセスです。 スケーリングは、スケーラビリティに関しても定義します。 スケーラビリティは、アプリケーションのより高度な機能を実装する可能性です。 これにより、アプリケーションのセキュリティ、耐久性、および保守性が向上します。 業界で採用されている3種類のスケーリング手順があります。 次に、さまざまなスケーリング方法と対応する実際の例を示します。
X軸のスケーリング
X軸スケーリングは、水平スケーリングとも呼ばれます。 この手順では、アプリケーション全体が異なる水平部分に細分されます。 通常、どのWebサーバーアプリケーションでもこのタイプのスケーリングを使用できます。 次の図に示すように、水平方向のスケーリングに従う通常のMVCアーキテクチャを検討します。
例として、JSPサーブレットアプリケーションを検討できます。 このアプリケーションでは、コントローラーがすべての要求を制御し、必要に応じてモデルと通信することでビューを生成します。 通常、モノリシックアプリケーションはこのスケーリング方法に従います。 X軸のスケーリングは本質的に非常に基本的なものであり、非常に時間がかかりません。 この方法では、ユニットが担当するさまざまなタスクに応じて、1つのソフトウェアがスケーリングされます。 たとえば、コントローラーは着信および発信リクエストの制御を担当し、ビューはブラウザーでユーザーにビジネス機能を表す責任を負います。一方、モデルはデータを格納し、データベースとして機能します。
Y軸のスケーリング
Y軸スケーリングは、リソースレベルのスケーリングを含む垂直スケーリングとも呼ばれます。 DBaaSまたはHadoopシステムは、Y軸にスケーリングされていると見なすことができます。 このタイプのスケーリングでは、ユーザーリクエストはリダイレクトされ、何らかのロジックを実装することにより制限されます。
Facebookを例として考えてみましょう。 Facebookは毎秒179万人のユーザーを処理する必要があります。したがって、トラフィックを制御することは、Facebookネットワークエンジニアの大きな責任です。 危険を克服するために、彼らは同じアプリケーションで複数のサーバーを同時に実行することを含むY軸のスケーリングに従います。 この巨大なレベルのトラフィックを制御するために、Facebookは画像に示されているように、すべてのトラフィックを1つの地域から特定のサーバーにリダイレクトします。 この領域に基づいたトラフィックの転送は、アーキテクチャ言語では負荷分散と呼ばれます。
リソースを小さな独立したビジネスユニットに分割するこの方法は、Y軸スケーリングと呼ばれます。
Z軸のスケーリング
X軸とY軸のスケーリングは非常に理解しやすいです。 ただし、1つのアプリケーションをビジネスレベルでスケーリングすることもできます。これをZ軸スケーリングと呼びます。 以下は、事業部門のさまざまな業種でのタクシーサービスアプリケーションのスケーリングの例です。
スケーリングの利点
- コスト-ソフトウェアの適切なスケーリングにより、メンテナンスのコストが削減されます。
- パフォーマンス-疎結合のため、適切にスケーリングされたソフトウェアのパフォーマンスは、スケーリングされていないソフトウェアよりも常に優れています。
- 負荷分散-さまざまなテクノロジーを使用して、サーバーの負荷を簡単に維持できます。
- 再利用-ソフトウェアのスケーラビリティにより、ソフトウェアの使いやすさが向上します。
マイクロサービスアーキテクチャ-ブループリント
MicroserviceはSOAを内部的に実装します。 より広い意味では、1つのSOAアプリケーションのサブセットと考えることができます。
ルールとワークフロー
以下は、マイクロサービスを開発する際に注意する必要がある原則です。
- High Cohesion -すべてのビジネスモデルを可能な限り最小のビジネスパーツに細分化する必要があります。 各サービスは、1つのビジネスタスクのみを実行するように集中する必要があります。
- 独立-すべてのサービスは本質的にフルスタックであり、互いに独立している必要があります。
- ビジネスドメイン中心-ソフトウェアはビジネスユニットに従ってモジュール化され、階層ベースではありません。
- 自動化-展開のテストが自動化されます。 最小限の人間の相互作用を導入してみてください。
- 監視可能-各サービスは本質的にフルスタックであり、エンタープライズアプリケーションのように独立して展開および監視できる必要があります。
チーム管理
「2つのピザルール」は、マイクロサービス開発チームの参加者の数を制限する一種のルールです。 このルールによると、1つのアプリケーションのチームメンバーの数は、2つのピザで食事を提供できるほど少ない必要があります。 通常、この数は8を超えてはなりません。 マイクロサービスは本質的にフルスタックであるため、チームも本質的にフルスタックです。 生産性を高めるには、そのサービスに必要なあらゆる種類の専門知識を持つ最大8人のメンバーからなる1つのチームを構築する必要があります。
タスク管理
タスクは、ソフトウェア開発のライフサイクルにおける重要な役割です。 大規模アプリケーションの開発は、いくつかの小さなタスク単位に分割できます。 Facebookなどの1つのアプリケーションを開発する必要があると考えてみましょう。 次に、「ログイン」機能は、ビルドプロセス全体のタスクと見なすことができます。 これらの各タスクの進捗状況は、高度なスキルを持つ専門家の下で適切に監視する必要があります。 アジャイルは、優れたタスク管理に対応するために業界で採用されている有名なプロセス構造です。
さまざまな要素
これまで、Microserviceとは何か、そして最新のMVCアーキテクチャ上でのMicroserviceの基本的なニーズは何かを学びました。 この章では、サービスにとって等しく重要なこのアーキテクチャのさまざまな要素について学びます。
サービスのカテゴリー
Microserviceという名前では、それがHTTPプロトコルで消費できるサービスであると想定していますが、このアーキテクチャを使用して構築できるサービスの種類を知る必要があります。 以下は、マイクロサービスアーキテクチャを使用して実装できるサービスのリストです。
*Platform as a Service [PaaS]* -このサービス指向アーキテクチャでは、プラットフォームはビジネスニーズに応じてカスタマイズできるツールとして提供されます。 PaaSは、モバイルアプリケーション開発で重要な役割を果たします。 PaaSの最も良い例は、Googleがアプリケーションを構築するためのさまざまな便利なプラットフォームを提供するGoogle Appエンジンです。 PaaSはもともと、開発者に組み込みのアーキテクチャまたはインフラストラクチャを提供するために開発されました。 劇的に短縮された時間で、高レベルのプログラミングの複雑さを軽減します。 以下は、Googleが提供するPaaSのスナップショットです。
*Software as a Service [SaaS]* -Software as a Serviceは、ソフトウェアライセンス事業であり、ソフトウェアは集中的にホストされ、サブスクリプションベースでライセンスされます。 SaaSは主にブラウザからアクセスでき、人事管理(HRM)、エンタープライズリソースプランニング(ERP)、顧客関係管理(CRM)などの多くのビジネス分野で非常に一般的なアーキテクチャパターンです。 次のスクリーンショットは、Oracleが提供するさまざまなSaaSの例を示しています。
*Infrastructure as a Service [IaaS]* -インフラストラクチャはIT業界で優れた役割を果たします。 クラウドコンピューティングを使用して、一部の組織はサービスとして仮想インフラストラクチャを提供しています。 IaaSは、俊敏性、費用対効果、セキュリティ、パフォーマンス、生産性などをもたらすのに非常に役立ちます。 ソフトウェア開発で。 Amazon EC2とMicrosoft Azureは、IaaSの最大の例です。 次の画像は、データセンターがIaaSとして提供されているAWSの例を示しています。
*Data as a Service [DaaS]* -情報技術はデータを扱い、業界のトップリーダーの一部は、データが社会の新たな糧になると考えています。 DaaSは、調査と分析のためにビジネスコングロマリットとデータを共有するサービスの一種です。 DaaSは、データアクセスレイヤーにシンプルさ、俊敏性、セキュリティをもたらします。 以下は、独自のビジネスニーズにアクセスしたりライセンスを付与したりできるOracle Dataクラウドの例です。
- サービスとしてのバックエンド[BaaS] *-BaaSはMBaaSとも呼ばれ、サービスとしてのモバイルバックエンドを意味します。 このタイプのサービスでは、アプリケーションのバックエンドは、ビジネスベンチャーのビジネスユニットに提供されます。 すべてのプッシュ通知、ソーシャルネットワーキングサービスは、このタイプのサービスに分類されます。 FacebookとTwitterは、有名なBaaSサービスプロバイダーの例です。
セキュリティ
大量の顧客データを扱う場合、セキュリティが重要な役割を果たします。 セキュリティの問題は、市場で利用可能なあらゆる種類のサービスに関連しています。 プライベート、パブリック、ハイブリッドなど、使用しているクラウドが何であれ、セキュリティはすべてのレベルで維持する必要があります。 全体のセキュリティ問題は、次の部分に大きく分けることができます-
- サービスプロバイダーが直面するセキュリティ問題-このタイプのセキュリティ問題は、Google、Amazonなどのサービスプロバイダーが直面しています。 セキュリティ保護を確保するために、特にクラウドのコア部分に直接アクセスするユーザーのバックグラウンドチェックが必要です。
- 消費者が直面するセキュリティの問題-クラウドはコストにやさしいため、業界全体で広く使用されています。 一部の組織では、ユーザーの詳細をサードパーティのデータセンターに保存し、必要に応じてデータを引き出します。 したがって、ある顧客の個人データが他のユーザーに見えないように、セキュリティレベルを維持することが必須です。
上記のセキュリティ問題を防ぐために、組織で使用される防御メカニズムの一部を以下に示します。
- Deterrent Control -サイバー攻撃を減らすための潜在的な脅威を知っています。
- 予防制御-クラウドにアクセスするための高レベルの認証ポリシーを維持します。
- Detective Control -ユーザーを監視し、潜在的なリスクを検出します。
- 修正コントロール-さまざまなチームと緊密に連携し、探偵コントロールフェーズで発生する問題を修正します。
構成パターン
ソフトウェア構成とは、ソフトウェア製品を構築する方法を意味します。 基本的に、ソフトウェアのさまざまなモジュールが特定のビジネス目標のために通信する高レベルのソフトウェアアーキテクチャ図を扱います。 この章では、組織で広く使用されているさまざまなソフトウェア構成パターンについて学習します。 マイクロサービスでは、各機能を1つのプロセスに分割します。 これらの各サービスは、本質的に独立したフルスタックです。
機能分解は、マイクロサービスの構築に重要な役割を果たします。 アプリケーションに俊敏性、柔軟性、およびスケーラビリティを提供します。
アグリゲーターパターン
アグリゲーターパターンは、マイクロサービスの開発中に実装できる最も単純なWebパターンです。 この構成パターンでは、単純なWebモジュールがロードバランサーとして機能します。つまり、要件に応じてさまざまなサービスを呼び出します。 以下は、アグリゲーター設計を備えたシンプルなマイクロサービスWebアプリを示す図です。 次の図に示すように、「アグリゲーター」は、さまざまなサービスを1つずつ呼び出す役割を果たします。 サービスA、B、Cの結果にビジネスロジックを適用する必要がある場合は、アグリゲーター自体にビジネスロジックを実装できます。
アグリゲーターは、別のサービスとして再び外部に公開することができ、必要に応じて他のサービスで使用できます。 アグリゲーターパターンWebサービスを開発する際には、サービスA、B、Cのそれぞれが独自のキャッシングレイヤーを持ち、本質的にフルスタックであることに留意する必要があります。
プロキシパターン
プロキシマイクロサービスパターンは、アグリゲーターモデルのバリエーションです。 このモデルでは、集約モジュールの代わりにプロキシモジュールを使用します。 プロキシサービスは、異なるサービスを個別に呼び出す場合があります。
プロキシパターンでは、ダンププロキシレイヤーを提供することにより、1レベルの追加のセキュリティを構築できます。 この層は、インターフェースと同様に機能します。
連鎖パターン
名前が示すように、このタイプの構成パターンはチェーン構造に従います。 ここでは、クライアント層とサービス層の間に何も使用しません。 代わりに、クライアントがサービスと直接通信できるようにし、1つのサービスの出力が次のサービスの入力になるように、すべてのサービスをチェーン化します。 次の画像は、典型的な連鎖パターンのマイクロサービスを示しています。
このアーキテクチャの大きな欠点の1つは、プロセス全体が完了するまでクライアントがブロックされることです。 したがって、チェーンの長さをできるだけ短くすることを強くお勧めします。
ブランチマイクロサービスパターン
ブランチマイクロサービスは、アグリゲーターパターンとチェーンパターンの拡張バージョンです。 この設計パターンでは、クライアントはサービスと直接通信できます。 また、1つのサービスが一度に複数のサービスと通信できます。 次に、Branch Microserviceの図を示します。
ブランチマイクロサービスパターンにより、開発者はサービス呼び出しを動的に構成できます。 すべてのサービス呼び出しは同時に行われます。つまり、サービスAはサービスBとCを同時に呼び出すことができます。
共有リソースパターン
共有リソースパターンは、実際には前述のすべてのタイプのパターンの集合体です。 このパターンでは、クライアントまたはロードバランサーは必要に応じて各サービスと直接通信します。 これは、ほとんどの組織で広く採用されている最も効果的な設計パターンです。 以下は、共有リソースの設計パターンを図で表したものです。
マイクロサービスアーキテクチャ-ハンズオンSOA
この章では、SOAアーキテクチャを使用したCRUDベースのアプリケーションを開発します。 後の章で、このサービスをマイクロサービスに分割し、SOAとマイクロサービスアーキテクチャの基本的な違いを学習します。
システム構成とセットアップ
このセクションでは、サンプルのCRUDアプリケーションを作成します。このアプリケーションは、サービスを呼び出すたびにJSONオブジェクトを応答として返します。 Jerseyフレームワークを使用して同じものを開発します。 以下は、ローカルシステム環境をセットアップする手順です。
CRUDアプリケーションの開発
- ステップ1 *-NetBeansを開発IDEとして使用します。 NetBeansの公式Webサイトhttps://netbeans.org/downloads/で入手可能な最新バージョンをダウンロードしてインストールしてください。
- ステップ2 *-NetBeans IDEを開きます。 「ファイル→新規プロジェクト」に進みます。 次のスクリーンショットが表示されます。 カテゴリとして「Maven」を選択し、プロジェクトとして「Project from ArchType」を選択して、「次へ」をクリックします。
これにより、必要なすべてのjarファイルがダウンロードされ、初めてのMavenプロジェクトとRESTful Webサービスが作成されます。
- ステップ3 *-前のステップで[次へ]ボタンを押すと、次のスクリーンショットが表示されます。 ここでは、Mavenアーキタイプを指定する必要があります。
検索ボックスで「Jersey-archType-Webapp(2.16)」を検索し、「Show Older」チェックボックスをオンにします。
- ステップ4 *-同じものを選択すると、次の画面にリダイレクトされます。 リストから優先jarを選択し、[次へ]をクリックして続行します。
- ステップ5 *-このステップでは、プロジェクトの名前とグループID、およびパッケージの詳細を指定する必要があります。 これらの情報をすべて入力したら、[完了]をクリックして続行します。
- ステップ6 *-ワークスペースのセットアップが完了しました。 プロジェクトディレクトリは次のようになります。
「依存関係」フォルダーを確認すると、Mavenがこのプロジェクトに必要なすべてのjarファイルを自動的にダウンロードしていることがわかります。
- ステップ7 *-ワークスペースがセットアップされ、コーディングを開始できます。 次のスクリーンショットで説明するように、4つのクラスとパッケージを作成します。 Mavenは独自のWebサービスを構築することを検出するのに十分なほど賢いため、MyResource.javaはMavenによってすでに作成されています。
- ステップ8 *-上記のステップが完了したら、次のようにUserProfile.javaであるPOJOクラスを構築します。
package com.finddevguides.userprofile.Model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class UserProfile {
private long ProId;
private String FName;
private String LName;
private String Add;
public UserProfile(){}
public UserProfile(long Proid, String Fname, String Lname,String Add) {
this.ProId = Proid;
this.FName = Fname;
this.LName = Lname;
this.Add = Add;
}
public long getProId() {
return ProId;
}
public void setProId(long ProId) {
this.ProId = ProId;
}
public String getFName() {
return FName;
}
public void setFName(String FName) {
this.FName = FName;
}
public String getLName() {
return LName;
}
public void setLName(String LName) {
this.LName = LName;
}
public String getAdd() {
return Add;
}
public void setAdd(String Add) {
this.Add = Add;
}
}
- ステップ9 *-データベースクラスを作成します。 これは学習教材の一部であるため、データベースとしてDBを使用しません。 組み込みのJavaメモリを使用して、一時メモリとして動作します。 次のコードセットでわかるように、データベースとしてMAPを使用します。 実行するすべてのWebサービス操作は、クラスで定義されたこのMAPで作業します。
package com.finddevguides.userprofile.DAO;
import com.finddevguides.userprofile.Model.UserProfile;
import java.util.HashMap;
import java.util.Map;
public class DatabaseClass {
private static Map<Long,UserProfile> messages = new HashMap<Long,UserProfile>();
public static Map<Long,UserProfile> getUsers() {
return messages;
//Each time this method will return entire map as an instance of database
}
}
- ステップ10 *-サービスクラスを作成しましょう。 先に進み、「ProfileService.java」クラスに次のコードセットをコピーして貼り付けます。 これは、外部に公開されるすべてのWebサービスメソッドを宣言するクラスです。 このクラスで一時データベースにアクセスできるように、DatabaseClassの参照を1つ作成する必要があります。
package com.finddevguides.userprofile.service;
import com.finddevguides.userprofile.DAO.DatabaseClass;
import com.finddevguides.userprofile.Model.UserProfile;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ProfileService {
private Map<Long,UserProfile> Userprofiles = DatabaseClass.getUsers();
//Creating some predefine profile and populating the same in the map
public ProfileService() {
UserProfile m1 = new UserProfile(1L,"Tutorials1","Point1","finddevguides.com");
UserProfile m2 = new UserProfile(2L,"Tutorials2","Point2","finddevguides.com2");
UserProfile m3 = new UserProfile(3L,"Tutorials3","Point3","finddevguides.com3");
UserProfile m4 = new UserProfile(4L,"Tutorials4","Point4","finddevguides.com4");
Userprofiles.put(1L, m1);
Userprofiles.put(2L, m2);
Userprofiles.put(1L, m3);
Userprofiles.put(2L, m4);
}
//Method to fetch all profile
public List<UserProfile> getAllProfile() {
List<UserProfile> list = new ArrayList<UserProfile>(Userprofiles.values());
return list;
} //Method to fetch only one profile depending on the ID provided
public UserProfile getProfile(long id) {
return Userprofiles.get(id);
} //Method to add profile
public UserProfile addProfile(UserProfile UserProfile) {
UserProfile.setProId(Userprofiles.size()+1);
Userprofiles.put(UserProfile.getProId(), UserProfile);
return UserProfile;
} //method to update Profile
public UserProfile UpdateProfile(UserProfile UserProfile) {
if(UserProfile.getProId()<=0) {
return null;
} else {
Userprofiles.put(UserProfile.getProId(), UserProfile);
return UserProfile;
}
}//method to delete profile
public void RemoveProfile(long Id) {
Userprofiles.remove(Id);
}
}
- ステップ11 *-このステップでは、URLにリンクされるResourceクラスを作成し、対応するサービスが呼び出されます。
package com.finddevguides.userprofile.Resource;
import com.finddevguides.userprofile.Model.UserProfile;
import com.finddevguides.userprofile.service.ProfileService;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/Profile")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class ProfileResource {
ProfileService messageService = new ProfileService();
@GET
public List<UserProfile> getProfile() {
return messageService.getAllProfile();
}
@GET
@Path("/{ProID}")
public UserProfile getProfile(@PathParam("ProID")long Id) {
return messageService.getProfile(Id);
}
@POST
public UserProfile addProfile(UserProfile profile) {
return messageService.addProfile(profile);
}
@PUT
@Path("/{proID}")
public UserProfile UpdateProfile(@PathParam("proID")long Id,UserProfile UserProfile) {
UserProfile.setProId(Id);
return messageService.UpdateProfile(UserProfile);
}
@DELETE
@Path("/{ProID}")
public void deleteProfile(@PathParam("ProID")long Id) {
messageService.RemoveProfile(Id);
}
}
ステップ12 *-プロジェクトをクリーンビルドして実行します。 すべてがうまくいけば、 *http://localhost:8080/UserProfile/webapi/Profile” URLにアクセスしながら、ブラウザーで次の出力を取得する必要があります。
XML表現を使用してさまざまなエントリが入力されていることがわかります。
適切なメソッドURLを適用することにより、Postmanを使用して別のメソッドをテストできます。
- @ GETメソッド*-次のスクリーンショットは、すべてのユーザーの詳細を返すgetリクエストに必要な結果を取得する方法を示しています。
*@ POST* -次のリクエストを使用して、Postメソッドをテストできます。 proIdが自動的に生成されていることに注意してください。
*@ PUT* -このメソッドはエントリを更新します。 次のスクリーンショットは、JerseyがリクエストURLからproIdを取得し、同じユーザープロファイルの返信を更新する方法を示しています。
同様に、Webサービスで利用可能な他のメソッドを確認できます。
前のセクションでは、CRUD機能を公開する1つのサービスを開発しました。 このサービスをアプリケーションに実装しようとするたびに、このアプリケーションのクライアントを作成し、アプリケーションにアタッチする必要があります。 この章では、マイクロサービスの概念を使用してこの機能を構築する方法を学習します。 以下は、上記の手順を使用して構築されたアプリケーションの図表示です。
アクターは、サービスのエントリポイントである必要があります。 この場合、「ProfileResource.java」がアクターの役割を果たします。 このクラスはさまざまなメソッドを呼び出して、追加、更新、削除などのさまざまな操作を実行します。
CRUDアプリケーションの分解
マイクロサービスの主な原則によれば、各モジュールに必要なビジネスタスクは1つだけであるため、1つのアクターが4つのCRUD機能すべてを担当することはできません。 MicroserviceがSOAのアーキテクチャ表現であることが概念的に明確になるように、いくつかの新しい役割を導入した次の例を考えてください。
「メインユーザー」とは、自分のニーズに応えるために「アプリケーションコントローラー」と通信するユーザーです。 「アプリケーションコントローラー」は、エンドユーザーからの要求に応じて異なる「リソースマネージャー」を呼び出すだけです。 「リソースマネージャー」は、実行する必要があるジョブを実行します。 アプリケーションのさまざまなユニットのさまざまな役割を簡単に見てみましょう。
- エンドユーザー/メインユーザー-アプリケーションコントローラーへのいくつかのリソースのリクエスト。
- アプリケーション-リクエストを受信し、それを特定のリソースマネージャーに転送します。
- リソースマネージャー-ユーザーの更新、削除、および追加の実際のジョブを実行します。
1つのクラスの合計責任が他の異なるクラスにどのように分散されるかを確認してください。
マイクロサービスアーキテクチャ-ハンズオンMSA
この章では、利用可能なさまざまなサービスを使用する1つのマイクロサービスアプリケーションを構築します。 私たちは皆、マイクロサービスがアプリケーションを構築するための費用対効果の高い方法ではないことを知っています。なぜなら、私たちが構築する各サービスは本質的にフルスタックになるからです。 ローカル環境でマイクロサービスを構築するには、ある時点で使用できるようにサーバーのインスタンスを4つ実行し続ける必要があるため、ハイエンドのシステム構成が必要になります。 初めてのマイクロサービスを構築するために、利用可能なSOAエンドポイントのいくつかを使用し、アプリケーションで同じものを使用します。
システム構成とセットアップ
ビルドフェーズに進む前に、それに応じてシステムを準備します。 いくつかのパブリックWebサービスが必要になります。 これは簡単にグーグルで検索できます。 SOAP Webサービスを使用する場合、1つのWSDLファイルを取得し、そこから特定のWebサービスを使用する必要があります。 RESTサービスの場合、同じものを消費するために必要なリンクは1つだけです。 この例では、1つのアプリケーションで3つの異なるWebサービス「SOAP」、「REST」、および「カスタム」をジャムします。
アプリケーションアーキテクチャ
マイクロサービス実装計画を使用して、Javaアプリケーションを作成します。 カスタムサービスを作成し、このサービスの出力が他のサービスの入力として機能します。
以下は、マイクロサービスアプリケーションを開発するための手順です。
ステップ1:SOAPサービスのクライアント作成-Webサービスを学習するために利用できる無料のWeb APIが数多くあります。 このチュートリアルでは、「http://www.webservicex.net/[[[1]]] WSDLファイルは、Webサイトの次のリンクで提供されています。 webservicex.net。このWSDLファイルからクライアントを生成するには、ターミナルで次のコマンドを実行するだけです。
wsimport http://www.webservicex.net/geoipservice.asmx?WSDL
このコマンドは、「SEI」という名前の1つのフォルダーの下にすべての必要なクライアントファイルを生成します。このフォルダーは、サービスエンドポイントインターフェイスにちなんで命名されます。
ステップ2:カスタムWebサービスを作成します-このチュートリアルの前の段階で述べたのと同じプロセスに従い、「CustomRest」という名前のMavenベースのREST APIを構築します。 完了すると、「MyResource.java」という名前のクラスが見つかります。 先に進み、次のコードを使用してこのクラスを更新します。
package com.finddevguides.customrest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("myresource")
public class MyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "IND|INDIA|27.7.65.215";
}
}
すべてが完了したら、サーバーでこのアプリケーションを実行します。 ブラウザに次の出力が表示されます。
これは、呼び出されると1つの文字列オブジェクトを返すWebサーバーです。 これは、他のアプリケーションがレコードを生成するために使用できる入力を提供する入力サービスです。
ステップ3:別のREST APIを設定します-このステップでは、http://services.groupkt.com/country/get/iso3code/IND [services.groupkt.com。]で利用可能な別のWebサービスを使用します。これによりJSONが返されます呼び出されたときのオブジェクト。
ステップ4:JAVAアプリケーションの作成-次のスクリーンショットに示すように、「新規プロジェクト」→「JAVAプロジェクト」を選択して「終了」をクリックして、通常のJavaアプリケーションを1つ作成します。
ステップ5:SOAPクライアントの追加-ステップ1では、SOAP Webサービスのクライアントファイルを作成しました。 先に進み、これらのクライアントファイルを現在のプロジェクトに追加します。 クライアントファイルが正常に追加されると、アプリケーションディレクトリは次のようになります。
ステップ6:メインアプリの作成-これら3つのWebサービスをすべて使用するメインクラスを作成します。 ソースプロジェクトを右クリックし、「MicroServiceInAction.java」という名前の新しいクラスを作成します。 次のタスクは、これからさまざまなWebサービスを呼び出すことです。
ステップ7:カスタムWebサービスを呼び出す-このため、次のコードセットを追加して、独自のサービスの呼び出しを実装します。
try {
url = new URL("http://localhost:8080/CustomRest/webapi/myresource");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
while ((output = br.readLine()) != null) {
inputToOtherService = output;
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
ステップ8:SOAPサービスの使用-クライアントファイルを生成しましたが、そのパッケージ全体でどのメソッドを呼び出す必要があるかわかりませんか? このためには、クライアントファイルの生成に使用したWSDLを再度参照する必要があります。 すべてのWSDLファイルには、このタグの「wsdl:service」タグ検索が1つ必要です。 それは、そのWebサービスのエントリポイントである必要があります。 以下は、このアプリケーションのサービスエンドポイントです。
次に、アプリケーションにこのサービスを実装する必要があります。 以下は、SOAP Webサービスを実装するために必要なJavaコードのセットです。
GeoIPService newGeoIPService = new GeoIPService();
GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap();
GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress);
//Ipaddress is output of our own web service.
System.out.println("Country Name from SOAP Webserivce ---"+newGeoIP.getCountryName());
ステップ9:REST Webサービスの使用-これまで2つのサービスが消費されていました。 このステップでは、カスタマイズされたURLを持つ別のREST Webサービスが、カスタムWebサービスの助けを借りて消費されます。 これを行うには、次のコードセットを使用します。
String url1="http://services.groupkt.com/country/get/iso3code/";//customizing the Url
url1 = url1.concat(countryCode);
try {
URL url = new URL(url1);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
ステップ10:すべてのサービスを使用します-「CustomRest」Webサービスが実行され、インターネットに接続していることを考慮して、すべてが正常に完了した場合、統合メインクラスは次のようになります。
package microserviceinaction;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.StringTokenizer;
import net.webservicex.GeoIP;
import net.webservicex.GeoIPService;
import net.webservicex.GeoIPServiceSoap;
public class MicroServiceInAction {
static URL url;
static HttpURLConnection conn;
static String output;
static String inputToOtherService;
static String countryCode;
static String ipAddress;
static String CountryName;
public static void main(String[] args) {
//consuming of your own web service
try {
url = new URL("http://localhost:8080/CustomRest/webapi/myresource");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
while ((output = br.readLine()) != null) {
inputToOtherService = output;
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Fetching IP address from the String and other information
StringTokenizer st = new StringTokenizer(inputToOtherService);
countryCode = st.nextToken("|");
CountryName = st.nextToken("|");
ipAddress = st.nextToken("|");
//Call to SOAP web service with output of your web service---
//getting the location of our given IP address
String Ipaddress = ipAddress;
GeoIPService newGeoIPService = new GeoIPService();
GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap();
GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress);
System.out.println("Country Name from SOAP Webservice ---"+newGeoIP.getCountryName());
//Call to REST API --to get all the details of our country
String url1 = "http://services.groupkt.com/country/get/iso3code/";//customizing the Url
url1 = url1.concat(countryCode);
try {
URL url = new URL(url1);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
このファイルを実行すると、コンソールに次の出力が表示されます。 最初のマイクロサービスアプリケーションの開発に成功しました。