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
- 3 添加注解(同Ribbon)
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
1.4 調用(同Ribbon)
@RestController
public class UsersController {
//服務提供者名稱
private static final String REMOTE_URL = "http://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其它不變,重新測試即可