负载均衡

Ribbon 负责均衡策略:
随机 :RandomRule
轮询 :RoundRobinRule
最小并发:BestAvailableRule
过滤:AvailabilityFilteringRule
响应时间:WeightedResponseTimeRule
轮询重试:RetryRule
性能可用性:ZoneAvoidanceRule

测试单机模式

为方便查看效果

  1. @RestController
  2. @RequestMapping("/goods")
  3. public class GoodsController {
  4. @Autowired
  5. private GoodsService goodsService;
  6. @Value("${server.port}")
  7. private int port;
  8. @GetMapping("/findOne/{id}")
  9. public Goods findOne(@PathVariable("id") int id){
  10. Goods goods = goodsService.findOne(id);
  11. // 返回端口号,方便测试
  12. goods.setTitle(goods.getTitle()+":"+port);
  13. return goods;
  14. }
  15. }

前面写的控制器,因为配置了负载均衡,此时已经无法访问。

  1. @RestController
  2. @RequestMapping("/order")
  3. public class OrderController {
  4. @Autowired
  5. private RestTemplate restTemplate;
  6. @Autowired
  7. private DiscoveryClient discoveryClient;
  8. @GetMapping("/goods2/{id}")
  9. public Goods findGoodsById2(@PathVariable("id") int id){
  10. String url = "http://EUREKA-PROVIDER/goods/findOne/"+id;
  11. // 3. 调用方法
  12. Goods goods = restTemplate.getForObject(url, Goods.class);
  13. return goods;
  14. }
  15. }

硬编码方式

  1. @Configuration
  2. public class RestTemplateConfig {
  3. @LoadBalanced
  4. @Bean
  5. public RestTemplate restTemplate(){
  6. return new RestTemplate();
  7. }
  8. @Bean
  9. public IRule rule(){
  10. return new RandomRule();
  11. }
  12. }
  1. /*
  2. 配置Ribbon的负载均衡策略 name
  3. * name:设置 服务提供方的 应用名称
  4. * configuration:设置负载均衡Bean
  5. */
  6. @RibbonClient(name="EUREKA-PROVIDER",configuration = RestTemplateConfig.class)
  7. public class ConsumerApp {
  8. public static void main(String[] args){
  9. SpringApplication.run(ConsumerApp.class,args);
  10. }
  11. }

注解方式

在消费者配置类application.yml中配置

  1. # 配置的方式设置Ribbon的负载均衡策略
  2. EUREKA-PROVIDER: # 设置的服务提供方的 应用名称
  3. ribbon:
  4. NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略类

在RestTemplateConfig.java中配置

  1. @Configuration
  2. public class RestTemplateConfig {
  3. @LoadBalanced
  4. @Bean
  5. public RestTemplate restTemplate(){
  6. return new RestTemplate();
  7. }
  8. }

测试

  • eureka-server
  • feign-consumer
  • feign-provider


image.png