欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

4. 使用Ribbon实现客户端负载均衡,接上一篇:将服务注册到nacos中

程序员文章站 2024-03-16 10:27:46
...

接上一篇:3.将服务注册到nacos中


什么是负载均衡

通常来说,负载均衡就是将负载平衡到多个节点上
百度百科-负载均衡

根据负载均衡发生的位置可以分为: 服务器端负载均衡客户端负载均衡
两种负载均衡的解释

基于 Ribbon 实现负载均衡

1. Ribbon 简介

Rabbon 是 Netflix 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中, nacos一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从nacos中读 取到的服务信息,在调用服务节点提供的服务时,会根据策略进行负载。 在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的 列表信息,并基于内置的负载均衡算法,请求服务。

2. Ribbon 的主要作用

  • 服务调用

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


  • 负载均衡

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

3. 使用

1. 在RestTemplate 的生成方法上添加 @LoadBalanced 注解

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

2. 修改服务的调用方法
原本使用的是 http://ip地址:端口号/服务器地址 的方式进行调用远程方法
现在改为: http://服务名/服务器地址 的方式进行访问

例如:

Product product = restTemplate.getForObject("http://springboot-cloud-product/product/selectOne/1", Product.class);

说明:Product 等实体类在公共模块中存放,子项目引用公共模块,相当于每个模块中都有一份相同的实体类。


远程调用代码:

@RestController
@RequestMapping("order")
public class OrderController {
    /**
     * 服务对象
     */
    @Resource
    private OrderService orderService;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("addOne/{pid}")
    public Order addOne(@PathVariable("pid") Integer pid) {
        Product pro = restTemplate.getForObject("http://springboot-cloud-product/product/selectOne/1", Product.class);
        Order order = new Order();
        order.setPid(pid);
        order.setNumber(1);
        order.setPprice(pro.getPprice());
        order.setPname(pro.getPname());
        // TODO 用户信息需要登陆后获取
        order.setUid(1);
        order.setUsername("法外狂徒张三");
        return this.orderService.insert(order);
    }
}

4. 负载均衡策略

Ribbon 默认使用的负载均衡策略是轮询策略。
Ribbon 内置了许多的负载均衡策略。内部负载均衡的*接口为:com.netflix.loadbalancer.IRule


具体策略如图所示:
4. 使用Ribbon实现客户端负载均衡,接上一篇:将服务注册到nacos中

可以通过配置修改Ribbon的负载均衡策略,
请求方 或者叫做 调用方的 application 的配置文件中修改,这里使用yml格式


代码:

springboot-cloud-product:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

写这部分代码的时候,没有提示,防止写错,建议前边的复制,后边的进入到对应的规则类中,复制路径加类名