この記事では以降に含まれていJavaGuide(60K +学習+スター[Javaの]ほとんどのJavaプログラマはコアな知識を習得する必要が面接ガイドカバー。)
この記事はからの許可を得て複製さ:github.com/javagrowing ...。
1.背景
1.1 APIゲートウェイは何ですか
API Gatewayシステムは、外の世界ユニコムの入り口で、私たちは、そのような権限の確認として、ゲートウェイのロジックのいくつかの非ビジネス・ロジックを扱う監視、キャッシング、要求のルーティング、およびようにすることができます見ることができます。
1.2なぜ私たちはAPIゲートウェイが必要なのです
- RPCプロトコルHTTPに回します。
社内で開発するので、我々は、RPCプロトコル(古道具やダボ)このインタフェースを使用する必要がしばしばHTTPプロトコルにRPCプロトコルを変換する必要がある場合、内部サービスにさらされ、外部サービスを開発するん基づいています。
- 要求ルーティング
2つのシステムと古いものと新しいインターフェイスが使用されているので、我々のシステムでは、我々はルートに対応するインタフェースに応じて要求をコンテキストを要求する必要があります。
- 統一認証
サービス論理に関連していない認証動作のために、プロセスは、基礎となるビジネス・ロジックなしに、ゲートウェイで実行されてもよいです。
- ユニファイドモニタリング
私たちは、このような上院、リンク時間を基準として、私たちはここに必要なデータを、監視することができるように入り口ゲートウェイとして、外部サービスです。
- フロー制御、ヒューズダウングレード
フロー制御のために、ヒューズ格下げ非ビジネス・ロジックは、ゲートウェイ層に組み込むことができます。
そこの企業の多くは、そのサービスにアクセスするための一つの層のゲートウェイを達成するために所有することになりますが、会社全体のために、これは十分ではありません。
1.3統合APIゲートウェイ
統一されたAPIゲートウェイは、すべてのAPIゲートウェイの機能と同様に、以下のいくつかの利点を持っていないだけで。
- 統一技術的なコンポーネントのアップグレード
そこに技術のコンポーネントをアップグレードする必要があり、そのため企業のビジネスコミュニケーションの各行の必要性がある場合には、通常数ヶ月はそれが働いてもらいます。ある場合は速度が遅いそうです間違いなく不可能であれば、統一ゲートウェイのアップグレードは非常に高速であるので、例えば、重大なセキュリティ上のリスクは、セキュリティ認証エントリのためにアップグレードする必要があります。
- ユニファイドアクセスサービス
特定のサービスへのアクセスのために、このような会社は、比較的安定したサービス・コンポーネントを開発した会社を促進することでているように、また、より困難であり、この期間は確かに特に長い、統一されたゲートウェイのおかげで、あなただけの統一アクセスゲートウェイを統一する必要があります。
- 資源節約
異なるビジネスにおけるさまざまな部門、我々は上記の方法に従えば、その実践は、同社が100の、このようなビジネスを持っている場合は、このことを行うために使用されるゲートウェイ層は、想像している必要があり、各事業が4台のマシンが装備されているが、あなたは400を必要としますマシン。RDおよび各事業の発展は人材を維持し、高めるためにいつでも行く、ゲートウェイ層を開発する必要があります。あなたが統一ゲートウェイ層を持っている場合は、50台のマシンが100サービスゲートウェイ層ということを行うことができる唯一の必要があるかもしれない、と、目のRDの事業展開を維持するためにライン上のステップは必要ありません。
2.統合ゲートウェイの設計
非同期リクエストの2.1
ハイスループット要件のための唯一の私たち自身の使用は、そうではないので、私たち自身のゲートウェイ層の実現、のために、私たちは一般的に、同期要求を呼び出します。
私たちの統一されたゲートウェイ層の場合、どのように多くのスループットを高めるために、我々は非同期必要以上のサービスへのマシンアクセスの少量を使用します。非同期技術のために、一般的に以下の2つの戦略を持っています:
- Tomcatの/突堤+ NIO + servlet3
この戦略は、Jingdongは比較的一般的な使用、賞賛があり、Zuul、選択したより適切なHTTPでこの戦略です。Servlet3で非同期開くことができます。
- ネッティー+ NIO
ネッティー高い並行性と健康は、現在、この戦略を使用してゲートウェイで唯一の製品である、ネッティーは、スループットの毎秒30ワット+で同じような状況にある技術記事の唯一の製品は、Tomcatは13ワット+で、それは一定があることがわかりますギャップが、ネッティーの必要性は、独自のHTTPプロトコルを処理するために、これはあまりにも面倒です。
ゲートウェイは、より多くのシーンがすべての後に、より多くのHTTPプロトコルを扱う成熟があり、サーブレットを使用することができ、HTTP要求のためのケースです。あなたはネッティーを使用してスループットにもっと注意を払うことができます。
2.1.1全非同期リンク
私たちは、その基本的には以下の図を達成することができます非同期要求を我々は非同期RPCを使用することができ、私たちの要求に行くにも非同期要求非同期処理を、行く必要があるので、完全なリンクを達成するために、非同期に使用するための要求をサポートしています:
![IMG ](https://user-gold-cdn.xitu.io/2019/11/7/16e45e6dcbf5d951?w=1300&h=480&f=png&s=31765)
オープンなWebサーブレットコンテナでは、非同期、その後、ビジネス・プロセスのためのサービスゲートウェイにスレッドプールには、非同期呼び出しのRPCと登録は、コールバックスレッドプール内の最後のプロセスをコールバック、コールバックサービスが必要です。
2.2チェーン
デザインモードでChain of Responsibilityパターンと呼ばれるパターンがあり、彼の役割は、複数のオブジェクトがこの沿って可能性のあるストランドにこれらのオブジェクトを接続するための要求を受信すると、そのことを、送信者と受信者が一緒に結合されている要求しないようにすることですそれは、これまでのオブジェクトを処理するまで連鎖移動要求。このモードでは、要求の送信者と要求ハンドラは、デカップリング。私たちの様々なモデルの枠組みでは、このようなフィルタの内部サーブレット、インターセプター内部springmvcとして、この点で達成しています。
下に示すように、ネットフリックスZuulはまた、このモデルに適用しました:
![IMG ](https://user-gold-cdn.xitu.io/2019/11/7/16e45e6e386f7fa4?w=960&h=720&f=png&s=49314)
ゲートウェイの設計でこのパターンは、我々は独自のゲートウェイを設計することを学ぶことができます。
- プレフィルター:プレフィルタ、このような制限統一認証均一、などのいくつかの公共サービスを、治療するために使用されるが、ヒューズは、キャッシュ処理を分解し、拡張サービス側を提供します。
- routingFilters:作業要求をルーティング、プロトコル変換を行うために、主に、いくつかの呼び出しに対処するための一般化。
- ポストフィルタ:主に結果を処理するために使用されるフィルタ、ログドット、時間を記録するなどした後。
- errorFilters:呼び出しの例外処理のための誤差フィルタ。
また、この設計は、賞賛のアプリケーションへの玄関口です。
2.3事業分離
ビジネス上の異なるほとんど影響の間の完全な非同期リンクの場合は上記と同じですが、タイムアウトが頻繁にそれが他の企業に影響を与えます一度FiIlterは、いくつかの同期呼び出しを提供するカスタムで行われます。我々は手術のアイソレーションを使用する必要があるので、お互いの事業の影響を減らします。
2.3.1セマフォの分離
セマフォ分離しかし同時の総数、又はメインスレッド同期サービス呼び出しを制限します。この分離リモート呼び出しのタイムアウトは、まだ他の事業に影響を与えるメインスレッドに影響するかどうか。あなただけの長距離通話を伴わない同時呼び出しサービスコールまたはサービスの総量を制限したいのであれば、あなたが達成するためにセマフォ軽量を使用することができます。信号絶縁の量となるようようなゲートウェイは、いかなるカスタムフィルタが存在しないために選択されます。
2.3.2スレッドプールの分離
最も簡単なのは、それが他の企業に影響を与えないようにサービス・インターフェース・スレッド・プールが単離されているため、問題があっても、異なるスレッドプールによって異なるサービス間の分離です。これは、分離のゲートウェイ実装Jingdongは、そのような商品や受注が行くために別のスレッド・プールを通って処理されているような、より重要なビジネスにスレッドプールを使用することです。しかし、彼らのビジネスは別のスレッド・プールの分離のためのより重要な必要性であることを多くの、我々はすべての感触のビジネスラインは、Java言語の開発を使用している場合、そのように、Javaスレッドに比較的重い資源であるならば、それは、統一されたゲートウェイプラットフォームであるため、比較的限定されています、あなたがスレッドプールを分離する必要がある場合は非常に多く適用されていません。あなたはゲートウェイを開発するなどGolangなどいくつかの他の言語を使用する場合は、このスレッドが比較的軽い資源である、スレッドプールの分離を使用することがより適しています。
2.3.3クラスタ分離
あなたが独立しているが、統一ゲートウェイスレッドプールなしアイソレーションを使用する必要があるいくつかのビジネスがある場合、どのようにすればよいですか?あなたのビジネスのいくつかは、あなたがマシン間での分離により、単独のビジネスクラスタまたは複数のクラスタのシリーズのために適用することができます本当に重要である場合は、クラスタの分離を使用することができます。
2.4制限要求
フロー制御は、このようなアリ最近、オープンソースセンチネルとして、オープンソースの多くを達成するために使用し、より多くのHystrix成熟することができます。
一般的な制限電流制限は、クラスタおよびスタンドアロンの制限に分かれています。
- ユニファイド・ストレージは、これは一般的にいくつかのパフォーマンスの損失があるだろう、一般のRedisを使用して、電流の流れを保存します。
- スタンドアローン制限:なし長距離通話が消費少なく、性能がありませんので、我々は直接、行うにはグアバトークンバケットを使用することができ、各マシンを制限します。
2.5ヒューズ格下げ
この1つはまた、センチネルとHystrixのオープンソース実装を参照することができ、ここでのポイントは言及していないではありません。
2.6汎化コール
一般には、倹約に変換HTTPなどのいくつかの呼通信プロトコルの変換を指します。各企業の内部サービスの通信プロトコルが異なるため、いくつかのオープンソースのゲートウェイでZuulなどは、達成されません。そのようなHTTP1、HTTP2、ならびにバイナリプロトコル、次いで契約、淘宝支持HTTPS、HTTP1、HTTP2これらのプロトコルは、に変換することができ、HTTP、HSF、ダボ及びその他の契約の内部へと変換でのみ製品のサポートとして。
2.6.1汎化コール
どのように一般化呼び出し、それを達成するには?契約が自動的にマッピングを提供する必要性に対応するインターフェース、その後実際には、各プロトコルに変換することは困難であるからです。要するに、2つのプロトコルは、共通言語、したがって交換に変換することができます。
![IMG ](https://user-gold-cdn.xitu.io/2019/11/7/16e45e6ef627076e?w=1338&h=963&f=png&s=80170)一般的に3通りの方法で指定された共通の言語を話します。
- JSON:JSONデータフォーマットは高速、軽量化を解析し、簡単です。ダボにHTTP JSONRPC再変換に変換されますJSONRPCで行うことですエコロジーにHTTPターンダボダボのプロジェクトがあります。
例は、であることができるwww.baidu.com/id = 1のGET JSONにマッピングすることができます。:
ブロック
复制代码
- XML:XMLデータ解決するには困難な、比較的重いですが、ここではより多くの議論。
- カスタム記述言語は:一般的にコストが比較的高い記述するための言語を定義する必要があり、解析ですが、そのスケーラビリティ、カスタム個性が最も高く抵抗しています。例:春は、独自のカスタム式言語を設定SPEL
あなたが特にパーソナライズされたタッチのために必要がある場合は、満たすために自分の言葉JSONの基本的な設計をしたい場合は汎化コールについて、あなたは言語の独自のセットを定義することができます。
2.7管理プラットフォーム
上記の重要なゲートウェイ技術を実現する方法です。私たちは、主要なビジネスゲートウェイを導入すべきです。あなたはゲートウェイを持ったら、私たちはコンフィギュレーションを含むが、以下の構成に限定されない、上記の実行方法への管理プラットフォーム技術のキーが必要になります。
- 限定的
- ヒューズ
- キャッシュ
- ジャーナル
- カスタムフィルタ
- 汎化コール
3.まとめ
最後に、合理的な標準ゲートウェイは、以下を達成するために従うべきです:
![IMG ](https://user-gold-cdn.xitu.io/2019/11/7/16e45e6fb4b82f73?w=2013&h=1007&f=png&s=152690)
--- |
Jingdongは |
唯一の製品 |
そこチャン |
アリ |
Zuul |
---|---|---|---|---|---|
達成するための鍵 | servlet3.0 |
ネッティー |
servlet3.0 |
servlet3.0 |
servlet3.0 |
非同期の場合 | かどうかは非同期サーブレット、非同期クリアRPC | 完全な非同期リンク |
完全な非同期リンク |
完全な非同期リンク |
Zuul1同期ブロッキング、Zuul2非同期ノンブロッキング |
限定的 |
--- |
--- |
制限滑らかに。当初は、限定する単一のトークンバケットに後続の各変更をCODIS。 | 1.基本的なフロー制御:QPSのAPIに基づいて電流制限を行います。2.業務フロー制御:APPは、右のAPIの重いフロー制御にアクセスするには:サポートパッケージは、APP、APP + API + USERフロー制御33フロー制御大きなプロモーションを流れ。アリオープンソース:センチネル | ジャーパッケージが用意されています。春-クラウドzuul-レート制限を。1.電流を制限するために、ターゲットURL要求(例えば:のみ、毎分何度も呼び出すことが許さURL)。2. IPクライアントへのアクセス(例:IPのみ分当たりの回数を要求することができ)制限されたユーザーの特定のユーザまたはグループを制限するための3(例えば、非VIPユーザは、毎分100の呼のみを許可します前記多次元混合を制限するAPIなど)を一度。この時点で、我々はルールを制限するオーケストレーション機構の一部を実装する必要があります。AND、OR、およびその他の非関係。サポート4人の記憶のConcurrentHashMap、領事、Redisの、データベース。 |
ヒューズダウングレード | --- |
--- |
Hystrix |
--- |
唯一のサポートのレベルは、URLレベルをサポートしていません、融合します。 |
隔離 |
スレッドプールの分離 |
--- |
セマフォの分離 |
--- |
スレッドプールの分離、セマフォ分離 |
キャッシュ |
繰り返します |
--- |
二次キャッシュ、ローカルキャッシュ+ CODIS |
HDCCローカルキャッシュ、リモート・キャッシュ、データベース |
自分自身を開発する必要があります |
汎化コール | --- |
HTTP、HTTPS、HTTP1、HTTP2、バイナリ | ダボ、HTTP、新星 |
HSF、ダボ、HTTP、HTTPS、HTTP2、HTTP1 |
HTTPのみをサポートしています |
4.リファレンス
- Jingdongはします。http://www.yunweipai.com/archives/23653.html
- そこチャンゲートウェイます。https://tech.youzan.com/api-gateway-in-practice/
- CD製品はなります。https://mp.weixin.qq.com/s/gREMe-G7nqNJJLzbZ3ed3A
- Zuulます。http://www.scienjus.com/api-gateway-and-netflix-zuul/
推奨されるオープンソースプロジェクト
他のオープンソースプロジェクトの推薦:
- JavaGuide:Javaの学習[+]面接ガイドは、Javaプログラマの大半はコアな知識を習得する必要がカバーしています。
- ガイド-springboot:春ブートチュートリアル(一緒に暇な時間の保守、メンテナンス歓迎)初心者に適しただけでなく、経験豊富な開発者のアクセス。
- 進歩-プログラマー:私は技術スタッフが、いくつかの良い習慣を持つべきだと思います!
- -security-JWTスプリングガイド:ゼロから始めましょう!(検証機関を含む)春のセキュリティが強化されたJWTコードの後端部。