Spring Cloud Openfeign微服务接口调用与Hystrix集成实战

news2025/1/12 6:09:48

关于openfeign

可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持Spring MVC注解。OpenFeign和Feign底层都内置了Ribbon负载均衡组件,在导入OpenFeign依赖后无需专门导入Ribbon依赖,用做客户端负载均衡,去调用注册中心服务。
在这里插入图片描述

关于hystrix

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,可以保证一个服务出现故障时,不会导致整个系统出现雪崩效应,以提高分布式系统弹性;

作为“断路器”,在一个服务出现故障时,可以通过短路器监控,返回一个可以处理的响应结果,保证服务调用线程不会长时间被占用,避免故障蔓延。

  • 实现后备策略的示意图

在这里插入图片描述

openfeign微服务接口调用

本项目使用nacos作为注册中心,实现了一个服务提供者:user-service和一个服务调用者(客户端)open-feign,整体调用流程如图所示:
在这里插入图片描述

服务提供方

  • 创建模块:microservice-user
  • 引入依赖:
<!-- 引入 Web 功能 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring cloud alibaba nacos discovery 依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 编写bootstrap.yml配置文件
server:
  port: 9001
  servlet:
    context-path: /user-service
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可
        server-addr: 192.168.56.101:8848
        # server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 # Nacos 服务器地址
        namespace: f687d65c-41a5-44b8-8e0c-80188f8a6ba5
  • 编写service(省略)
  • 编写controller
@RestController
public class UserController {
    @Autowired
    UserService userService;

    @GetMapping("/users")
    List<User> getUsers(){
        return userService.getUsers();
    }

    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }

}
  • 启动项目,测试接口
    浏览器访问:http://localhost:9001/user-service/user/3
    在这里插入图片描述

服务调用方

  • 创建模块:microservice-openfeign
  • 添加依赖:
<dependencies>
    <!-- 引入 Web 功能 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- spring cloud alibaba nacos discovery 依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!-- feign 替换 JDK 默认的 URLConnection 为 okhttp -->
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-okhttp</artifactId>
    </dependency>
    <!-- 集成 hystrix -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    <!--公共依赖-->
    <dependency>
        <groupId>com.laoxu.java</groupId>
        <artifactId>microservice-common</artifactId>
        <version>${project.version}</version>
    </dependency>
</dependencies>
  • 编写启动文件bootstrap.yml
server:
  port: 8000
  servlet:
    context-path: /open-feign
spring:
  application:
    name: open-feign  # nacos中注册的服务名,用于微服务间调用
  cloud:
    nacos:
      discovery:
        enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可
        server-addr: 192.168.56.101:8848
        # server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 # Nacos 服务器地址
        namespace: f687d65c-41a5-44b8-8e0c-80188f8a6ba5
        metadata:
          management:
            context-path: ${server.servlet.context-path}/actuator

feign:
  hystrix:
    enabled: true  # 开启hystrix
  okhttp:
    enabled: true # 使用okhttp替代默认httpclient
  httpclient:
    enabled: false  # 禁用httpclient
  • 编写启动类
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class OpenFeignApp {
    public static void main(String[] args) {
        SpringApplication.run(OpenFeignApp.class);
    }
}
  • 编写FeignConfig配置类

主要配置了Feign调用时的接口打印信息、接口调用超时时间配置。

/**
 * <h1>OpenFeign 配置类</h1>
 * */
@Configuration
public class FeignConfig {

    /**
     * <h2>开启 OpenFeign 日志</h2>
     * */
    @Bean
    public Logger.Level feignLogger() {
        return Logger.Level.FULL;   //  需要注意, 日志级别需要修改成 debug
    }

    /**
     * <h2>OpenFeign 开启重试</h2>
     * period = 100 发起当前请求的时间间隔, 单位是 ms
     * maxPeriod = 1000 发起当前请求的最大时间间隔, 单位是 ms
     * maxAttempts = 5 最多请求次数
     * */
    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default(
                100,
                SECONDS.toMillis(1),
                5
        );
    }

    public static final int CONNECT_TIMEOUT_MILLS = 5000;
    public static final int READ_TIMEOUT_MILLS = 5000;

    /**
     * <h2>对请求的连接和响应时间进行限制</h2>
     * */
    @Bean
    public Request.Options options() {

        return new Request.Options(
                CONNECT_TIMEOUT_MILLS, TimeUnit.MICROSECONDS,
                READ_TIMEOUT_MILLS, TimeUnit.MILLISECONDS,
                true
        );
    }
}

  • 编写feign客户端
    用于调用user-service提供的用户服务接口,其实就是个接口,代码很简单。
    其中path参数为统一调用路径的前缀,value为注册中心中服务提供方的服务名。fallback为指定的hystrix后备策略类。
