ユースケース・プロジェクト住所:ポータルspring_cloud_ribbon
A、リボンのサービスコール
1、リボンの概要
リボンは何1.1
Netflixfaは、ロードバランサ、HTTPをリリースし、TCPは、制御クライアントの動作を助けています。SpringCloudでは、ユーレカは、一般的にリボンを使用して行われ、リボンは、サービスノードがサービスを提供し、合理的な負荷を考え呼び出すときにサービス情報にユーレカからの読み取りにリボンを使用して、機能的なクライアント・ロード・バランシングを提供します。
SpringCloudではレジストリとリボンと組み合わせて使用することができ、リボンが自動的にレジストリから情報サービスプロバイダのリストを取得し、内蔵のアルゴリズムベースのサービス要求をロードバランシング
1.2リボンの主効果
(1)サービスコールプルを通じてマッピング関係へのすべてのサービスのリストを-ベースのリボン(要求パスサービス名)で構成され、サービスコールを実装します。RestTemplate最終呼び出しで
(2)負荷分散複数のサービスプロバイダがある場合、サービスのアドレスを、リボンは自動的にロードバランシングすることができます必要なコールを選択するアルゴリズムを
製品を呼び出す2、リボンリアライズの注文
かどうかはユーレカベースのレジストリやSpringCloudRibbon統一パッケージのレジストリベースの領事は、そのサービスコールのために、両方の方法は同じです。
2.1依存座標
サービス提供springcloudの瓶で発見されたとリボン依存性を含んでいました。追加の座標をインポートする必要がないので、ユーレカはリボンを継承しました
2.2消費者サービス
RestTemplateを作成する方法に@LoadBalanced注釈を追加し、サービスコンシューマorder_serviceモジュールスタートアップクラスOrderApplicationを変更
@SpringBootApplication @EntityScan(「cn.hzp.order.domain」) のパブリック クラスOrderApplicationは{ / ** *使用スプリングが製品サービスを送信するためにRestTemplate HTTPリクエストを提供 * 1. RestTemplateは、コンテナ管理にオブジェクトを作成します * 2.操作がコールを完了したときにそのメソッド(getXX、postxxxは) * @LoadBalanced:リボンは、負荷分散アノテーションが提供することにある * / @LoadBalanced @Bean 公共RestTemplate RestTemplate(){ 戻り 新しい新しいRestTemplateを(); } 公共の 静的な 無効メイン(文字列[]引数){ SpringApplication.run(OrderApplication。クラス、引数)。 } }
OrderControllerのorder_serviceモジュールに次のメソッドを追加し、完全なサービスコールRestTemplateを使用して
/ ** *マイクロリボンリモートサービス呼び出しの形式に基づいて、 1書@LoadBalanced RestTemplate * 2あるいはIPアドレスサービス名* * / (値@RequestMapping = "/購入/ {ID}を" METHOD = RequestMethod.GET ) パブリック製品findById(ロング@PathVariable ID){ // IPサービス名サービス・製品の交換アドレス プロダクト製品restTemplate.getForObject =( "HTTP://サービス製品/製品/"。+ ID、プロダクトクラス); 戻り製品; }
2.3テストコード
ブラウザの要求のhttp:// localhostを:9002 /オーダー /買い/ 1 以下の効果を示す表示は、すでにマイクロ財受注ミクロサービス内のデータを取得するためのサービスを呼び出して名前の形式で提供しています。
二、リボンのロードバランシング
1、ロードバランシングの概要
1.1は、負荷分散とは何ですか
サイトの構成では、単一ノードのWebサービスのパフォーマンスと信頼性が要件を満たすことができない場合、または外部のネットワークサービスの利用で、多くの場合、人を侵害されるのを恐れため、それが外部オープンポートにケースを持っているだろうと信じて、通常、負荷分散を追加する際に効果的にサービスの問題を解決することができます。
ロードバランシングは、ネットワークベースのサービスであり、原則的には、指定された負荷は、このようにシステムに平行に拡張する能力を提供し、バックエンドサービスクラスタを介して実行に割り当てるトラフィックにバランシングアルゴリズムに従って、フロント負荷分散サービスです。
負荷分散シナリオは、サービスが、内部および外部の場合、健康診断や他の機能のネットワークを持っているので、効果的にシステムのセキュリティと可用性を提供することができ、トラフィックのパケット転送ルール、およびバックエンドサービスを提供しています。
1.2クライアントの負荷分散とサーバロードバランシング
注:リボンは、典型的なクライアント・ロード・バランサです。
サーバロードバランシング
最初は、サーバロードバランシングまたはソフトウェアに要求を送信し、その後、選択されたにアクセスする複数のサーバ間で負荷分散アルゴリズム、サーバ側で再度割り当てアルゴリズムのバランスをとる、すなわち、負荷。
クライアント・ロード・バランシング
クライアントは、サーバのアドレスリストを取得するリクエストを送信する前に、ロードバランシングアルゴリズムを使用してサーバーを選択し、訪問する、それがクライアントのロードバランシングであり、サービスのアドレスて送信へのクライアント・アクセスの負荷分散アルゴリズムを実行することです。
リボンに基づいて2、ロード・バランシング
以上の2.1ビルドグッズ
1、変性product_service application.ymlプロファイル、プロファイルの形に配置された複数のインスタンス
サーバー: ポート:9001#ポート 春: アプリケーション: 名:サービス・サービス製品#名 のDataSource: ドライバー・クラス名:はcom.mysql.jdbc.Driver URL:JDBC:MySQLの://192.168.126.99:3306 / spring_cloud_demo? useUnicode = trueに&characterEncoding = UTF8 ユーザ名:ルート パスワード:ルート JPA: データベース:MySQLの ショー-SQL:trueに オープン・イン・ビュー:trueに #1のconfigureユーレカ ユーレカ: クライアント: サービス-URL: defaultzoneます。http:// localhost:9000 /ユーレカ/は、http:// localhostを:8000 /ユーレカ/複数#のeurekaserverの間、分離して インスタンスを: 好む-IPアドレスを:真の#の使用に登録されたIPアドレス インスタンスID:$ {アドレス} spring.cloud.client.ip-:$ {#}はserver.portを登録します登録サービスセンターID リース更新インターバル・イン・秒:5位ハートビートレジストリ5S送信の間隔更新したい リース期限を-に-秒時間:10 #eurekaクライアントの終了後は、サーバーへの更新の有効期限をハートビートを送信します(デフォルトは90秒) 商品やサービスの#を設定し、複数のインスタンス --- のための#のconfigure製品1 9001の構成情報 の春: プロファイル:製品1 サーバー: ポート:9001#ポート --- のための#のconfigure製品1 9011の構成情報 の春: プロファイル:product2 サーバー: ポート:9011#ポート
2、コードモジュール商品のリターンサービスIPおよびポート情報を変更します
パブリック クラスProductController { @Autowired プライベートProductService productService; @value( "$ {はserver.port}" ) プライベート文字列ポート。 @value( "$ {spring.cloud.client.ipアドレス}" ) プライベート文字列IP; @RequestMapping(値 = "/ {ID}"、方法= RequestMethod.GET) 公共商品findById(@PathVariableロングID) { 製品積 = productService.findById(ID)。 product.setProductName(IP + ":" + ポート)。 リターン製品; } }
3、IDEA 2つの構成製品サービスの起動設定:
負荷分散コール財受注サービスで
2.2負荷分散戦略
com.netflix.loadbalancer.IRuleへの複雑な内部のバランスのトップレベルのインタフェースのための組み込みの負荷分散戦略、責任を持つリボンは、実装は次の
-
com.netflix.loadbalancer.RoundRobinRule
:負荷分散のためのラウンドロビン方式。 -
com.netflix.loadbalancer.RandomRule
:ランダム戦略 -
com.netflix.loadbalancer.RetryRule
:再試行戦略。 -
com.netflix.loadbalancer.WeightedResponseTimeRule
:重み付け戦略。各サービスは、重量、高い大きいと呼ばれている可能性を計算します。
消費者のために、サーバーモジュールの設定ファイルapplication.ymlのサービスに負荷分散ポリシーを変更します。
#修正リボン負荷分散戦略は、消費者向けサービス名です-リボン- NFLoadBalancerRuleClassName:戦略 サービス-製品: リボン: NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
戦略:
図1に示すように、各機械構成する場合と同様に、それがポリシーを変更しないことをお勧めします(推奨)
2は、マシン構成の強い一部ならば、あなたは体重戦略を変更することができますWeightedResponseTimeRule
要求の再試行2.3
シナリオ:
サービスA、Bは同じサービスを提供しています。消費者は、サービスAを要求した場合、Aは、ハングアップや要求が再試行するように設定されていない場合は、この時間ならばタイムアウト要求は、[]、サービスAへの消費者のアクセスが文句を言う時に、自動的にアクセスサービスBに行きません だから、ポーリング・エラーを訪問するロード要求がいつ発生します。
ソリューション:
リボン要求の再試行の設定、負荷分散ポリシーAポーリング・アクセス・サービス、発見ハングA、B与えられていない、別のサービスにアクセスすることです。
1、サービスコンシューマリボンため、サーバーモジュールの設定ファイルを変更するための要求application.yml再試行の設定
#修正リボン負荷分散戦略サービス名-リボン- NFLoadBalancerRuleClassName:戦略 サービス-製品: リボン: NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule#重量戦略 のconnecttimeout:タイムアウト250#リボン接続 ReadTimeout:データ1000#リボンが読みますタイムアウト取る OkToRetryOnAllOperationsを:真の#をすべての操作が再試行するかどうか MaxAutoRetriesNextServer:1#ハンドオーバインスタンスの再試行の MaxAutoRetries:再試行の1つの#現在のインスタンス数を
図2に示すように、スプリング追加要求リトライ座標を提供します
< 依存性> < のgroupId > org.springframework.retry </ のgroupId > < たartifactId >ばねリトライ</ たartifactId > </ 依存>
3、試験
SERVICE-製品2つの通常のサービス
今近い1、コールに均衡繰り返し荷重、エラーは発生しません。ログサービス要求を見ることができます注文は、要求の再試行が運転中に見つけることができます:
第三に、ソースコード解析