Spring Cloud (6): リボンの負荷分散

1. 背景

前回の調査では、RestTemplate を使用して、サービス コンシューマーからサービス プロバイダーへの呼び出しを実装しました。特定のビジネス シナリオで、サービスへの呼び出し数が突然大幅に増加した場合、今度はサービスを呼び出す必要があります。負荷分散を実装する高い同時アクセス条件を満たします。大規模な分散プロジェクトでは負荷分散が必要なため、Ribbon を使用して負荷分散を実現できます。

2.リボンとは

リボンは Sping Cloud のコンポーネントです Spring Cloud リボンはロード バランシング ソリューションです リボンは Netflix がリリースしたロード バランサです Spring はそれを統合しています Spring Cloud リボンは Netflix リボンをベースに実装されています HTTP リクエストを制御するロード バランシング クライアントです Spring Cloud リボンもレジストリに登録されているため、Eureka Server と組み合わせて使用​​されます。リボンが登録センターに登録されると、リボンは、ラウンド ロビン、ランダム、加重ラウンド ロビン、加重ランダムなどの特定の負荷分散アルゴリズムに基づいて、サービス利用者がインターフェイスを呼び出すのを自動的に支援します。開発者は、特定のニーズに応じてリボンをカスタマイズすることもできます。負荷分散アルゴリズム。実際の開発では、Spring Cloud Eureka が使用されます。Eureka Server は、呼び出すことができるすべてのサービス プロバイダーのリストを提供します。リボンは、特定の負荷分散アルゴリズムに基づいて、これらのサービス プロバイダーから呼び出す特定のインスタンスを選択します。画像の例は次のとおりです。
ここに画像の説明を挿入

3. 実戦、早速リボンインスタンスを構築

  1. モジュールを作成し、pom.xml に Eureka クライアントの依存関係を追加して、登録センターに登録します。次のようにコードを追加します。
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	<version>2.0.2.RELEASE</version>
</dependency>
  1. 構成ファイル application.yml を作成します。構成情報は次のとおりです。
server:
  port: 8040
spring:
  application:
    name: ribbon
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer-ip-address: true
属性说明
  • spring.application.name : Eureka Server に登録されている現在のサービスの名前。

  • eureka.client.service-url.defaultZone : レジストリのアクセスアドレス。

  • eureka.instance.prefer-ip-address : 現在のサービスの IP を Eureka Server に登録するかどうか。

  1. 次のコードを使用して起動クラスを作成します。
package com.zing;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class RibbonApplication {
    
    
	public static void main(String[] args) throws Exception {
    
    
		SpringApplication.run(RibbonApplication.class, args);
	}
	
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
    
    
		return new RestTemplate();
	}

}
注解说明:
  • @Bean: @Bean アノテーションを通じてインスタンスを IOC コンテナに注入します。実際、@SpringBootApplication は @Configuration、@EnableAutoConfiguration、@ComponentScan のデフォルト プロパティを使用するのと同等ですが、@Bean はメソッド レベルのアノテーションであり、主に @Configuration アノテーションが付けられたクラスで使用されます。 XML ファイル内のタグ @Bean は Bean タグに相当します。

  • @LoadBalanced: リボンベースの負荷分散を宣言します。このアノテーションをマークすると、RestTemplate にはクライアントの負荷分散機能が追加されます。

4. コントローラー層のコードは次のように実装されます。

package com.zing.controller;

import java.util.Collection;

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

import com.zing.entity.Student;

@RestController
@RequestMapping("/ribbon")
public class RibbonHandler {
    
    
	
	@Autowired
	private RestTemplate restTemplate;
	
	@GetMapping("/findAll")
	public Collection<Student> findAll(){
    
    
		return restTemplate.getForObject("http://provider/student/findAll", Collection.class);
	}
	
	@GetMapping("/index")
	public String index() {
    
    
		return restTemplate.getForObject("http://provider/student/index", String.class);
	}
	
}
  1. テストインターフェイス
    (1) 登録センターを起動し、2 つのプロバイダー インスタンスをそれぞれ起動します。登録センターを開くと、次の情報が表示されます。
    ここに画像の説明を挿入
    (2) リボンを起動すると、次のように登録センターに RIBBON のインスタンスが表示されます。
    ここに画像の説明を挿入
    (3) インデックス インターフェイスをテストすると、ポートが表示されることがわかります。
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    4.
    今回のまとめ サービス呼び出しの負荷分散を実現するためにRibbon+RestTemplateのメソッドを使用するコードです デフォルトではクライアントがポーリングでサービスプロバイダを呼び出し、2つのプロバイダインスタンスが応答します交互に。しかし、この開発方法はもっと簡略化することができ、実際の開発ではもっと便利な方法でこのような機能を実現することもできますので、次回の記事「Spring Cloud (7): Feign declarative Interface call」を楽しみにしていてください

開発エンジニアの一人も継続学習段階にあり、普段のちょっとした体験談を随時共有しています。私の書いた文章を読んでくれた方が、寄り道をせずに仕事や勉強の成功を祈っていただければ幸いです。
ブロガーの経験は限られていますが、欠点がある場合は、コミュニケーションを取り、一緒に改善することを歓迎します。同じ CSDN の皆さんと一緒に進歩していきたいと思っています。

著者 | スイートリトルスイートポテト
プロデュース | リトルスイートポテト

おすすめ

転載: blog.csdn.net/qq_36836370/article/details/130871582