リボン、restTemplate負荷分散サービス呼び出し

リボンのコンセプト

Springクラウドリボンは、Netflixリボンに基づくクライアント負荷分散ツールのセットです。
簡単に言うと、RibbonはNetflixによってリリースされたオープンソースプロジェクトです。その主な機能は、クライアント側のソフトウェア負荷分散アルゴリズムとサービスを提供することです。
接続タイムアウトや再試行などの完全な構成項目。簡単に言うと、ロードバランサー(略してLB)が構成ファイルにリストされており、特定のルール(単純なポーリング、ランダム接続など)に基づいてこれらのマシンに接続するのに役立ちます。

現在メンテナンスモードに入っています、代替:春の雲loadBalance。


restTemplate api

https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html

getObject, getEntity
postObject, postEntity

負荷分散

LBロードバランスとは何ですか?
簡単に言えば、システムのHA(高可用性)を実現するために、ユーザーの要求は複数のサービスに均等に分散されます。
一般的な負荷分散には、ソフトウェアNginx、LVS、ハードウェアF5などが含まれます。
リボンローカル負荷分散クライアントVSNginxサーバー負荷分散Nginxの違い
は、サーバー負荷分散であり、すべてのクライアント要求がnginxに渡されてから、nginxが要求を転送します。つまり、負荷分散はサーバーによって実装されます。
リボンローカル負荷分散。マイクロサービスインターフェイスを呼び出すと、レジストリに登録されている情報サービスのリストを取得し、JVMにローカルにキャッシュして、RPCリモートサービス呼び出しテクノロジをローカルに実装します。

負荷分散+ RestTemplate呼び出し。

リボンコアコンポーネントIRule

リボンクライアントの負荷分散インターフェイスと実装クラスの
インターフェイスとサブクラス

ここに写真の説明を挿入
アルゴリズムの実装


デフォルトのポーリングアルゴリズムを置き換え、ランダムを使用します

package top.bitqian.rule; // 不要同mainBoot一个目录

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 自定义ribbon 负载均衡规则代替默认轮询规则
 * @author echo lovely
 * @date 2020/12/6 17:34
 */

@Configuration
public class SelfRule {
    
    

    @Bean
    public IRule getIRule() {
    
    

        // 随机
        return new RandomRule();
    }

}

次に、@ RibbonClientアノテーションをメインのスタートアップクラスに追加します。

ソースコードを模倣してポーリングを書き換えます

负载均衡算法原理: rest接口的第几次请求数%服务器集群总数量 = 实际服务调用服务器的下标。
每次重启服务后,rest接口从1开始。

インターフェース

package top.bitqian.springcloud.lb;

import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

/**
 * 负载均衡 接口--> 轮询~
 */
public interface LoadBalance {
    
    

    /**
     * 根据可用的服务实例列表 轮询获取某个实例~
     * @param serviceInstanceList 可用服务实例列表
     * @return 轮询后的某个服务实例~
     */
    ServiceInstance getInstance(List<ServiceInstance> serviceInstanceList);

}


成し遂げる

package top.bitqian.springcloud.lb.impl;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;
import top.bitqian.springcloud.lb.LoadBalance;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 仿照源码写轮询算法
 * @author echo lovely
 * @date 2020/12/8 20:37
 */

@Component
public class MyLoadBalance implements LoadBalance {
    
    

    // init 0
    private final AtomicInteger atomicInteger = new AtomicInteger(0);

    public final int getAndIncrease() {
    
    
        int current;
        int next;

        do {
    
    
            current = this.atomicInteger.get();
            next = current >= 2147483647 ? 0 : current + 1;

        } while (!this.atomicInteger.compareAndSet(current, next)); // 期望值,修改值

        System.out.println("the next value -----> " + next);

        return next;
    }

    @Override
    public ServiceInstance getInstance(List<ServiceInstance> serviceInstanceList) {
    
     // 机器列表

        // 得到服务器的下标位置
        int index = getAndIncrease() % serviceInstanceList.size();

        return serviceInstanceList.get(index);
    }
}


コントローラ
	// 测试手写的轮询算法~
    @GetMapping("/consumer/payment/lb")
    public String getPaymentByLb() {
    
    

        // 根据服务名获取服务列表
        List<ServiceInstance> serviceInstanceList =
                discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");

        // 1 2, 1 2, 1 2, 获取服务~
        ServiceInstance instance = myLb.getInstance(serviceInstanceList);

        URI uri = instance.getUri();

        return restTemplate.getForObject(uri + "/payment/lb", String.class);
    }

おすすめ

転載: blog.csdn.net/qq_44783283/article/details/111079799