SpringCloud详解03-负载均衡Ribbon和Feign

系列文章目录

SpringCloud详解01
SpringCloud详解02



前言

接上篇SpringCloud详解02,本篇记录Ribbon的使用


一、Ribbon简介

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。

Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

二、使用Ribbon实现负载均衡

Ribbon只是一个客户端的负载均衡器工具,实现起来非常的简单,我们只需要在注入RestTemplate的bean上加上@LoadBalanced就可以了

1.在原有代码的基础上修改WebConfig.java

在这里插入图片描述

2.修改消费方的controller方法


    //消费方应该调用生产方的服务
    @RequestMapping("getUsers")
    public JsonResult getUsers(){
    
    

        //由于使用了@LoadBalanced,这里需要通过服务的名称来发送网络请求,在nacos管理界面查看服务名
        String url = "http://provider/user-provider/findAll";
        JsonResult jsonResult = restTemplate.getForObject(url, JsonResult.class);

        System.out.println(jsonResult);

        return jsonResult;
    }

3.将提供服务方开启多个tomcat模拟环境,测试

首先把Springboot的启动改为允许多个启动
在这里插入图片描述
在这里插入图片描述
然后端口号7070启动,为了方便观察,我们在服务提供方的controller中加了一句控制台输出语句,输出当前端口,然后分别将7071,7072启动,
在这里插入图片描述
在这里插入图片描述
7070
在这里插入图片描述

7071
在这里插入图片描述
7072
在这里插入图片描述

接着启动消费方8081
在这里插入图片描述
查看控制台,此时开启了4个启动类
在这里插入图片描述

最后,我们将三个服务提供方控制台清空,去浏览器访问消费方的controller方法,连续访问6次,查看控制台

结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Ribbon默认使用的是轮询,前端发来6次请求,那么服务提供方,每个服务端都分别接到两次。

4.负载均衡策略

Ribbon提供了一个很重要的接口叫做IRule,其中定义了很多的负载均衡策略,默认的是轮询的方式,以下是Ribbon的负载均衡策略

在这里插入图片描述

5.修改默认策略

我们需要在消费方的WebConfig中添加以下代码:

 //创建对象实现改变Ribbon的负载均衡策略,随机规则
    @Bean
    public IRule getRule() {
    
    
        return new RandomRule();
    }

然后重启消费方,再次访问6次

7070:
在这里插入图片描述
7071:
在这里插入图片描述
7072:
在这里插入图片描述

轮询实现成功

三、使用Feign实现负载均衡

1.简介

Feign 和 Ribbon 是 Spring Cloud 的 Netflix 中提供的两个实现软负载均衡的组件,Ribbon 和 Feign 都是用于调用其他服务的,方式不同,Feign 则是在 Ribbon 的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建 http 请求,不过要注意的是抽象方法的注解、方法名要和提供服务的方法对应上

2、Feign和Ribbon 区别

  • 启动类使用的注解不同,Ribbon 用的是@RibbonClient,Feign 用的是@EnableFeignClients。
  • 服务的指定位置不同,Ribbon 是在@RibbonClient 注解上声明,Feign 则是在定义抽象方法的接口中使用@FeignClient 声明。
  • 调用方式不同,Ribbon 需要自己构建 http 请求,模拟 http 请求然后使用 RestTemplate 发送给其他服务,步骤相当繁琐,Feign 是直接通过接口方式调用。

3、使用

  • 在springcloudalibaba-micro-service-consumer-8080的pom.xml中添加依赖

     <!-- Feign -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>2.2.6.RELEASE</version>
            </dependency>
    
  • 在启动类上加上@EnableFeignClients注解,开启Feign
    在这里插入图片描述

  • 创建UserService

    package com.lzl.service;
    
    import com.lzl.dto.UserDto;
    import com.lzl.utils.JsonResult;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.stereotype.Service;
    import org.springframework.web.bind.annotation.*;
    
    /**
     * --效率,是成功的核心关键--
     *
     * @Author lzl
     * @Date 2023/3/15 16:23
     */
    @Service
    @FeignClient("provider")//服务名,需要在nacos界面查看服务列表
    public interface UserService {
          
          
        @RequestMapping("/user-provider/findAll")
        JsonResult findAll();
      
    }
    
    

    注意要加上@FeignClient(“provider”)注解,values为服务提供方yml文件中配置的服务名,也可以在nacos界面查看

  • 创建FeignUserController

    package com.lzl.controller;
    
    import com.lzl.dto.UserDto;
    import com.lzl.service.UserService;
    import com.lzl.utils.JsonResult;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    
    /**
     * --效率,是成功的核心关键--
     *
     * @Author lzl
     * @Date 2023/3/15 16:25
     */
    
    
    @RestController
    @RequestMapping("feign")
    public class FeignUserController {
          
          
    
        @Autowired
        private UserService userService;
    
        @RequestMapping("findAll")
        public JsonResult findAll(){
          
          
            return userService.findAll();
        }
    }
    
    
  • 启动多个provider服务提供方,测试
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

成功


总结

本篇主要记录了SpringCloud中的负载均衡组件,其中,Ribbon基本上已经弃用了,更多的开发者还是选择Feign这种直接通过接口调用的方式,重点是,SpringCloud的服务负载均衡和Nginx的负载均衡不是一种东西,不要混淆,下篇继续

猜你喜欢

转载自blog.csdn.net/l_zl2021/article/details/129578622