SpringCloud(Hoxton.SR3)の基本:第2章、クライアントは負荷分散サービス(リボン)を提供します

1.リボンの概要:

  リボンは、クライアントに負荷分散機能を提供するサービスです。サーバーオペレーションの追加、サーバーオペレーションの選択、すべてのサーバーリストの取得、利用可能なサーバーリストの取得など、ロードバランサーのオペレーションを表すILoadBalanceと呼ばれるインターフェイスを提供します待って。

解決すべき問題:

  • ①Eurekaクライアント登録センターを構成するときにEurekaサーバーのアドレスをハードコーディングしないようにするにはどうすればよいですか?
  • ②マイクロサービスの異なるモジュール間で通信する場合、サービスプロバイダーのアドレスをハードコーディングしないのですか?
  • ③複数の同じマイクロサービスをデプロイする場合、要求に応じて負荷分散を実現するにはどうすればよいですか?

リボンとは?

  リボンは、Netflixによってリリースされたクラウドの中間層サービスのオープンソースプロジェクトであり、その主な機能は、負荷分散アルゴリズムを実装するクライアントを提供することです。リボンクライアントコンポーネントは、接続タイムアウト、再試行などの一連の完璧な構成アイテムを提供します。簡単に言うと、リボンはクライアントロードバランサーです。ロードバランサーの背後にあるすべてのマシンを構成ファイルで構成できます。リボンは、特定のルール(単純なポーリング、ランダム接続など)に基づいてこれらのマシンを自動的に接続するのに役立ちます。 、リボンを使用してカスタムロードバランシングアルゴリズムを実装することも非常に簡単です。
次の図は、リボンを使用する場合のユーレカの一般的なアーキテクチャを示しています。

 

第二に、SpringCloudのリボンエントリーケース

①まずリボンの依存関係を紹介します。リボンの使用はユーレカに依存します
<! - ユーレカ包含リボン依赖のjar包春-クラウドNetflixのリボン- > 
< 依存> 
    < groupIdを> org.springframework.cloud </ groupIdを> 
    < たartifactId >春・クラウド・スターター・ネットフリックス-ユーレカ-クライアント< / artifactId > 
</ 依存関係>

②リボンの使い方

RestTemplateを使用してEurekaクライアント(サービスプロバイダーとサービスコンシューマーを含む、この場合はサービスコンシューマーがRestTemplateを使用)間の通信行い、以下に示すように、RestTemplate構成クラスに @LoadBalanced アノテーションを追加し ます。 
 
@Bean 
@LoadBalanced
 public RestTemplate restTemplate(){
     return  new RestTemplate(); 
}

③ハードコーディングの解決方法

 @LoadBalancedアノテーションでRestTemplateを使用してサービスプロバイダーのインターフェースを呼び出す場合、実際のIPアドレスの代わりに仮想IPを使用できますいわゆる仮想IPは、application.propertiesまたはymlファイルでサービスプロバイダーによって設定されたspring.application.nameプロパティの値です次に例を示します。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; 

import com.qxj.cloud.entity.User; 

@RestController 
public  class MovieController { 

    @Autowired 
    private RestTemplate restTemplate; 

