SpringCloud Ribbon负载均衡

什么是Ribbon

Ribbon 是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中, Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读 取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。

在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的 列表信息,并基于内置的负载均衡算法,请求服务

Ribbon的主要作用

服务调用:基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进行调用

负载均衡:当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

Ribbon的使用

我们对之前的案例做优化,之前我们订单服务调用商品服务使用了

restTemplate.getForObject("http://127.0.0.1:9001/product/"+id,Product.class)

我们之前请求地址是硬编码写死的,现在通过ribbon去Eureka注册中心获取服务列表

坐标依赖

在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。所以不需要导入任何额外的坐标

服务消费者修改

shop_service_order模块中的启动类OrderApplication 中在创建RestTemplate方法 上添加 @LoadBalanced 注解

@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

Ribbon调用

shop_service_orderOrderController 中添加下单方法,并使用RestTemplate完成服务调用

请求地址不再是之前的硬编码,而是填写需要请求的微服务的服务名,Ribbon会去Eureka注册中心中自动获取服务列表,如果服务是集群的有多个服务,那么Ribbon会从这个微服务列表中通过负载均衡算法选择一个服务器,然后进行访问
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
    public Product findById(@PathVariable Long id) {
        Product product = null;
        product = restTemplate.getForObject("http://shop-service-product/product/"+id,Product.class);
        return product;
    }
}

Ribbon负载均衡策略

Ribbon内置了多种负载均衡策略,内部负责负载均衡的顶级接口为 com.netflix.loadbalancer.IRule

  • com.netflix.loadbalancer.RoundRobinRule
    以轮询的方式进行负载均衡。
  • com.netflix.loadbalancer.RandomRule
    获取所有服务实例列表,循环通过一个随机数作为索引返回服务实例,直到返回一个不为空的服务实例。
  • com.netflix.loadbalancer.RetryRule
    重试策略,采用RoundRobinRule的选择机制,进行反复尝试,当花费时间超过设置的阈值maxRetryMills时,就返回null。
  • com.netflix.loadbalancer.WeightedResponseTimeRule
    权重策略。会计算每个服务的权重,越高的被调用的可能性越大
  • com.netflix.loadbalancer.BestAvailableRule
    最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回。
  • com.netflix.loadbalancer.AvailabilityFilteringRule
    可用过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实力中轮询调用。

在服务消费者的application.yml配置文件中修改负载均衡策略

#需要调用的微服务名称 
shop-service-order:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

策略选择: 如果每个机器配置一样,则建议不修改策略

添加新评论

评论列表