负载均衡
Ribbon 负责均衡策略:
随机 :RandomRule
轮询 :RoundRobinRule
最小并发:BestAvailableRule
过滤:AvailabilityFilteringRule
响应时间:WeightedResponseTimeRule
轮询重试:RetryRule
性能可用性:ZoneAvoidanceRule
测试单机模式
为方便查看效果
@RestController
@RequestMapping("/goods")
public class GoodsController {
@Autowired
private 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 {
@Autowired
private RestTemplate restTemplate;
@Autowired
private 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;
}
}
硬编码方式
@Configuration
public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
public 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中配置
@Configuration
public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
测试
- eureka-server
- feign-consumer
- feign-provider