    @RequestMapping(値= "/ movie / {id}"、method = RequestMethod.GET、produces = "application / json; charset = UTF-8" public User findById(@PathVariable Long id){ 
     //微服务的虚拟id http:/ /プロバイダユーザーの ユーザー、ユーザー
= この .restTemplate.getForObject(。 "のhttp://プロバイダ・ユーザー:7900 /シンプル/" + ID、ユーザクラス)。 ユーザーを返す; } }

簡単な要約:リボンとユーレカの統合後、コンシューマーはIPアドレスとポート番号を気にすることなくサービスを直接呼び出すことができます

マイクロサービス(サービスプロバイダー)クラスターの構築:
マシン1 
サーバー:
   ポート:7900 
スプリング:
   アプリケーション:
      名前:プロバイダー-ユーザー
#eurekaクライアント接続構成
eureka:
   クライアント:
      service-url:
         #登録
         センターアドレスdefaultZone:http://ユーザー:password123 @ localhost:8761 / eureka 
   インスタンス:
      #IPをeurekaに登録する
      prefer-ip-address:true 
      #マイクロサービスがインスタンス名を使用してeurekaを登録します$ {spring.cloud.client.ip-address}は、IPアドレス
      instance-id:$ {spring.application.name}を意味します:$ {spring.cloud.client.ip-address}:$ {spring.application.instance_id:$ {server.port}} 

Machine 2 
server:
   port:7901 
spring:
   application: 
      名前:プロバイダーユーザー
#eurekaClient connection configuration 
eureka:
   client:
      service-url:
         #Registration Center 
         アドレスdefaultZone:http:// user:password123 @ localhost:8761 / eureka 
   instance:#Register 
      ip to eureka 
      prefer-ip-address:true 
      #マイクロサービスはインスタンス名をeureka $に登録します{spring.cloud.client.ip-address}は、IPアドレスの
      インスタンスIDを示します:$ {spring.application.name}:$ {spring.cloud.client.ip-address}:$ {spring.application.instance_id:$ { server.port))

Machine 3 
server:
   port:7902 
spring:
   application:
      name:provider-user 
#eureka client connection configuration 
eureka:
   client:
      service-url: 
   インスタンス: 
         center address
         defaultZone:http:// user:password123 @ localhost:8761 / eureka #Register
      #IPをeurekaに登録する
      prefer-ip-address:true 
      #マイクロサービスがインスタンス名でeurekaを登録する$ {spring.cloud.client.ip-address}は、IPアドレス
      instance-id:$ {spring.application.name}を意味します: $ {spring.cloud.client.ip-address}:$ {spring.application.instance_id:$ {server.port}}

{Spring.application.name}は同じで、変更できません。

 

 

 

3、リボンコンポーネントIRule

デフォルトはRoundBobinRule(ポーリング)です。

 

4つのカスタム負荷分散アルゴリズム:

