一 Ribbon相关概念
1.1 简单描述
在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的 列表信息,并基于内置的负载均衡算法,请求服务。属于客户端的负载均衡(区别于ngnix的服务端负载均衡,客户端负载均衡:客户端会有一个服务器地址列表,在多个可选请求路径中通过算法选择其中一个发送请求,服务端负载均衡:接收到客户端发送的请求后在多个服务器中选择一台作为响应,两者有本质区别)
1.2 Ribbon的主要作用
- 服务调用
基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进行调用。
- 负载均衡
当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址。
二 基于Ribbon实现产品服务的调用
2.1 服务提供者 product模块的改造
为了便于查看负载均衡是否执行成功,需要对服务提供者相关方法进行改写。
- 引入pom文件,由于eureka已经引入了ribbon的依赖,故不需要手动引入
- 修改controller中的findById()方法
@Value("${server.port}")
private String port;
@Value("${spring.cloud.client.ip-address}")
private String ip;
@GetMapping("/{id}")
public Product findById(@PathVariable Long id) {
Product product = productService.findById(id);
product.setProductDesc("调用product服务的ip:" + ip + " port: " + port);
return product;
}
- 修改yaml文件的端口号,使用idea模拟第二台服务
2.2 服务调用者order模块的改造
- 在配置类的resttemplate注入方法的上面添加注解
//标识性注解,使得向restTemplate中增添了一个ribbon的拦截器做相关负载均衡的处理
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 修改controller中的方法,使用restTemplate方法调用服务名称
@RestController
@RequestMapping("/order")
public class OrderController {
//注入restTemplate
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{id}")
public Product getProductById(@PathVariable Long id){
//直接调用在eureka中注册的product服务
Product product = restTemplate.getForObject("http://product/product/" + id, Product.class);
return product;
}
}
- 测试可以发现默认是轮询算法的负载均衡策略
三 Ribbon负载均衡策略
Ribbon内置了多种负载均衡策略
- 修改负载均衡策略,只需要在服务调用端的yaml配置文件做相应的配置即可
##需要调用的微服务名称
product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
网友评论