SpringCloud Ribbon和OpenFeign组件的使用加示意图和详细讲解

news2025/2/26 14:20:41

目录

SpringCloud Ribbon

Ribbon 介绍

 LB(Load Balance)

LB 分类

1. 集中式LB

2. 进程内LB

实例-前面member-consumer 轮询负载访问10000/10002 底层就是Ribbon 默认的轮询负载算法

Ribbon 架构图&机制

Ribbon 机制

Ribbon 常见负载算法 

替换负载均衡算法-应用实例 

需求分析/图解

1.创建member-service-consumer-80 com/springcloud/config/RibbonRule.java

2.修改member-service-consumer-80 com/springcloud/MemberConsumerApplication.java

SpringCloud OpenFeign

OpenFeign 介绍

Feign 和OpenFeign 区别

Feign

OpenFeign

OpenFeign-应用实例

示意图

创建服务消费模块-通过OpenFeigen 实现远程调用

创建application.yml 内容如下

创建主启动类MemberConsumerOpenfeignApplication80.java

创建com/springcloud/service/MemberFeignService.java,

创建com/springcloud/controller/MemberConsumerFeignController.java

注意事项和细节

日志配置

基本介绍

配置日志-应用实例

1. 在member-service-consumer-openfeign-80 创建com/springcloud/config/OpenFeignConfig.java 

2. 在member-service-consumer-openfeign-80 修改application.yml

测试

OpenFeign 超时

先看一个问题

设置超时时间

1. 修改member-service-consumer-openfeign-80 的application.yml

测试


SpringCloud Ribbon

本篇前言 本篇的项目是跟前面的博客 SpringCloud Eureka 的详细讲解及示意图_尘觉的博客-CSDN博客 是Ribbon结合Eureka

Ribbon 介绍

1. Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具
2. Ribbon 主要功能是提供客户端负载均衡算法和服务调用
3. Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。
4. Ribbon 会基于某种规则(如简单轮询,随机连接等)去连接指定服务
5. 程序员很容易使用Ribbon 的负载均衡算法实现负载均衡
6. 一句话: Ribbon: 负载均衡+RestTemplate 调用

官网
1. https://github.com/Netflix/ribbon
2. Ribbon 进入维护状态
3. 官网地址: https://github.com/Netflix/ribbon

 4. Ribbon 目前进入维护模式, 未来替换方案是Spring Cloud LoadBalancer

 LB(Load Balance)

LB 分类

1. 集中式LB

即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;LB(Load Balance 负载均衡)

2. 进程内LB

将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些服务地址可用,然后再从这些地址中选择出一个合适的服务地址。
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址

实例-前面member-consumer 轮询负载访问10000/10002 底层就是Ribbon 默认的轮询负载算法

Ribbon 架构图&机制

Ribbon 机制

1. 先选择EurekaServer,它优先选择在同一个区域内负载较少的server
2. 再根据用户指定的策略,在从server 取到的服务注册列表中选择一个地址
3. Ribbon 提供了多种策略∶ 比如轮询、随机和根据响应时间加权

Ribbon 常见负载算法 

替换负载均衡算法-应用实例 

需求分析/图解

1. 需求: 将默认的轮询算法改成随机算法RandomRule
2. 浏览器输入: http://localhost/member/consumer/get/1
3. 要求访问的10000/10002 端口的服务是随机的

1.创建member-service-consumer-80 com/springcloud/config/RibbonRule.java

/**
 * RibbonRule: 配置自己的负载均衡算法
 */
@Configuration
public class RibbonRule {

    //配置注入自己的负载均衡算法
    @Bean
    public IRule myRibbonRule() {
        //这里返回的是RandomRule,当然也可以自己指定
        return new RandomRule();
    }
}

2.修改member-service-consumer-80 com/springcloud/MemberConsumerApplication.java

//@EnableEurekaClient 将程序标识为eureka client
@EnableEurekaClient
@SpringBootApplication
@EnableDiscoveryClient //启用服务发现
//指定Ribbon的负载均衡算法
@RibbonClient(name = "MEMBER_SERVICE_PROVIDER_URL",configuration = RibbonRule.class)
public class MemberConsumerApplication {
    public static void main(String[] args) {

        SpringApplication.run(MemberConsumerApplication.class,args);
    }
}

