Ribbon
ribbon有两个作用:
1、简化远程调用
1.1 pom
由于spring-cloud-starter-netflix-eureka-client已经集成了ribbon,所以只用导入eureka-client就可以了
1.2 在声明RestTemplate对象时添加@LoadBalanced注解
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
1.3 使用RestTemplate发送Ribbon调用
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/goods/{id}")
public Goods findGoodsById(@PathVariable("id") int id){
System.out.println("findGoodsById..."+id);
Goods goods = restTemplate.getForObject("http://eureka-provider/goods/findOne/" + id, Goods.class); //由于restTemplate前加了@LoadBalanced注解,它具备解析服务名的功能
return goods;
}
}
2、实现客户端的负载均衡
Goods goods = restTemplate.getForObject("http://eureka-provider/goods/findOne/" + id, Goods.class); //由于restTemplate前加了@LoadBalanced注解,它具备解析服务名的功能
在使用ribbon发起远程调用时,默认就支持负载均衡(策略:轮询)。
2.1 更改默认的负载均衡策略
2.1.1 通过编码更改
1、使用配置类声明一个负载均衡的bean
在配置为中声明一个bean
@Bean
public IRule rule(){
return new RandomRule();
}
2、在启动类上指定哪个提供者使用该策略
@EnableDiscoveryClient // 激活DiscoveryClient
@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name="eureka-provider",configuration = 配置类.class) //如果不指定name,则所有的远程调用都采用相同的策略
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class,args);
}
}
2.1.2 通过配置文件进行更改
1、对指定微服务设置负载均衡的策略
微服务名称:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡的类
2、对所有微服务设置相同的负载均衡微略
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡的类