SpringCloud定制Ribbon客户端负载均衡策略
- springColud目录
前言
- 在项目中,我们部署一个微服务的时候往往是集群的形式部署的,这样既能提高并发量,又能保证系统的健壮性。相对的对于这个集群我们需要采取一定的策略保证负载均衡。再说一句,ribbon的工作原理是从注册中心获取集群的地址列表,再按一定策略选取一个微服务的地址进行链接。这就是客户端发现模式。
Ribbon在Eureka中的使用
添加依赖
- 在Eureka下使用不需要添加Ribbon的依赖,因为spring-cloud-starter-eureka中会自动引入Ribbon的依赖包。
ribbon的使用有两种方式,使用注解方式与配置文件方式,下面依次介绍。
注解方式
主入口程序
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = “microservice-provider”, configuration = TestConfiguration.class)
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })
public class MicroserviceConsumerApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MicroserviceConsumerApplication.class, args);
}
}
TestConfiguration文件
@Configuration
@ExcludeFromComponentScan
public class TestConfiguration {
// @Autowired
// IClientConfig config;@Bean
public IRule ribbonRule() {return new RandomRule();
}
}ExcludeFromComponentScan 文件
public @interface ExcludeFromComponentScan {
}
说明:
- @LoadBalanced 指定了restTemplate使用Ribbon进行负载均衡。
- @RibbonClient 说明对名为microservice-provider的微服务集群采用的负载均衡策略由TestConfiguration.class文件设置。
- TestConfiguration 中函数返回的即是负载均衡的策略,RandomRule代表随机。
- 如果TestConfiguration 放在主程序的文件目录及子目录下时,spring扫描后会将该策略设置为所有的负载均衡策略而不是单单指对microservice-provider的负载均衡策略。所以要么将该文件放置在入口程序的文件目录之外或者禁止spring扫描该文件。禁止扫描的做法如上,在主程序上添加@ComponentScan注解,则spring不会扫描带@ExcludeFromComponentScan注解的文件。
- ribbon默认的负载均衡策略为轮询。
- 如果需要配置多个,则使用@RibbonClients注解,如下
基于配置文件的方式
# 微服务名.ribbon.NFLoadBalancerRuleClassName:负载均衡策略
microservice-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
@RibbonClients(value = {
@RibbonClient(name = "xxx",configuration = xxxConfiguration.class),
@RibbonClient(name = "microservice-provider",configuration = TestConfiguration.class)
})
使用实例:
@RestController
public class MovieController {
@Autowired
private LoadBalancerClient loadBalancerClient;
//用于访问其他微服务的实体。
@Autowired
private RestTemplate restTemplate;
@GetMapping("/movie/{id}")
public User findById(@PathVariable Long id) {
//通过ribbon负载均衡策略,发送一个HTTP请求给一个微服务,并将返回的数据封装到user.class实体中
return this.restTemplate.getForObject("http://microservice-provider/simple/" + id, User.class);
}
@GetMapping("/test")
public String test() {
//根据负载均衡策略获取到一个微服务的信息。
ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider");
System.out.println("111" + ":" + serviceInstance.getServiceId() + ":" + serviceInstance.getHost() + ":" + serviceInstance.getPort());
return "1";
}
}
独立使用ribbon
1.有引入eureka的时候
- 关闭eureka
指定listOfServers
ribbon:
eureka:
enabled: false
microservice-provider:
ribbon:listOfServers: localhost:7900
2.没有引入eureka的时候
添加ribbon依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
/dependency>
指定listOfServers
microservice-provider:
ribbon:listOfServers: localhost:7900
还没有评论,来说两句吧...