负载均衡
Ribbon 负责均衡策略:
随机 :RandomRule
轮询 :RoundRobinRule
最小并发:BestAvailableRule
过滤:AvailabilityFilteringRule
响应时间:WeightedResponseTimeRule
轮询重试:RetryRule
性能可用性:ZoneAvoidanceRule
测试单机模式
为方便查看效果
@RestController@RequestMapping("/goods")public class GoodsController {@Autowiredprivate GoodsService goodsService;@Value("${server.port}")private int port;@GetMapping("/findOne/{id}")public Goods findOne(@PathVariable("id") int id){Goods goods = goodsService.findOne(id);// 返回端口号,方便测试goods.setTitle(goods.getTitle()+":"+port);return goods;}}
前面写的控制器,因为配置了负载均衡,此时已经无法访问。
@RestController@RequestMapping("/order")public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/goods2/{id}")public Goods findGoodsById2(@PathVariable("id") int id){String url = "http://EUREKA-PROVIDER/goods/findOne/"+id;// 3. 调用方法Goods goods = restTemplate.getForObject(url, Goods.class);return goods;}}
硬编码方式
@Configurationpublic class RestTemplateConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}@Beanpublic IRule rule(){return new RandomRule();}}
/*配置Ribbon的负载均衡策略 name* name:设置 服务提供方的 应用名称* configuration:设置负载均衡Bean*/@RibbonClient(name="EUREKA-PROVIDER",configuration = RestTemplateConfig.class)public class ConsumerApp {public static void main(String[] args){SpringApplication.run(ConsumerApp.class,args);}}
注解方式
在消费者配置类application.yml中配置
# 配置的方式设置Ribbon的负载均衡策略EUREKA-PROVIDER: # 设置的服务提供方的 应用名称ribbon:NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略类
在RestTemplateConfig.java中配置
@Configurationpublic class RestTemplateConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}}
测试
- eureka-server
- feign-consumer
- feign-provider