测试
1. 浏览器输入: http://localhost/member/consumer/get/1
2. 观察访问的10000/10002 端口的服务是随机的

图片上面有 这里就不展示了


SpringCloud OpenFeign

OpenFeign 介绍

  1. OpenFeign 是个声明式WebService 客户端,使用OpenFeign 让编写Web Service 客户端更简单
  2. 它的使用方法是定义一个服务接口然后在上面添加注解
  3. OpenFeign 也支持可拔插式的编码器和解码器
  4. Spring Cloud 对OpenFeign 进行了封装使其支持了Spring MVC 标准注解和HttpMessageConverters
  5. OpenFeign 可以与Eureka 和Ribbon 组合使用以支持负载均衡
  6. 官网 https://github.com/spring-cloud/spring-cloud-openfeign

Feign 和OpenFeign 区别

Feign

  1.  Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
  2.  Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务
  3.  Feign的使用方式是:使用Feign的注解定义接口,调用服务注册中心的服务
  4.  Feign支持的注解和用法请参考官方文档:https://github.com/OpenFeign/feign
  5.  Feign本身不支持Spring MVC的注解,它有一套自己的注解
  6.  引入依赖
        <!--引入feign-starter 就是场景启动器 使用版本仲裁-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>

OpenFeign

  1. OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
  2. OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口
  3. OpenFeign通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
  4. 引入依赖
        <!--引入openfeign-starter 就是场景启动器 使用版本仲裁-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

精简一句话:OpenFeign 就是在Feign 基础上做了加强, 有些程序员为了方便,说Feign就是指的OpenFeign

OpenFeign-应用实例

示意图

创建服务消费模块-通过OpenFeigen 实现远程调用

1. 参考member-service-consumer-80 创建member-service-consumer-openfeign-80(具体步骤参考以前)

SpringCloud Eureka 的详细讲解及示意图_尘觉的博客-CSDN博客

2. 修改pom.xml

拷贝member-service-consumer-80 的pom.xml 内容,加入openfeign-starter 

    <!--引入相关的依赖: 我们引入了当前需要的依赖,后面如果有其它需要,再灵活调整-->
    <dependencies>

        <!--引入openfeign-starter 就是场景启动器 使用版本仲裁-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--引入eureka client 场景启动器starter-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--引入web-starter 说明我们使用版本仲裁(从父项目继承了版本)
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!--说明:starter-actuator 是springboot程序的监控系统, 可以实现系统的健康检测
        可以通过http://localhost:80/actuator 看到相关的连接,和信息
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>


        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--引入e_commerce_center-common-api-->
        <dependency>
            <groupId>com.wyxedu.springcloud</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>${project.version}</version>
        </dependency>

    </dependencies>

创建application.yml 内容如下

server:
  port: 80
spring:
  application:
    name: e-commerce-consumer-openfeign-80

#配置eureka-client
eureka:
  client:
    register-with-eureka: true #将自己注册到Eureka-Server
    fetch-registry: true
    service-url:
      #表示将自己注册到哪个eureka-server
      #这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

创建主启动类MemberConsumerOpenfeignApplication80.java

@SpringBootApplication
@EnableEurekaClient
//启动OpenFeignClient
@EnableFeignClients
public class MemberConsumerOpenfeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(MemberConsumerOpenfeignApplication.class, args);
    }
}

先测试一下看看程序有没有报错在执行后面的配置

创建com/springcloud/service/MemberFeignService.java,

注意:这里是OpenFeign 的核心

@Component
//这里MEMBER-SERVICE-PROVIDER 就是Eureka Server 服务提供方注册的名称
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")
public interface MemberFeignService {

    //这里定义方法-就是远程调用的接口

    /**
     * 1. 远程调用的方式是get
     * 2. 远程调用的url http://MEMBER-SERVICE-PROVIDER/member/get/{id}
     * 3. MEMBER-SERVICE-PROVIDER 就是服务提供方在Eureka Server 注册的服务
     * 4. openfeign 会根据负载均衡来决定调用10000/10002-默认是轮询
     * 5. 因为openfeign 好处是支持了springmvc注解 + 接口解耦
     */
    @GetMapping("/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id);
}

创建com/springcloud/controller/MemberConsumerFeignController.java

@RestController
public class MemberConsumerFeignController {