@FeignClient(value = "user-service",path = "user-service",fallback = UserClientFallback.class)
public interface UserClient {
    /**
     * <h2>通过 OpenFeign 访问 user-service 获取用户列表</h2>
     * */
    @GetMapping(value = "/users")
    List<User> getUsers();

    @GetMapping(value = "/user/{id}")
    User getUserById(@PathVariable("id") Integer id);
}
  • 编写用户控制器

有了上一步中创建的Feign客户端,在controller中可以通过@Autowired注入使用

@RestController
@RequestMapping("/userapi")
public class UserController {
    @Autowired
    UserClient userClient;

    @GetMapping("/users")
    public List<User> getUsers(){
        return userClient.getUsers();
    }

    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Integer id){
        return userClient.getUserById(id);
    }
}
  • 启动项目,进行测试
    浏览器输入:http://localhost:8000/open-feign/userapi/users
    在这里插入图片描述
    说明可以正常通过feign客户端实现微服务接口调用。

与hystrix集成实现后备策略

当openfeign接口调用出现异常,例如接口调用超时,去执行预先设置好的代码逻辑。

创建后备策略类

当feign客户端接口调用异常时,执行对应方法。此处均返回空。

@Slf4j
@Component
public class UserClientFallback implements UserClient {
    @Override
    public List<User> getUsers() {
        log.info("userclient getUsers接口调用失败,执行回退方法");
        return null;
    }

    @Override
    public User getUserById(Integer id) {
        log.info("userclient getUserById接口调用失败,执行回退方法");
        return null;
    }
}

模拟调用超时

注意:因为hystrix默认超时时间为1s,此处我们将服务提供方接口响应时间设置只要大于1s均能模拟接口超时。

  • 修改服务提供方UserController接口
    在获取用户列表方法中添加睡眠4s逻辑代码:
    在这里插入图片描述

启用hystrix

在服务调用方bootstrap.yml文件中添加以下配置即可:

feign:
  hystrix:
    enabled: true  # 开启hystrix

重启项目,测试

浏览器输入:http://localhost:8000/open-feign/userapi/users
此时观察浏览器输出为空:
在这里插入图片描述

项目控制台打印日志,说明成功执行了后备代码。
在这里插入图片描述

项目代码

https://gitee.com/indexman/microservice-learn

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

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

相关文章

dataFactory向mysql批量插入测试数据

目录 第一步&#xff1a;准备阶段&#xff1a;datafactory已连接app_user的表 第二步&#xff1a; 点击原表app_user,其中属性界面properties中配置含义如下&#xff1a; 第三步&#xff1a;根据需要设置插入字段 第四步&#xff1a;设置每个字段的规则后&#xff0c;点击se…

病毒之Worm.Win32.AutoRun

题外话&#xff1a;在被奥密克戎包围的我(两个室友和我&#xff0c;一个低烧、一个咳嗽、就差我了&#xff0c;这属实是真被包围了丫)在和Worm.Win32.AutoRun决一死战… 本次Worm.Win32.AutoRun的来源&#xff1a; windows电脑上重装vscode&#xff0c;然后没有 mingw-get-setu…

浏览器兼容模式如何设置?只需要跟着下面的步骤设置

许多考生在报考教师资格证或者其他的考试报名&#xff0c;会遇到浏览器兼容设置的问题。与其到时急急忙忙来设置浏览器的兼容模式&#xff0c;不如提前设置好&#xff0c;免了后顾之忧。浏览器兼容模式怎么设置&#xff1f;一起来看看关于浏览器兼容模式的含义以及设置方式吧&a…

《Python代码审计》(1)一款超好用的代码扫描工具

1.前言 从本文开始&#xff0c;我将开始介绍Python源代码审计&#xff0c;代码审计是检查源代码中的安全缺陷&#xff0c;检查源代码是否存在安全隐患&#xff0c;或者编码不规范的地方。通常使用自动化工具或者人工审查的方式&#xff0c;自动化工具效率高&#xff0c;但是误…

【浅学Java】Linux系统中的硬连接和软连接

Linux系统中的软连接和硬连接1. 前置知识1.1 文件的存储1.2 inode——索引节点1.3 Linux系统查找文件的过程2. Linux系统中的硬连接2.1 硬连接的实现原理2.2 实现硬连接的指令3. Linux系统中的软连接3.1 软连接的实现原理3.2 实现硬连接的指令4. 软连接和硬连接的区别1. 前置知…

Java 19虚拟线程实战与性能分析