  いわゆるカスタムリボンクライアントの主な機能は、カスタム構成を使用して、リボンのデフォルトのロードバランシング戦略を置き換えることです。注:カスタムリボンクライアントが対象です。通常、カスタムリボンクライアントは、サービスプロバイダー(同じサービス名の一連のコピー)。リボンクライアントがカスタマイズされました。それによって設定された負荷分散戦略は、特定のサービス名のサービスプロバイダーに対してのみ有効ですが、他のサービスプロバイダーと通信するためにサービスユーザーが使用する戦略に影響を与えることはできません。公式ドキュメントの意味によれば、springbootメインプログラムによってスキャンされたパッケージのスコープ外で構成クラスをカスタマイズすることをお勧めします実際、RibbonClientを純粋なコードでカスタマイズする方法は2つあります。

方法1:springbootメインプログラムによってスキャンされたパッケージの外部に構成クラスを定義し、@ RibbonClientアノテーションをspringbootメインプログラムに追加して、構成クラスを導入します
 
Springbootメインプログラム:
import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.loadbalancer.LoadBalanced;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework .cloud.netflix.ribbon.RibbonClient;
 import org.springframework.context.annotation.Bean;
 import org.springframework.web.client.RestTemplate; 

import com.qxj.configuration.MySelfRule; 

@SpringBootApplication 
// この注釈は、アプリケーションが両方であることを示していますeurekaインスタンスはeurekaクライアントであり、登録されたサービス
@EnableEurekaClient
 //を検出できますマイクロサービスは、当社のカスタムリボンクラスコンフィギュレーションをロードするために始めることができるようになりますときに設定が有効に取るようにすることを 
@RibbonClient(名前=「プロバイダ・ユーザー」、設定= MySelfRule。クラスパブリック クラスConsumerMovieRibbonApplicationを{ 
    
    @Beanは
    @LoadBalanced 
    公共RestTemplateをRestTemplate(){
         戻り 新しい新)(RestTemplateを; 
    } 
    
    パブリック 静的 ボイドメイン(文字列[]引数){ 
        SpringApplication.run(ConsumerMovieRibbonApplicationする。クラス、引数); 
    } 
}

 

ルールの設定ファイル、設定、およびパッケージのパスSpringBootにすべきではない @RibbonClientコメント荷重によって:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 

import com.netflix.loadbalancer.IRule; 

@Configuration 
public  class MySelfRule { 
    @Bean 
    public IRule MyRule(){
         return  new RandomRule_QXJ(); 
    } 
}

 

カスタムLoadBalance:

import java.util.List; 

import com.netflix.client.config.IClientConfig;
 import com.netflix.loadbalancer.AbstractLoadBalancerRule;
 import com.netflix.loadbalancer.ILoadBalancer;
 import com.netflix.loadbalancer.Server; 

public  class RandomRule_QXJ extends AbstractLoadBalancerRule { 
    
    private  int total = 0;          // 呼び出し
    総数、現在各呼び出しに5回必要ですprivate  int currentIndex = 0;         // 現在提供されているサービスマシン番号
    
    / ** 
     *サービス選択アルゴリズム、各呼び出しが必要です5回
     * @param lb 
     * @paramkey 
     * @return 
     * / 
    public Server choose(ILoadBalancer lb、Object key){
         if(lb == null ){
             return  null ; 
        } 
        
        Server server = null ;
         while(server == null ){
             // 現在のスレッドが中断されているかどうかを判断する
             / / )(中断は、静的メソッドである内部実装は、現在のスレッドのコール()、及びリセットし、現在のスレッドの割り込みステータスisInterruptedをれる
            IF (Thread.interrupted()){
                 戻り NULL ; 
            } 
            // アクティブ化サービス利用可能
            List <Server> upList = lb.getReachableServers();
             // すべてのサービス 
            List <Server> allList = lb.getAllServers(); 
            
            int serverCount = allList.size();
             if(serverCount == 0 ){
                 return  null ; 
            } 
            
            if(total <5 ){ 
                server = upList.get(currentIndex); 
                total ++ ; 
            } else { 
                total = 0 ;
                 // 次のマシンサービスを使用する
                currentIndex ++ ;
                 // 現在のサービスマシンがupListコレクションの最後のマシンである
                場合、最初のマシンサービスを再利用しますif(currentIndex> = upList.size()){ 
                    currentIndex = 0 ; 
                } 
            } 
            System.out.println( "currentIndex: "+ currentIndex +" --- total: "+ total);
             // 最初のサービスにループする
            とき、サーバー== nullの場合、サーバーを再取得する必要がありますif(server == null ){ 
                Thread.yield(); 
                continue ; 
            } 
            
            if (server.isAlive()){
                 サーバーを返す; 
            }
            
            // このコードは実際には実行されません 
            server = null ; 
            Thread.yield(); 
        } 
        
        return server; 
    } 
    
    @Override 
    public Server choose(Object key){
         return choose(getLoadBalancer()、key); 
    } 

    @Override 
    public  void initWithNiwsConfig (IClientConfig clientConfig){ 
    } 

}

 

方法2:Application.ymlファイル構成メソッド

 

#@ RibbonClient(name = "provider-user")名前と同じです。これは、この
    マイクロサービス
プロバイダーユーザーにカスタムロードバランシングルールを使用することを意味します:
  ribbon:NFLoadBalancerRuleClassName:com.qxj.configuration.RandomRule_QXJ

 

設定された優先度

構成ファイルの優先順位> Javaコード構成メソッド> netflixカスタム構成メソッド

 

————————————————
著作権声明:この記事は、CS4.0ブロガー「Xiaoyanが忙しいと言った」のオリジナル記事です。CC4.0 BY-SAの著作権契約に従い、再版用に元のテキストを添付してくださいソースリンクとこのステートメント。
元のリンク:https://blog.csdn.net/JinXYan/java/article/details/90726707

おすすめ

転載: www.cnblogs.com/wps54213/p/12701919.html