1:リボンとは何ですか?
リボンは、Netflixがリリースしたオープンソースプロジェクトです。その主な機能は、Netflixのミドル層サービスを接続するために、クライアント側のソフトウェアロードバランシングアルゴリズムを提供することです。リボンクライアントコンポーネントは、接続タイムアウト、再試行などの一連の完全な構成アイテムを提供します。簡単に言えば、構成ファイルのロードバランサー(略してLB)の背後にあるすべてのマシンをリストすることです。リボンは、特定のルール(単純なポーリング、インスタント接続など)に基づいてこれらのマシンを接続するのに自動的に役立ちます。また、リボンを使用してカスタムロードバランシングアルゴリズムを実装する非常に簡単な方法もあります。
2:LBスキーム分類
現在、主流のLBスキームは2つのカテゴリに分けることができます。1つは集中化されたLBです。つまり、サービス消費者とプロバイダーの間の独立したLB施設(F5、またはNGINXなどのソフトウェアなどのハードウェア)を使用します。もう1つは、LBロジックを消費者に統合するインプロセスLBであり、消費者はアドレスが利用可能であるサービス登録センターから知っているので、これらのアドレス自体から適切なサーバーを選択します。リボンは後者に属します。これは、消費者プロセスに統合されているクラスライブラリです。それを通して、消費者はサービスプロバイダーのアドレスを取得します。
3:リボンの主なコンポーネントとワークフロー
リボンのコアコンポーネント(すべてはインターフェイスタイプです)には次のものがあります。
サーバーリスト
アドレスリストを取得するために使用されます。静的(固定アドレスのセットを提供する)または動的(レジストリのアドレスリストの繰り返しクエリ)のいずれかです。
serverListFilter
Dynamic ServerListを使用するときにのみ使用される場合、元のサービスリストで特定のポリシーを使用していくつかのアドレスを検討するために使用されます。
irule
LBの結果として最終サービスアドレスを選択します。選択ポリシーには、ポーリング、応答時間に基づく重み付け、回路ブレーカー(Hystrixが利用可能な場合)などが含まれます。
リボンが機能する場合、ServerListを使用して利用可能なすべてのサービスリストを取得し、ServerListFilterを使用してアドレスの一部を検討し、最終結果としてIRULEを介して残りのアドレスのサーバーを選択します。
4:リボンが提供するメインロードバランス戦略の紹介
1:単純なポーリングロードバランシング(ラウンドロビン)
リクエストはポーリングされた方法で順番にスケジュールされます。つまり、各スケジュールはi =(i + 1)mod nで実行され、i番目のサーバーが選択されます。
2:ランダムロードバランシング(ランダム)
UPステータスでサーバーをランダムに選択します
3:weightedResponsetimeロードバランシング(weightedResponsetime)
対応する時間に従って重量が割り当てられます。対応する時間が長いほど、重量が小さくなり、選択される可能性が低くなります。
4:Zoneavoidancerule
サーバー領域とサーバーの可用性選択サーバーのパフォーマンスを包括的に決定する
リボン自身の負荷分散戦略の比較
| 戦略名 | ポリシーステートメント | ポリシーの説明 | 実装手順 |
| bestavailablerule | Public Class BestAvaIlableruleは、ClientConfigenabledRoundRobinRuleを拡張します | 最小の同時リクエストでサーバーを選択します | サーバーを1つずつ確認してください。サーバーがトリップされた場合は、無視してください。最小のActiveRequestScountのサーバーを選択します |
| 可用性filteringrule | パブリッククラスの可用性filteringruleは、predicatebasedruleを拡張します | 接続障害のためにトリックされた回路がマークされたバックエンドサーバーを除外し、高い並行性でそれらのバックエンドサーバーを除外します(アクティブ接続は構成されたしきい値を超えています) | FiavileabilityPredicateを使用してフィルタリングサーバーのロジックを含めることは、実際にステータスで記録された各サーバーの実行ステータスを確認することです。 |
| weightedResponsetimerule | パブリッククラスの重み付けsetimeruleは、roundrobinruleを拡張します | 対応する時間に従って重量が割り当てられます。対応する時間が長いほど、重量が小さくなり、選択される可能性が低くなります。 | バックグラウンドスレッドは、ステータスから評価応答時間を定期的に読み取り、各サーバーの重みを計算します。 Weightの計算も比較的簡単です。応答を差し引いて、各サーバーの平均応答時間はサーバーの重みです。ステータスが開始されたばかりで統計が形成されない場合は、Roubineポリシーを使用してサーバーを選択します。 |
| retryrule | パブリッククラスのretryruleは、Abstractloadbalancerruleを拡張します | 選択した負荷分散ポリシーのために、マシン上のメカニズムを再試行します。 | 構成期間中、サーバーの選択に失敗した場合、Subruleを使用して利用可能なサーバーを選択しようとし続けます |
| roundrobinrule | パブリッククラスRoundrobinRuleは、AbstractLoadBalancerruleを拡張します | サーバーを選択するためのラウンドロビンメソッドポーリング | インデックスを投票し、インデックスに対応するサーバーを選択します |
| ランダムルール | パブリッククラスのランダムルールは、AbstractLoadBalanCerruleを拡張します | サーバーをランダムに選択します | インデックスでランダムに、インデックス位置に対応するサーバーを選択します |
| Zoneavoidancerule | パブリッククラスのZoneavoidanceruleは、PredicateBasedRuleを拡張します | サーバー領域とサーバーの可用性選択サーバーのパフォーマンスを包括的に決定する | zoneavoidancepredicateとavailabilitypredicateを使用して、サーバーが選択されているかどうかを判断します。前のものは、ゾーンの動作性能が利用可能かどうかを決定します。利用できないゾーン(すべてのサーバー)を除外します。 averableabilityPredicateは、接続が多すぎるサーバーを除外するために使用されます。 |
5:リボンだけです
Mavenプロジェクト名Ribbon_Clientを作成します
POMコンテンツ
<dependencies> <Dependency> <groupId> com.netflix.ribbon </groupid> <artifactid>リボンコア</artifactid> <バージョン> 2.2.0 </version> </dependency> <依存関係> <依存> <グループ</dependency> </dependencies>
sample-client.properties構成ファイル
#max retries sample-client.ribbon.maxautoretries = 1##max次のサーバーの最大番号(最初のサーバーを除く)sample-client.ribbon.ribbon.maxauteretriesnextserver = 1 SAMPLE-CLIENT.RIBBON.SERVERLISTREFRESHINTERVAL = 2000#接続タイムアウトApache httpclient sample-client.ribbon.connecttimeout = 3000#apache httpclient httpclient httpclient httpclient.ribbon.readtimeout = 3000##3000#serversの初期リストで使用されるタイムアウトの読み取り。 sample-client.ribbon.listofservers = www.sohu.com:80、www.163.com:80、www.sina.com.cn:80sample-client.ribbon.enableprimeconnections = true
リボンメインコード
Import java.net.uri; import com.netflix.client.clientFactory; Import com.netflix.client.http.httprequest; Import com.netflix.client.http.httpresponse; Import com.netflix.config.configurationmanager; Import; com.netflix.loadbalancer.zoneawareloadbalancer; import com.netflix.niws.client.http.restclient; public class ribbonmain {public static void main(string [] args)throws {configurationmanager.loadpropertiesfromresours( "サンプル - クライアント"); System.out.println(configurationManager.getConfiginStance()。getProperty( "sample-client.ribbon.listofservers")); RESTCLIENT CLIENT =(RESTCLIENT)clientFactory.getNamedClient( "Sample-client"); httprequest request = httprequest.newbuilder()。uri(new uri( "/"))。build(); for(int i = 0; i <4; i ++){httpresponse response = client.executewithloadbalancer(request); system.out.println( "uriのステータス:" + response.getRequesteduri() + "is:" + respons.getStatus()); } Zoneawareloadbalancer lb =(zoneawareloadbalancer)client.getLoadBalancer(); system.out.println(lb.getloadbalancerstats()); configurationManager.getConfiginStance()。setProperty( "sample-client.ribbon.listofservers"、 "ccblog.cn:80,www.linkedin.com:80"); System.out.println( "サーバーの変更..."); thread.sleep(3000); for(int i = 0; i <3; i ++){httpresponse response = client.executewithloadbalancer(request); system.out.println( "uriのステータス:" + response.getRequesteduri() + "is:" + respons.getStatus()); } system.out.println(lb.getloadbalancerstats()); }}コード解析
Archaius ConfigurationManagerを使用してプロパティをロードします。
ClientFactoryを使用して、クライアントとロードバランサーを作成します。
ビルダーを使用して、HTTPリクエストを作成します。 URIの「/」部分のパスのみをサポートすることに注意してください。サーバーがロードバランサーによって選択されると、クライアントは完全なURIを計算します。
api client.executewithloadbalancer()を呼び出すことは、exeucte()apiではありません。
構成内のサーバープールを動的に修正します。
サーバーリストが更新されるのを待ちます(構成ファイルで定義されている更新間隔は3秒です)。
ロードバランサーによって記録されたサーバー統計を印刷します。
6:リボンとユーレカ
まず、eureka_register_serviceプロジェクト(登録センター)およびbiz-service-0プロジェクト(サービスプロデューサー)を開始します
mavenプロジェクトを作成するeureka_ribbon_clientこのプロジェクトは開始され、関連する構成はeureka_register_serviceとbiz-service-0に依存します
POM結合
<parent> groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <バージョン> 1.4.3.Release </version> <relativepath/> <! - lookup parent from repository-> </parent> <deplencies> <artifactid> spring-cloud-starter-ribbon </artifactid> </dependency> <dependency> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </artifactid> </dependency> <依存関係> <グループ<グループ< <artifactid> spring-boot-starter-web </artifactid> </dependency> <dependency> org.springframework.boot </groupid> <artifactid> spring-boot-starter-test </artifactid> <scope> test </scope> </dependencies> <Dependencies> <Dependencies> <GroupId> org.springframework.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <version> release </version> <type> pom </type> <scope> import </scope> </dependency> </dependencies> </despencymanagemation>
アプリケーションメインクラスでは、 @enablediscoveryclientアノテーションを通じてディスカバリーサービス機能を追加します。 rettemplateインスタンスを作成し、@loadbalancedアノテーションを介して負荷容量のバランスをとることができます。
@springbootapplication @enablediscoveryclientpublic class ribbonapplication {@bean @loadbalanced restemplate rettemplate(){return new resttemplate(); } public static void main(string [] args){springApplication.run(ribbonapplication.class、args); }}Biz-Service-0のGetuserサービスを消費する消費者トローラーを作成します。直接rettemplateでサービスを呼び出します
@RestControllerPublic Class ConsumerController {@AutowiredRestTemplateRestTemplate; @RequestMapping(value = "/getUserInfo"、method = requestmethod.get)public string add(){return resttemplate.getForentity( "http:// biz-service-0/getuser"、string.class).getbody(); }} application.propertiesでeurekaサービス登録センターを構成します
spring.application.name = ribbon-consumerserver.port = 8003eureka.client.serviceurl.defaultzone = http:// localhost:8000/eureka/
完了後、http:// localhost:8003/getuserinfoを開くことができます。
概要:リボンは、実際にはソフトロードバランシングクライアントコンポーネントです。他の必要なリクエストと組み合わせて使用できます。それをユーレカと組み合わせることは、その例にすぎません。
コードアドレス:https://github.com/zhp8341/springclouddemo
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。