    //装配MemberFeignService
    @Resource
    private MemberFeignService memberFeignService;

    @GetMapping(value = "/member/consumer/openfeign/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id) {
        return memberFeignService.getMemberById(id);
    }
}

测试

1. 浏览器输入: http://localhost/member/consumer/openfeign/get/1
2. 观察访问的10000/10002 端口的服务是轮询的

注意事项和细节

1. 配Openfeign的使用特点是微服务调用接口+@FeignClient , 使用接口进行解耦

2. @FeignClient(value = "MEMBER-SERVICE-PROVIDER")

这里MEMBER-SERVICE-PROVIDER就是Eureka Server服务提供方注册的名称, 不要写错了

3. 接口方法上: value是不能乱写

远程调用的url 为http://MEMBER-SERVICE-PROVIDER/member/get/{id} 

@GetMapping(value = "/member/get/{id}")
public Result<Member> getMembertById(@PathVariable("id") Long id);

日志配置

基本介绍

1. 说明: Feign 提供了日志打印功能,可以通过配置来调整日志级别,从而对Feign 接口的调用情况进行监控和输出

2. 日志级别

  1. NONE∶默认的,不显示任何日志
  2. BASIC∶仅记录请求方法、URL、响应状态码及执行时间;
  3. HEADERS∶除了BASIC中定义的信息之外,还有请求和响应的头信息;
  4. FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。

配置日志-应用实例

1. 在member-service-consumer-openfeign-80 创建com/springcloud/config/OpenFeignConfig.java 

@Configuration
public class OpenFeignConfig {

    @Bean
    public Logger.Level loggerLevel() {
       //日志级别指定为FULL
       return Logger.Level.FULL;
    }
}

2. 在member-service-consumer-openfeign-80 修改application.yml

常见的日志级别有5 种,分别是error、warn、info、debug、trace

.

  1. error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的;
  2. warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
  3. info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
  4. debug:用于开发DEBUG 的,关键逻辑里面的运行时数据;
  5. trace:最详细的信息,一般这些信息只记录到日志文件中。
server:
  port: 80
spring:
  application:
    name: e-commerce-consumer-openfeign-80

#配置eureka-client
eureka:
  client:
    register-with-eureka: true #将自己注册到Eureka-Server
    fetch-registry: true
    service-url:
      #表示将自己注册到哪个eureka-server
      #这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

logging:
  level:
    #对MemberFeignService 接口调用过程打印信息-Debug
    com.wyxedu.springcloud.service.MemberFeignService: debug

测试

1 浏览器: http://localhost/member/consumer/openfeign/get/1
2 结果页面

别忘了,撤销测试日志配置 

OpenFeign 超时

先看一个问题

1. 修改member-service-provider-10000/10002 的com/wyxedu/springcloud/controller/MemberController.java

