• 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)


    前言
    👏作者简介:我是笑霸final,一名热爱技术的在校学生。
    📝个人主页:个人主页1 || 笑霸final的主页2
    📕系列专栏:《后端专栏》
    📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
    🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

    在这里插入图片描述

    一、Ribbon简介

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

    • Ribbon工作步骤
      第一步先选择 EurekaServer,它优先选择同一个区域内负载较少的server
      第二步再根据用户指定的策略,再从server取到的服务注册列表中选择一个地址

    • Ribbon核心组件IRule
      在这里插入图片描述

    二、Ribbon入门案列

    2.1引入依赖

    • 使用的Eureka集成了ribbon
     		<dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    • 也可以单独使用ribbon
       <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-ribbonartifactId>
       dependency>
    
    • 1
    • 2
    • 3
    • 4

    2.2 使用ribbon

    我们用的RestTemplate+ribbon来实现负载均衡

    主程序(加@EnableEurekaClient注解)

    @SpringBootApplication
    @EnableEurekaClient
    public class OrderMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderMain80.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    controller

    @RestController
    public class DeptController_Consumer
    {
    	private static final String REST_URL_PREFIX = "http://CLOUD-PAYMENT-SERVICE"; //微服务的虚拟id
     
    	@Autowired
    	private RestTemplate restTemplate;
     
    	@RequestMapping(value = "/consumer/dept/add")
    	public boolean add(Dept dept)
    	{
    		return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这样就能在CLOUD-PAYMENT-SERVICE开启负载均匀了

    2.2修改负载均匀的方式

    • 默认按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败侧在指定的时间会进行重试,进行获取可用的服务

    • 根据官方文档的意思,推荐在 springboot 主程序扫描的包范围之外进行自定义配置类

    • 创建配置类
      在这里插入图片描述
      代码如下
      在这里插入图片描述

    • 然后在启动类加上@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)注解
      在这里插入图片描述

    三 、openfeign简介

    • 是什么
      OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。

    • openfeign的用途
      服务发现,负载均衡,服务调用

    • 原理
      基于@EnableFeignClients 将所有被@FeignClient注解的类 注册到容器中。当这些被@FeignClient注解的类被调用时会创建一个动态代理的对象为我们创建被调用类的实例,然后都会被统一转发给 Feign 框架所定义的一个 InvocationHandler , 由该 Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的工作。
      在这里插入图片描述

    四、openfeign的使用

    4.1导入maven依赖

      
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    • 也是集成了ribbon

    4.2服务调用

    • 上面我们用的是ribbon+restTemplate
    • 现在直接openfeign

    一、接口+注解(微服务调用接口=@FeignClient
    写服务接口
    在这里插入图片描述
    代码如下

    @Component
    @FeignClient(value = "CLOUD-PAYMENT-SERVICE")
    public interface PaymentFeignService {
    
        @GetMapping("/payment/get/{id}")
        CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、yml文件

    server:
      port: 8000
    
    eureka:
      client:
        register-with-eureka: false
        service-url:
          defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    三、主启动类开启功能(加@EnableFeignClients注解)

    @SpringBootApplication
    @EnableFeignClients
    public class OrderFeignMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderFeignMain80.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    四、业务类

    @RestController
    @Slf4j
    public class OederFeignController {
    
        @Resource
        private PaymentFeignService paymentFeignService;
    
        @GetMapping(value = "/consumer/payment/get/{id}")
        public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
        {
            return paymentFeignService.getPaymentById(id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.3 openfeign超时控制

    只需要在yaml文件加上如下代码

    #设置feign客户端超时时间(OpenFeign默认支持ribbon)
    ribbon:
    #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
      ReadTimeout: 5000
    #指的是建立连接后从服务器读取到可用资源所用的时间
      ConnectTimeout: 5000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    完整的yml文件

    server:
      port: 8000
    
    eureka:
      client:
        register-with-eureka: false
        service-url:
          defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/
    #设置feign客户端超时时间(OpenFeign默认支持ribbon)
    ribbon:
    #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
      ReadTimeout: 5000
    #指的是建立连接后从服务器读取到可用资源所用的时间
      ConnectTimeout: 5000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.4 openfeign日志打印功能

    先在yml加上

    logging:
      level:
        # feign日志以什么级别监控哪个接口
        具体的接口路径: debug
    
    • 1
    • 2
    • 3
    • 4

    比如我的yml文件

    server:
      port: 8000
    
    eureka:
      client:
        register-with-eureka: false
        service-url:
          defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/
    #设置feign客户端超时时间(OpenFeign默认支持ribbon)
    ribbon:
    #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
      ReadTimeout: 5000
    #指的是建立连接后从服务器读取到可用资源所用的时间
      ConnectTimeout: 5000
    
    logging:
      level:
        # feign日志以什么级别监控哪个接口
        com.xbfinal.springcloud.service.PaymentFeignService: debug
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    然后写配置类
    在这里插入图片描述

    @Configuration
    public class FeignConfig
    {
        @Bean
        Logger.Level feignLoggerLevel()
        {
            return Logger.Level.FULL;//详细日志
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 日志级别介绍
      NONE:默认的,不显示任何日志
      BASIC:仅记录请求方法、URL、响应状态码及执行时间
      HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息
      FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

    • 测试
      在这里插入图片描述
      在这里插入图片描述
      🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

  • 相关阅读:
    java计算机毕业设计ssm基金分析系统的设计与实现
    svn下载安装与使用教程/方法
    VLDB'22 HiEngine极致RTO论文解读
    1) 数字信号及其基本运算
    【python】变量作用域&LEGB规则&global/nonlocal关键字
    RTX3050安装pytorch(安装CUDA11.3版本)
    2023-python pdf转换为PPT代码
    CentOS 7离线升级OpenSSH至9.1p1操作过程及遇上的问题
    react中获取input输入框内容的两种方法
    剑指 Offer II 063. 替换单词
  • 原文地址:https://blog.csdn.net/weixin_52062043/article/details/127382330