1.ディスプレイスタンド組成
API Gatewayの理由は、外部クライアントがビジネスニーズを完了するために、複数のサービス・インターフェースを呼び出す必要があるかもしれませんが、一般的には異なるマイクロサービスは、異なるサービスのアドレスを持っているマイクロサービスアーキテクチャの登場ですので、もしそれぞれとの直接のクライアントマイクロ通信サービスは、次の質問があります。
- クライアントは繰り返し、異なるマイクロサービスを要求したクライアントの複雑さを増します。
- 特定のシーンでのクロスドメインリクエストは、比較的処理が複雑になります。
- 複雑な認定は、各サービスは、独立した認証が必要です。
- プロジェクトのイテレーションで、再構築することは困難では再分割マイクロサービスである必要があります。例えば、複数のサービスは、一つまたはサービスに分割複数に組み合わせることができます。クライアントが直接マイクロサービスと通信する場合は、その後、再構成は実施が困難になります。
- 一部のサービスは、いくつかの困難があるだろうマイクロプロトコルのファイアウォール/ブラウザ非友好的な、直接アクセスを使用することができます。
Aゲートウェイは、クライアント側とサーバ側との間に介在する中間層である、すべての外部の要求は、この層のAPIゲートウェイを通過します。つまり、ゲートウェイので、行うためにAPIゲートウェイに引き渡さすることができ監視、より多くのビジネスロジックとセキュリティ、パフォーマンス上のAPIの態様を実現するパフォーマンス、高可用性、セキュリティが不可欠です。
注:春のマイクロクラウドサービスの構築OAuth2.0の認証および認可サービスへ
共通ゲートウェイは何?
Nginxは、香港、ZUUL、春クラウドゲートウェイ(春クラウド公式)、Linkerdなど
春の雲Zuul
Zuulは、 オープンソースNetflixのマイクロサービスゲートウェイコンポーネントであり、それは缶ユーレカ、リボン、Hystrix及び他の成分を併用して使用します。Zuulコア(動的ルーティングなどの)一連のフィルターです。春クラウドZuul Zuulには、それが簡単に春のクラウドで使用すること、統合されています。
Zuul1
Zuul1サーブレットビルドに基づいて、フレームワーク、すなわち接続要求を処理するスレッド、マルチスレッドおよびブロックを使用して、深刻な遅延内部このように、多くの場合原因で機器の故障は、生存率を増加し、増加したネジ接続が発生します。
Zuul2
それは、非同期および非ブロックフレームの両方で実行されます最大の違いZuul2とZuul1は、CPUコアごとに1つのスレッドは、すべての要求と応答、要求のライフサイクルを処理し、応答がこの方法を減らし、イベントとコールバックを介して処理されていますスレッドの数、したがってオーバーヘッドは小さいです。データは、同じCPUに格納されているため、また、CPUはレベルのキャッシング、遅延、および嵐の再試行前に述べた問題を再利用するだけでなく、接続数とイベント数の方法(相対的に言って軽量スレッドスイッチの多くによってキュー記憶を削減することができますレベルの多くは、自然に)あまり消費します。この変更は、パフォーマンスが大幅に向上します。
注:2.0春クラウドの統合は、この段階では予定はありませんZuulの公式バージョンは、公式の春クラウドゲートウェイを使用することをお勧めします
演奏
:を参照することができ訂正記事:Zuul&春クラウドゲートウェイ&Linkerd性能比較 、簡単な言葉で、Zuul 1.xのは、IOのAPIゲートウェイ、別の良い春クラウドゲートウェイのパフォーマンスをブロックに基づいています。
ハイアベイラビリティ
一般的な製造環境の必要性は、複数のノードZuulユーレカサーバに登録されるように、あなたはZuulの高可用性を実現することができます。実際には、この場合は、高可用性およびその他のサービスは、高可用性(例えば:Eurkaサーバークラスタ)ないプログラムも例外ではありません。ユーレカサーバーへZuulクライアントレジスタは、クライアントが自動的にクエリZuul Zuulサーバーユーレカサーバからリストし、次に(例:リボン)ロードバランサコンポーネントを使用する場合はZuulクラスタを要求します。そうでない場合F5は、ハードウェアまたはnginxのを使用して実現することができます。
セキュリティ
春の雲のマイクロサービスは、一般的に春のクラウドセキュリティOAuth2.0と組み合わせて使用することができた後、トークンは、法案を検証するためにJWTを使用して生成されたが、春のクラウドのセキュリティは、OpenIDの接続プロトコルをサポートしていません。Zuulはユーレカでサービスのガバナンスとして自身を登録するだけでなく、ユーレカサービスガバナンスからマイクロサービスの他のすべてのインスタンスの情報にアクセスできます。彼らの関係はあまりないので、別のサービスとして、これらの機能は完全に独立した存在どの認証およびマイクロビジネスやサービス、独立したのOAuth2認証および認可サービスを構築し、マイクロアローンサービススピンオフによって。独立後、ない各マイクロサービス・コール(ネットワークを含む一般的なビジネス・サービス)が、ゲートウェイを介して統一されたAPI呼び出しに、マイクロサービスインターフェイスのプレフィルタを行うには、他のマイクロ分散系サービスと安全確認の傍受・インターフェース。
ゲートウェイサービスZuulを作成します。
Mavenの
<依存性> <のgroupId> org.springframework.cloud </のgroupId> <たartifactId>ばねクラウドスタータのNetflix-zuul </たartifactId> </依存> <依存性> <のgroupId> org.springframework.cloud </のgroupId> <たartifactId>春・クラウド・スターター・ネットフリックス-ユーレカ・クライアント</たartifactId> </依存関係>
@SpringBootApplication // @ EnableOAuth2Sso @EnableZuulProxy パブリッククラスMicrosrvZuulGatewayApplication { パブリック静的無効メイン(文字列[] args){ SpringApplication.run(MicrosrvZuulGatewayApplication.class、引数)。 } }
application.yml
春: ファイルアプリケーション: 名前:microsrv Zuul-Gateway- サーバー: ポート:5555 ユーレカ: インスタンス: preferIpAddress:trueに クライアント: serviceURLの: defaultzone:http://10.255.131.162:8000/eureka/,http://10.255.131.163: 8000 /ユーレカ/、HTTP://10.255.131.164:8000 /ユーレカ/ Zuul: ホスト: 20000:ミリ秒-の接続タイムアウト ミリ秒ソケット・タイムアウトの:20000 ignoredServices: '*' プレフィックス:共通のプレフィックスを設定するために/#API ルート: AUTHで修理: パス:/ AUTH / ** sensitiveHeaders: サービスID:idsrv-Serverの 注文で修理: パス:/受注/ ** sensitiveHeaders: サービスID:オーダーサービス アドオンプロキシヘッダ:真
ユーレカは、サービス・ディスカバリを使用しているため、フォーム/サービス-IDのリクエストURLの形式は/ **自動的に「サービスID」マイクロサービスアプリケーションであるユーレカServerサービスのIDで登録に転送されます。我々はそのようなサービス登録の適切なサービスIDに転送する「注文サービス」要求として2つのルーティングルールを定義する上記の例では、によって修飾することができる zuul.prefix = / API グローバルアドレスプレフィックス設定を設定します。デフォルトユーレカServerはそれの上に登録されているすべてのマイクロサービスに公開されます。あなたは使用することができます zuul.ignored・サービスの ような行動を禁止するプロパティを、とだけ明示的に設定されたサービスは、公開されます。
認証と認可のOAuth2.0を統合Zuul
Zuul統合OAuth2.0は1がJwtToken統一法案、裁判官やゲートウェイで他の権限を使用して、公開鍵認証を使用してサーバを動作させるために許可されている、2つのアイデアがあり、他には、リソース側の処理を行い、前方のみのルートをゲートウェイすることです。
リソース側の設定
Mavenの
<! -のOAuth2 - > <依存> <groupIdを> org.springframework.boot </ groupIdを> <たartifactId>春・ブート・スターター・セキュリティ</たartifactId> </依存関係> <依存> <groupIdを> org.springframework .security.oauth </のgroupId> <たartifactId>スプリングセキュリティのOAuth2 </たartifactId> <バージョン> 2.3.3.RELEASE </バージョン> </依存> <依存性> <のgroupId> org.springframework.security.oauth。ブート</ groupIdを> <たartifactId>春・セキュリティのOAuth2-自動設定</たartifactId> <バージョン> 2.0.5.RELEASE </バージョン> </依存関係>
春ブーツ
@SpringBootApplication @EnableResourceServer パブリッククラスDemoApplication { パブリック静的無効メイン(文字列[] args){ SpringApplication.run(DemoApplication.class、引数)。 } }
@RestController {publicクラスAccountController ( "/プリンシパル")@GetMapping @PreAuthorize( "hasAnyAuthority( 'ユーザ')") パブリックプリンシパルユーザ(プリンシパルプリンシパル){ 主返します。 } ( "/クエリ")@GetMapping @PreAuthorize( "hasAnyAuthority( 'すべて')") パブリック文字列全て(){ "全て权限具有"リターン。 } }
application.yml
ログ: レベル: org.springframework:DEBUG サーバー: ポート:5000 セキュリティ: のOAuth2: リソース: #が好む-トークン情報:真 #ユーザー情報-URIます。http:// localhost:8080 / API / V1 /ユーザー/校長 #トークン情報-URIます。http:// localhost:8080 /にOAuth / check_token JWT: #キー-URIます。http:// localhost:8080 /にOAuth / token_key キーと値:| ----- BEGIN PUBLIC KEY ----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm4irSNcR7CSSfXconxL4 g4M4j34wTWdTv93ocMn4VmdB7rCBU / BlxXtBUf / cgLIgQhQrAPszSZSmxiEXCOkG Pr4aQBQuPgmNIR95Dhbzw / ZN0BnecAt3ZfkkDBHv8kH3kR / jYGTdwrxKeDgXGljN sTRhbjuASxPG / Z6gU1yRPCsgc2r8NYnztWGcDWqaobqjG3 / yzFmusoAboyV7asIp o4yk378LmonDNwxnOOTb2Peg5PeelwfOwJPbftK1VOOt18zA0cchw6dHUzq9NlB8 CLPの/ VdBap9BxU3 / 0YoFXRIc18nyzrWo2BcY2KQqX // AJC3OAfrfDmo + BGK8E0mp 8wIDAQAB ----- END PUBLIC KEY -----
最後に、あなたは、ゲートウェイへのユーザーアクセスが許可されていないとき、それは認証サーバのログイン認証にジャンプしますので、こと、(非必須)のクライアントOAuth2.0としてZuul @ EnableOAuth2Sso注釈上で有効にすることができます。
セキュリティ: のOAuth2: クライアント: アクセス・トークンURIます。http:// localhost:8080 /にOAuth /トークン ユーザーの権限-URIます。http:// localhost:8080 /にOAuth / AUTHORIZE クライアントID:client_test クライアント秘密:secret_test リソース: ユーザー情報-URIます。http:// localhost:8080 / API / V1 /ユーザー/元本 好む-トークン情報:偽
API Gatewayの理由は、外部クライアントがビジネスニーズを完了するために、複数のサービス・インターフェースを呼び出す必要があるかもしれませんが、一般的には異なるマイクロサービスは、異なるサービスのアドレスを持っているマイクロサービスアーキテクチャの登場ですので、もしそれぞれとの直接のクライアントマイクロ通信サービスは、次の質問があります。
- クライアントは繰り返し、異なるマイクロサービスを要求したクライアントの複雑さを増します。
- 特定のシーンでのクロスドメインリクエストは、比較的処理が複雑になります。
- 複雑な認定は、各サービスは、独立した認証が必要です。
- プロジェクトのイテレーションで、再構築することは困難では再分割マイクロサービスである必要があります。例えば、複数のサービスは、一つまたはサービスに分割複数に組み合わせることができます。クライアントが直接マイクロサービスと通信する場合は、その後、再構成は実施が困難になります。
- 一部のサービスは、いくつかの困難があるだろうマイクロプロトコルのファイアウォール/ブラウザ非友好的な、直接アクセスを使用することができます。
Aゲートウェイは、クライアント側とサーバ側との間に介在する中間層である、すべての外部の要求は、この層のAPIゲートウェイを通過します。つまり、ゲートウェイので、行うためにAPIゲートウェイに引き渡さすることができ監視、より多くのビジネスロジックとセキュリティ、パフォーマンス上のAPIの態様を実現するパフォーマンス、高可用性、セキュリティが不可欠です。
注:春のマイクロクラウドサービスの構築OAuth2.0の認証および認可サービスへ
共通ゲートウェイは何?
Nginxは、香港、ZUUL、春クラウドゲートウェイ(春クラウド公式)、Linkerdなど
春の雲Zuul
Zuulは、 オープンソースNetflixのマイクロサービスゲートウェイコンポーネントであり、それは缶ユーレカ、リボン、Hystrix及び他の成分を併用して使用します。Zuulコア(動的ルーティングなどの)一連のフィルターです。春クラウドZuul Zuulには、それが簡単に春のクラウドで使用すること、統合されています。
Zuul1
Zuul1サーブレットビルドに基づいて、フレームワーク、すなわち接続要求を処理するスレッド、マルチスレッドおよびブロックを使用して、深刻な遅延内部このように、多くの場合原因で機器の故障は、生存率を増加し、増加したネジ接続が発生します。
Zuul2
それは、非同期および非ブロックフレームの両方で実行されます最大の違いZuul2とZuul1は、CPUコアごとに1つのスレッドは、すべての要求と応答、要求のライフサイクルを処理し、応答がこの方法を減らし、イベントとコールバックを介して処理されていますスレッドの数、したがってオーバーヘッドは小さいです。データは、同じCPUに格納されているため、また、CPUはレベルのキャッシング、遅延、および嵐の再試行前に述べた問題を再利用するだけでなく、接続数とイベント数の方法(相対的に言って軽量スレッドスイッチの多くによってキュー記憶を削減することができますレベルの多くは、自然に)あまり消費します。この変更は、パフォーマンスが大幅に向上します。
注:2.0春クラウドの統合は、この段階では予定はありませんZuulの公式バージョンは、公式の春クラウドゲートウェイを使用することをお勧めします
演奏
:を参照することができ訂正記事:Zuul&春クラウドゲートウェイ&Linkerd性能比較 、簡単な言葉で、Zuul 1.xのは、IOのAPIゲートウェイ、別の良い春クラウドゲートウェイのパフォーマンスをブロックに基づいています。
ハイアベイラビリティ
一般的な製造環境の必要性は、複数のノードZuulユーレカサーバに登録されるように、あなたはZuulの高可用性を実現することができます。実際には、この場合は、高可用性およびその他のサービスは、高可用性(例えば:Eurkaサーバークラスタ)ないプログラムも例外ではありません。ユーレカサーバーへZuulクライアントレジスタは、クライアントが自動的にクエリZuul Zuulサーバーユーレカサーバからリストし、次に(例:リボン)ロードバランサコンポーネントを使用する場合はZuulクラスタを要求します。そうでない場合F5は、ハードウェアまたはnginxのを使用して実現することができます。
セキュリティ
春の雲のマイクロサービスは、一般的に春のクラウドセキュリティOAuth2.0と組み合わせて使用することができた後、トークンは、法案を検証するためにJWTを使用して生成されたが、春のクラウドのセキュリティは、OpenIDの接続プロトコルをサポートしていません。Zuulはユーレカでサービスのガバナンスとして自身を登録するだけでなく、ユーレカサービスガバナンスからマイクロサービスの他のすべてのインスタンスの情報にアクセスできます。彼らの関係はあまりないので、別のサービスとして、これらの機能は完全に独立した存在どの認証およびマイクロビジネスやサービス、独立したのOAuth2認証および認可サービスを構築し、マイクロアローンサービススピンオフによって。独立後、ない各マイクロサービス・コール(ネットワークを含む一般的なビジネス・サービス)が、ゲートウェイを介して統一されたAPI呼び出しに、マイクロサービスインターフェイスのプレフィルタを行うには、他のマイクロ分散系サービスと安全確認の傍受・インターフェース。
ゲートウェイサービスZuulを作成します。
Mavenの
<依存性> <のgroupId> org.springframework.cloud </のgroupId> <たartifactId>ばねクラウドスタータのNetflix-zuul </たartifactId> </依存> <依存性> <のgroupId> org.springframework.cloud </のgroupId> <たartifactId>春・クラウド・スターター・ネットフリックス-ユーレカ・クライアント</たartifactId> </依存関係>
@SpringBootApplication // @ EnableOAuth2Sso @EnableZuulProxy パブリッククラスMicrosrvZuulGatewayApplication { パブリック静的無効メイン(文字列[] args){ SpringApplication.run(MicrosrvZuulGatewayApplication.class、引数)。 } }
application.yml
春: ファイルアプリケーション: 名前:microsrv Zuul-Gateway- サーバー: ポート:5555 ユーレカ: インスタンス: preferIpAddress:trueに クライアント: serviceURLの: defaultzone:http://10.255.131.162:8000/eureka/,http://10.255.131.163: 8000 /ユーレカ/、HTTP://10.255.131.164:8000 /ユーレカ/ Zuul: ホスト: 20000:ミリ秒-の接続タイムアウト ミリ秒ソケット・タイムアウトの:20000 ignoredServices: '*' プレフィックス:共通のプレフィックスを設定するために/#API ルート: AUTHで修理: パス:/ AUTH / ** sensitiveHeaders: サービスID:idsrv-Serverの 注文で修理: パス:/受注/ ** sensitiveHeaders: サービスID:オーダーサービス アドオンプロキシヘッダ:真
ユーレカは、サービス・ディスカバリを使用しているため、フォーム/サービス-IDのリクエストURLの形式は/ **自動的に「サービスID」マイクロサービスアプリケーションであるユーレカServerサービスのIDで登録に転送されます。我々はそのようなサービス登録の適切なサービスIDに転送する「注文サービス」要求として2つのルーティングルールを定義する上記の例では、によって修飾することができる zuul.prefix = / API グローバルアドレスプレフィックス設定を設定します。デフォルトユーレカServerはそれの上に登録されているすべてのマイクロサービスに公開されます。あなたは使用することができます zuul.ignored・サービスの ような行動を禁止するプロパティを、とだけ明示的に設定されたサービスは、公開されます。
認証と認可のOAuth2.0を統合Zuul
Zuul統合OAuth2.0は1がJwtToken統一法案、裁判官やゲートウェイで他の権限を使用して、公開鍵認証を使用してサーバを動作させるために許可されている、2つのアイデアがあり、他には、リソース側の処理を行い、前方のみのルートをゲートウェイすることです。
リソース側の設定
Mavenの
<! -のOAuth2 - > <依存> <groupIdを> org.springframework.boot </ groupIdを> <たartifactId>春・ブート・スターター・セキュリティ</たartifactId> </依存関係> <依存> <groupIdを> org.springframework .security.oauth </のgroupId> <たartifactId>スプリングセキュリティのOAuth2 </たartifactId> <バージョン> 2.3.3.RELEASE </バージョン> </依存> <依存性> <のgroupId> org.springframework.security.oauth。ブート</ groupIdを> <たartifactId>春・セキュリティのOAuth2-自動設定</たartifactId> <バージョン> 2.0.5.RELEASE </バージョン> </依存関係>
春ブーツ
@SpringBootApplication @EnableResourceServer パブリッククラスDemoApplication { パブリック静的無効メイン(文字列[] args){ SpringApplication.run(DemoApplication.class、引数)。 } }
@RestController {publicクラスAccountController ( "/プリンシパル")@GetMapping @PreAuthorize( "hasAnyAuthority( 'ユーザ')") パブリックプリンシパルユーザ(プリンシパルプリンシパル){ 主返します。 } ( "/クエリ")@GetMapping @PreAuthorize( "hasAnyAuthority( 'すべて')") パブリック文字列全て(){ "全て权限具有"リターン。 } }
application.yml
ログ: レベル: org.springframework:DEBUG サーバー: ポート:5000 セキュリティ: のOAuth2: リソース: #が好む-トークン情報:真 #ユーザー情報-URIます。http:// localhost:8080 / API / V1 /ユーザー/校長 #トークン情報-URIます。http:// localhost:8080 /にOAuth / check_token JWT: #キー-URIます。http:// localhost:8080 /にOAuth / token_key キーと値:| ----- BEGIN PUBLIC KEY ----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm4irSNcR7CSSfXconxL4 g4M4j34wTWdTv93ocMn4VmdB7rCBU / BlxXtBUf / cgLIgQhQrAPszSZSmxiEXCOkG Pr4aQBQuPgmNIR95Dhbzw / ZN0BnecAt3ZfkkDBHv8kH3kR / jYGTdwrxKeDgXGljN sTRhbjuASxPG / Z6gU1yRPCsgc2r8NYnztWGcDWqaobqjG3 / yzFmusoAboyV7asIp o4yk378LmonDNwxnOOTb2Peg5PeelwfOwJPbftK1VOOt18zA0cchw6dHUzq9NlB8 CLPの/ VdBap9BxU3 / 0YoFXRIc18nyzrWo2BcY2KQqX // AJC3OAfrfDmo + BGK8E0mp 8wIDAQAB ----- END PUBLIC KEY -----
最後に、あなたは、ゲートウェイへのユーザーアクセスが許可されていないとき、それは認証サーバのログイン認証にジャンプしますので、こと、(非必須)のクライアントOAuth2.0としてZuul @ EnableOAuth2Sso注釈上で有効にすることができます。
セキュリティ: のOAuth2: クライアント: アクセス・トークンURIます。http:// localhost:8080 /にOAuth /トークン ユーザーの権限-URIます。http:// localhost:8080 /にOAuth / AUTHORIZE クライアントID:client_test クライアント秘密:secret_test リソース: ユーザー情報-URIます。http:// localhost:8080 / API / V1 /ユーザー/元本 好む-トークン情報:偽