   //查询的方法/接口
    //这里使用url占位符+@PathVariable
    @GetMapping("/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {

        //模拟超时, 休眠5s
        try {
           TimeUnit.MILLISECONDS.sleep(5000);
        } catch (InterruptedException e) {
           e.printStackTrace();
        }

        Member member = memberService.queryMemberById(id);

        //使用Result把查询到的结果返回
        if (member != null) {
            //return Result.success("查询会员成功 member-service-provider-10000 " + color + "-" + address, member);
            return Result.success("查询会员成功 member-service-provider-10000", member);
        } else {
            return Result.error("402", "ID= " + id + "不存在");
        }

    }

2.浏览器访问http://localhost/member/consumer/openfeign/get/1

原因分析: OpenFeign 默认超时时间1 秒钟,即等待返回结果1 秒

设置超时时间

说明: 在某些情况下,一个服务调用时间可能要超过1 秒,就需要重新设置超时时间

1. 修改member-service-consumer-openfeign-80 的application.yml

server:
  port: 80
spring:
  application:
    name: e-commerce-consumer-openfeign-80

#配置eureka-client
eureka:
  client:
    register-with-eureka: true #将自己注册到Eureka-Server
    fetch-registry: true
    service-url:
      #表示将自己注册到哪个eureka-server
      #这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

#logging:
#  level:
#    #对MemberFeignService 接口调用过程打印信息-Debug
#    com.wyxedu.springcloud.service.MemberFeignService: debug

ribbon:
  #1. 设置feign客户端超时时间(openfeign默认支持ribbon)
  #2. ReadTimeout: 8000: 建立连接从服务提供方获取可用资源的所用的全部时间
  #3. 时间单位是毫秒
  ReadTimeout: 8000
  #两端连接所用时间
  ConnectionTimeout: 8000

测试

1. 浏览器输出: http://localhost/member/consumer/openfeign/get/1, 不会出现超时,会轮询访问10000/10002

别忘了,撤销超时测试代码和配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CCS新建工程教程

1.先点击ccs软件&#xff0c;打开一个工作台&#xff1a; 2.点击“Project”菜单&#xff0c;选择“New CCS Project”项目&#xff0c;新建 CCS 工 程 3. ①&#xff1a;我们开发板上使用的 DSP 芯片是 TMS320F28335&#xff0c;所以这里我们选择 TMS320F28335。 ②&#xff…

一文读懂Vite和Webpack的区别?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、webpack是什么&#xff1f;二、webpack如何工作&#xff1f;三、Vite是什么&#xff1f;Vite和Webpack的区别&#xff1f; 提示&#xff1a;以下是本篇文章正文…

【Nginx】负载均衡

文章目录 负载均衡概述负载均衡的原理及处理流程负载均衡常用的处理方式方式一:用户手动选择方式二:DNS轮询方式方式三:四/七层负载均衡 Nginx七层负载均衡的指令upstream指令server指令 Nginx七层负载均衡的实现流程负载均衡状态负载均衡策略负载均衡案例案例一&#xff1a;对…

“多杆合一”降本增效——数字孪生智慧灯杆

随着智慧城市建设的不断深入&#xff0c;智慧灯杆作为城市基础设施的重要组成部分&#xff0c;正在成为城市智能化和绿色化的重要手段之一。 图扑智慧灯杆系统在城市道路照明领域引入信息化手段&#xff0c;通过构建路灯物联网&#xff0c;实现了现代化的路灯按需维修和按需照…

Windows与Linux系统实现文件互传(通俗易懂)

SCP指令可以实Windows系统与Linux系统之间的文件互传 引言Windows系统文件传输到Linux系统上&#xff08;先操作&#xff09;Windows系统文件传输到Linux系统上&#xff08;再细聊&#xff09;Linux系统文件传输到Windows系统上&#xff08;先操作&#xff09;Linux系统文件传输…

【PCIE702-1】基于Kintex UltraScale系列FPGA的高性能PCIe总线数据预处理载板

板卡概述 PCIE702-1是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口&#x…

【首发】全道科技轻地图数据闭环解决方案

近日&#xff0c;全道科技执行董事王闯在WGDC 2023进行了《从‘重感知、轻地图’看城市NOA解决方案创新与发展》的主题演讲&#xff0c;不仅从高精地图自动化量产技术服务商角度&#xff0c;以更加专业的视角阐释了自动驾驶实现“轻地图”的路径&#xff0c;同时发布了基于此趋…

域名所有权验证教程

申请域名型证书&#xff0c;可以通过以下方式验证域名的所有权&#xff1a;1. 文件验证&#xff08;云建站主机请选择dns方式&#xff09;2. 手动DNS验证 3. 自动DNS验证 申请域名型证书&#xff0c;可以通过以下方式验证域名的所有权&#xff1a; 1. 文件验证 根据提示需要创…

数字化军港管理:智慧可视化的力量

随着科技的不断发展和军事需求的日益增长&#xff0c;智慧军港可视化技术成为军事领域中备受瞩目的创新应用。以数据可视化为核心&#xff0c;智慧军港可视化将军港运营管理提升到一个全新的水平&#xff0c;为军事力量的部署、维护和战备提供了前所未有的支持和优势。 山海鲸 …

全面SOA化,详解华为iDVP数字底座

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 作者 | 张萌宇 在汽车产业向智能化转型的过程中&#xff0c…

WindowManager 1.1.0-beta01 新功能详解

作者 / 技术撰稿人兼软件工程师 Jon Eckenrode Jetpack WindowManager 库的 1.1.0-beta01 版本正继续有条不紊地推进 1.1.0 稳定版本的发布。Beta 版增加多个新特性和功能&#xff0c;欢迎您即刻进行测试、抢先体验&#xff01; 我们需要您的反馈以优化 WindowManager 的功能&a…

丁凯博士在CCIG:文档图像处理「新未来」

文章目录 ⭐️ CCIG大会简介⭐️ 合合信息 与 丁凯博士⭐️ 领先世界的智能文档处理技术&#x1f31f; 智能图像处理&#xff1a;为文字识别 "增质提效" 筑基✨ 切边增强 - 提升文档图像质量✨ 弯曲矫正 - 解决图像畸变问题✨ 去摩尔纹 - 保证图像信息完整 &#x1f…

各行业防雷工程和防雷接地的应用方案

随着现代电气、电子设备的广泛应用&#xff0c;防雷措施也越来越受到重视。特别是在单位、家庭建筑物中&#xff0c;为了保障人们的生命财产安全&#xff0c;必须采取严格的防雷措施。 一、防雷举措 接地系统 接地系统是防雷措施的基础&#xff0c;其目的是将建筑物内部的电…

AI孙燕姿爆火,华语乐坛重温旧梦

最近在B站&#xff0c;AI孙燕姿火了。 浏览相关搜索页面&#xff0c;这位新晋“红人”翻唱了各种类型的歌曲&#xff0c;包括《红豆》《爱在西元前》《水星记》《安河桥》&#xff0c;甚至还有《向天再借五百年》&#xff0c;更重要的是&#xff0c;表现普遍不俗&#xff0c;俘…

态路小课堂丨光口不亮?三种简单故障排查请查收!

在光链路中&#xff0c;当遇到交换机光口互连不亮情况时&#xff0c;很多人不知道如何处理。本文态路为您介绍三种简单故障排查方案&#xff0c;助您快速进行故障排查和问题定位。 一、首先检查一致性 1、两端光模块型号是否一致。一般包括速率、封装模式、接口类型、传输波长、…

pdf如何删除其中一页?不妨试试这些办法

PDF格式是一种非常常见的文档格式&#xff0c;它可以在各种系统和设备上使用&#xff0c;而且无论在哪里打开&#xff0c;都可以保持格式的一致性。有时候&#xff0c;我们需要删除PDF文档中的一页&#xff0c;无论是为了更改文档的结构&#xff0c;还是为了删除错误的信息。在…

chatgpt赋能Python-python_imapclient

Python IMAPClient – 了解如何使用它 Python是一种流行的解释性编程语言&#xff0c;它在Web开发、数据科学、人工智能等领域得到广泛应用。Python提供了极大的灵活性和易用性&#xff0c;几乎可以满足任何编程需求。如果你需要编写电子邮件客户端&#xff0c;Python IMAPCli…

Spring Boot 日志处理

Spring Boot 日志处理 Spring Boot 是一个非常流行的 Java 开发框架&#xff0c;它提供了简洁的配置和强大的开发工具。日志是应用程序中必不可少的一部分&#xff0c;因为它可以帮助开发人员进行调试和故障排除。Spring Boot 提供了多种日志框架&#xff0c;本文将重点介绍如…

Spring Cloud Feign 是什么?如何使用它来简化 RESTful 调用?

Spring Cloud Feign 是什么&#xff1f;如何使用它来简化 RESTful 调用&#xff1f; 在分布式系统中&#xff0c;服务之间的通信是非常常见的场景。通常情况下&#xff0c;服务之间的通信是通过 RESTful API 实现的。但是&#xff0c;手动编写 RESTful 调用代码非常繁琐&#…

python---变量(1)

EG:计算方差 1.先把这一组数的平均值计算出来&#xff08;后面会反复使用&#xff09; 2.针对每个数字&#xff0c;分别计算数字和平均值的差&#xff0c;再平方。 3.把2中的平方值相加 4.总和/&#xff08;项数-1&#xff09; 下面我们开始实现这个代码&#xff01; 代码运行…