Spring Cloud Loadbalancer

Spring Cloud Loadbalancer—客戶端負載均衡器

springcloud 2020.0.1 版本之後 刪除了eureka中的ribbon,替代ribbon的是spring cloud自帶的LoadBalancer,但公司開發中並沒有那麼快更新,大部分項目還是在用Ribbon,但未來可能會改用Spring Cloud Loadbalancer。我們一起來看一下Spring Cloud Loadbalancer的使用

一Spring Cloud Loadbalancer和RestTemplate相結合實現負載均衡

整體使用方法同Ribbon

1.1 導入jar包

<dependency>
    <!-- Spring Cloud loadbalancer 負載均衡-->
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

1.2 屏蔽ribbon

spring
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
  1. 3 添加註解(同Ribbon)
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return new RestTemplate();
}

1.4 調用(同Ribbon)

@RestController
public class UsersController {

    //服務提供者名稱
    private static final String REMOTE_URL = "//SEARCH";

    @Autowired
    private  RestTemplate restTemplate;

    @GetMapping("goods")
    public ResponseResult searchGoods()
    {
         return restTemplate.getForObject(REMOTE_URL+"/goods",ResponseResult.class);
    }
}

二 修改負載均衡方式

2.1 創建一個配置類

package com.test.eureka.config;


import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

//這裡 不需要 @configuration註解  重要的事情說三遍
public class CustomLoadBalancerConfiguration {

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);

        //這裡是返回隨機負載均衡方式
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

2.2 添加註解

在@LoadBalanced註解所在類上添加註解

@LoadBalancerClient(name = "SEARCH",configuration = CustomLoadBalancerConfiguration.class)
@Configuration
//注意這裡的name屬性 需要和eureka頁面中的服務提供者名字一直 此時頁面中是大寫
@LoadBalancerClient(name = "SEARCH",configuration = CustomLoadBalancerConfiguration.class)
public class RemoteClientConfiguration {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

2.3其它不變,重新測試即可