1.リボンの概要:
リボンは、クライアントに負荷分散機能を提供するサービスです。サーバーオペレーションの追加、サーバーオペレーションの選択、すべてのサーバーリストの取得、利用可能なサーバーリストの取得など、ロードバランサーのオペレーションを表すILoadBalanceと呼ばれるインターフェイスを提供します待って。
解決すべき問題:
- ①Eurekaクライアント登録センターを構成するときにEurekaサーバーのアドレスをハードコーディングしないようにするにはどうすればよいですか?
- ②マイクロサービスの異なるモジュール間で通信する場合、サービスプロバイダーのアドレスをハードコーディングしないのですか?
- ③複数の同じマイクロサービスをデプロイする場合、要求に応じて負荷分散を実現するにはどうすればよいですか?
リボンとは?
第二に、SpringCloudのリボンエントリーケース
<! - ユーレカ包含リボン依赖のjar包春-クラウドNetflixのリボン- > < 依存> < groupIdを> org.springframework.cloud </ groupIdを> < たartifactId >春・クラウド・スターター・ネットフリックス-ユーレカ-クライアント< / artifactId > </ 依存関係>
②リボンの使い方
@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メインプログラムに追加して、構成クラスを導入します。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