Java 19推出了新特性“虚拟线程”&#xff0c;类似于Go语言中的协程。它是传统线程的不同之处在于&#xff0c;它是一种用户模式&#xff08;user-mode&#xff09;的线程。 虚拟线程是由 JDK 而非操作系统提供的线程的轻量级实现&#xff1a; 虚拟线程是没有绑定到特定操作系…

mock.js的使用

初始化 //main.js中 import "/network/fake-message/index.js" //全局文件中引入虚假数据///network/fake-message/index.js //创建伪数据 import Mock from mockjs import { Random } from mockjs//获取商品列表 Mock.mock(/api\/goodlist/,get,{status:200,mess…

基于java+springmvc+mybatis+vue+mysql的高校课程评价系统

项目介绍 在还没有计算机的时代&#xff0c;对于教学评价的各方面的管理都是靠纸、笔为主要的工具进行的。随着科技的发展&#xff0c;大量信息增长&#xff0c;利用传统的方式已经无法快速、准确的跟随学校各项目的管理工作了。当人们意识到对于大量信息管理的重要性的时候&a…

第二十二章 染色法与匈牙利算法

第二十二章 染色法与匈牙利算法一、使用场景——二分图二、染色法1、算法原理2、代码模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;代码&#xff1a;&#xff08;3&#xff09;分析&#xff1a;三、匈牙利算法1、算法用途2、算法思路3、算法模板&am…

五个月学完软件测试,现在分享以前自学的测试笔记

以前学习手抄的linux命令哈哈哈 定义 在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。 测试就是发现错误而执行程序的过程。 原则 保证测试的覆盖度&#xff0c;但是穷举测试是不可能…

LVI-SAM坐标系外参分析与代码修改,以适配各种数据集

文章目录0.前言1.原作者传感器件坐标系定义与外参修改1.1.博客作者的讲解&#xff08;仅供参考&#xff09;1.2.LIO-SAM的README中作者对其传感器配置的解释1.3.IMU坐标系详解1.4.params_lidar.yaml中LIO外参修改1.4.1.作者给的参数注释问题1.4.2.自己修改代码2.LVI-SAM中的坐标…

Redis常见面试题(一)

目录 1、Redis是什么? 2、Redis有哪些应用场景? 3、Redis有什么优势? 4、Redis为什么这么快? 5、Redis主要消耗什么物理资源? 6、Redis为什么把所有数据放到内存中? 7、Redis命令是原子性的吗? 8、Redis磁盘快照操作是原子的吗? 9、Redis怎么测试连通性? 10、…

【图像去噪】均值+中值+空间+高斯滤波图像去噪【含GUI Matlab源码 763期】

⛄一、图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素&#xff0c;图像去噪是指减少图像中噪声的过程。噪声分类有三种&#xff1a;加性噪声&#xff0c;乘性噪声和量化噪声。我们用f(x,y&#xff09;表示图像&#xff0c;g(x,y&#xff0…

四十六——

四十六、JavaScript——对象 一、对象 数据类型&#xff1a;原始值&#xff1a; 1. 数值 Number 2. 大整数 BigInt 3. 字符串 String 4. 布尔值 Boolean 5. 空值 Null 6. 未定义 Undefinded 7. 符号 Symbol 除了七种原始值之外&#xff0c;后面所用到的数据类型&#xff0c;都…

jsp+ssm计算机毕业设计茶园文化交流平台论文【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

jsp+ssm计算机毕业设计超市收银系统论文【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

【LeetCode101. 对称二叉树】—— 二叉树遍历

101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; …

【探索Spring底层】12.谈谈代理创建器与代理创建时机

文章目录1. 前言2. 谈谈代理创建器3. 代理创建时机是什么时候4. 浅谈Order的失效场景4. 浅谈Order的失效场景5. 高级切面如何转为低级切面1. 前言 Spring中有两种切面&#xff0c;一种是Aspect&#xff0c;另一种是Advisor 其中Aspect是高级切面&#xff0c;Advisor是低级切面…

【网站架构】网站系统怎么才是安全的?安全验收?等保、网络安全、SQL盲注、https、鉴权

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论网站系统的安全性。 安全的重要性不言而喻&#xff0c;大部分安全问题确实是安全扫描后根据指引修改就可以了。 但是仍有一些问题修改起来是特别麻烦的&#xff0c;这些问题会严重影响上线时间。 本期我们的重点不…

共享购模式简单又好玩,撑起市场的半边天,推动实体产业改造上级

在2022年1月18日&#xff0c;国家发展改革委等七部局下发《促进消费实施方案》的通知&#xff0c;确立了”消费送积分”的新形式。该政策的出台&#xff0c;表明了政府探索实施全国绿色消费积分制度&#xff0c;鼓励地方结合实际建立本地绿色消费积分制度&#xff0c;以兑换商品…