首页 > 其他分享 >Spring Boot2.x 集成 OpenFeign 实现 Hystrix 熔断降级与 Ribbon 负载均衡配置

Spring Boot2.x 集成 OpenFeign 实现 Hystrix 熔断降级与 Ribbon 负载均衡配置

时间:2023-12-31 11:45:51浏览次数:40  
标签:OpenFeign Hystrix Spring springframework org import com public cloud

参考

踩坑与注意

  1. OpenFeign 默认超时为 1s,如果使用 Hystrix 的时候,报以下错误,可以尝试修改 OpenFeign 超时时间。
    • Read timed out executing GET
    • 配置 Hystrix HystrixTimeoutException 超时 不生效
    • Hystrix circuit short-circuited and is OPEN (因为失败过多,自动触发短路)
  2. 找不到 @HystrixCommand 相关注解,因为 spring-cloud-starter-openfeign 依赖虽然集成了 Hystrix ,但是并没有相关注解,需要引入 spring-cloud-starter-netflix-hystrix 依赖。
  3. 测试 Ribbon 超时配置并未生效(环境:消费者和注册中心在线,提供者下线;Feign 超时设置100s,Ribbon 设置2s)。
  4. 参考 jeecg-boot 服务降级是将所有远程调用接口封装到一个类,然后使用 fallbackFactory 模式进行处理。
  5. Ribbon 已被 spring-cloud-starter-openfeign 集成。
  6. Hystrix 可以有很多方式指定降级处理函数。
  7. 可以通过 Hystrix Dashboard 进行监控和调试。

环境

环境 版本 说明
windows 10
vs code 1.85.1
Spring Boot Extension Pack v0.2.1 vscode插件
Extension Pack for Java v0.25.15 vscode插件
JDK 11
Springboot 2.3.12.RELEASE
spring-cloud-dependencies Hoxton.SR12 mvn依赖
spring-cloud-starter-netflix-eureka-client 未设置 mvn依赖
spring-cloud-starter-netflix-eureka-server 未设置 mvn依赖
spring-cloud-starter-openfeign 未设置 mvn依赖
spring-cloud-starter-netflix-hystrix 未设置 mvn依赖,如果不需要 hystrix 相关注解可以不引入,可以通过 @FeignClient 注解 fallbackFactory、fallback 进行指定降级处理类。
Apache Maven 3.8.6

正文

项目分为多模块:注册中心(registry)、消费者(consumer)、提供者(provider)、common (公共模块)。

准备工作

准备工作请参考该文章实现基础项目的搭建 《Spring Boot2.x 集成 Eureka 与 OpenFeign》,本文代码可通过文章顶部 参考 中下载。

  1. application.properties 修改默认超时与开启 hystrix。
# feign开启hystrix
feign.circuitbreaker.enabled=true
# 修改超时时间
feign.client.config.default.connectTimeout=100000
feign.client.config.default.readTimeout=600000
# # 配置所有服务连接超时
# feign.client.config.default.connect-timeout=5000
# #配置所有服务等待超时
# feign.client.config.default.read-timeout=5000
# 日志
feign.client.config.default.loggerLevel=full
# gzip压缩
feign.compression.request.enabled=true
feign.compression.response.enabled=true
# hystrix
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=100000
# hystrix.command.default.metrics.rollingStats.timeInMilliseconds=5000
# hystrix.command.default.circuitBreaker.requestVolumeThreshold=4
# hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
# hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=3000
# hystrix.command.commandKeyTest.execution.isolation.thread.timeoutInMilliseconds=10000

Hystrix 熔断降级 (消费者(consumer)子模块)

由于本文没有使用到 hystrix 的相关注解,直接使用 @FeignClient 注解 fallbackFactory、fallback 进行指定降级处理类进行演示。如果需要 hystrix 的相关注解,请 pom.xml 引入 spring-cloud-starter-netflix-hystrix 依赖。

fallbackFactory 类重写 create ,返回的是当前接口的实例;fallback 实现的是当前接口;
参考 jeecg-boot 如果调用的 Feign 接口函数包含返回值,则返回 null,然后在调用处代码判断是否是 null。

  1. 入口文件

    package com.xiaqiuchu.consumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @EnableFeignClients
    @EnableEurekaClient
    @SpringBootApplication
    public class ConsumerApplication {
    	public static void main(String[] args) {
    		SpringApplication.run(ConsumerApplication.class, args);
    	}
    
    }
    
  2. fallbackFactory 模式(推荐,可以获取报错信息,与 fallback 模式任选其一)。

    1. StudentService
      package com.xiaqiuchu.consumer.service;
      
      import org.springframework.cloud.openfeign.FeignClient;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      import org.springframework.web.bind.annotation.RequestParam;
      
      import com.xiaqiuchu.common.entity.Student;
      import com.xiaqiuchu.consumer.component.StudentServiceFallBackFactory;
      
      // 回退类正常模式(无法获取详细报错信息)
      // @FeignClient(value = "STUDENT-TEACHER-PROVIDER", fallback = StudentServiceFallBack.class)
      // 工厂模式(获取详细报错信息)
      @FeignClient(value = "STUDENT-TEACHER-PROVIDER", fallbackFactory = StudentServiceFallBackFactory.class)
      public interface StudentService {
      
      	@RequestMapping(method = RequestMethod.GET, value = "/student/findById")
      	public Student findById(@RequestParam(name = "id") Long id);
      
      	@RequestMapping(method = RequestMethod.GET, value = "/student/ping")
      	public String ping();
      }
      
      
    2. StudentServiceFallBackFactory
      	package com.xiaqiuchu.consumer.component;
      
      	import org.springframework.cloud.openfeign.FallbackFactory;
      	import org.springframework.stereotype.Component;
      	import com.xiaqiuchu.common.entity.Student;
      	import com.xiaqiuchu.consumer.service.StudentService;
      	import lombok.extern.slf4j.Slf4j;
      	// https://blog.csdn.net/weixin_42771651/article/details/121626431
      	// https://blog.csdn.net/qq_41125219/article/details/121346640
      	@Slf4j
      	@Component
      	public class StudentServiceFallBackFactory implements FallbackFactory<StudentService>{
      
      		@Override
      		public StudentService create(Throwable cause) {
      
      			log.error("远程调用出错,异常原因:{}", cause.getMessage(), cause);
      
      			return new StudentService(){
      
      				@Override
      				public Student findById(Long id) {
      					return new Student();
      				}
      
      				@Override
      				public String ping() {
      					return "err";
      				}
      
      			};
      		}
      
      	}
      
      
  3. fallback 模式(与 fallbackFactory 模式任选其一)。

    1. StudentService
      	package com.xiaqiuchu.consumer.service;
      
      	import org.springframework.cloud.openfeign.FeignClient;
      	import org.springframework.web.bind.annotation.RequestMapping;
      	import org.springframework.web.bind.annotation.RequestMethod;
      	import org.springframework.web.bind.annotation.RequestParam;
      
      	import com.xiaqiuchu.common.entity.Student;
      	import com.xiaqiuchu.consumer.component.StudentServiceFallBack;
      	import com.xiaqiuchu.consumer.component.StudentServiceFallBackFactory;
      
      	// 回退类正常模式(无法获取详细报错信息)
      	@FeignClient(value = "STUDENT-TEACHER-PROVIDER", fallback = StudentServiceFallBack.class)
      	// 工厂模式(获取详细报错信息)
      	// @FeignClient(value = "STUDENT-TEACHER-PROVIDER", fallbackFactory = StudentServiceFallBackFactory.class)
      	public interface StudentService {
      
      		@RequestMapping(method = RequestMethod.GET, value = "/student/findById")
      		public Student findById(@RequestParam(name = "id") Long id);
      
      		@RequestMapping(method = RequestMethod.GET, value = "/student/ping")
      		public String ping();
      	}
      
      
    2. StudentServiceFallBack
      	package com.xiaqiuchu.consumer.component;
      
      	import org.springframework.stereotype.Component;
      
      	import com.xiaqiuchu.common.entity.Student;
      	import com.xiaqiuchu.consumer.service.StudentService;
      
      	/**
      	 * 回退类实现
      	 */
      	@Component
      	public class StudentServiceFallBack implements StudentService {
      
      		// public StudentServiceFallBack(){
      
      		// }
      
      		@Override
      		public Student findById(Long id) {
      			return new Student();
      			// TODO Auto-generated method stub
      			// throw new UnsupportedOperationException("Unimplemented method 'findById'");
      		}
      
      		@Override
      		public String ping() {
      			// TODO Auto-generated method stub
      			// throw new UnsupportedOperationException("Unimplemented method 'ping'");
      			return "error";
      		}
      
      
      	}
      

Ribbon 负载均衡 (消费者(consumer)子模块)

负载均衡模式有很多种,轮询策略、随机策略、重试策略、最可用策略、可用过滤算法、自定义处理等。

  1. 新建 FeignConfiguration.java
    package com.xiaqiuchu.consumer.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    
    /**
     * https://www.cnblogs.com/liconglong/p/15408858.html
     */
    @Configuration
    public class FeignConfiguration {
    	 /**
    	 * 配置随机的负载均衡策略
    	 * 特点:对所有的服务都生效
    	 */
    	@Bean
    	public IRule loadBalancedRule() {
    		return new RandomRule();
    	}
    }
    

标签:OpenFeign,Hystrix,Spring,springframework,org,import,com,public,cloud
From: https://www.cnblogs.com/xiaqiuchu/p/17937320

相关文章

  • Spring AOP快速上手
    什么是AOPAOP全称是aspect-orientedprograming面向切面编程。用于解决横向关注点的问题,横向关注点是指多个模块或者模块中的多个功能需要共享的功能,如日志记录、事务管理、安全控制等等。即重复性的代码抽象出来,形成可复用的代码模块。AOP的核心术语Joinpoint(连接点):程序执......
  • SpringBoot原理学习
    一、IoC/DI相关1.如何进行依赖注入?①依赖注入的三种方式Ⅰ.属性注入/***Field注入/属性注入**///@Resource(name="mySQLDbServiceImpl")//@Autowired@Qualifier(value="mySQLDbServiceImpl")privateDbServicedbService;@Aut......
  • SpringMVC架构中Service层与Mapper层交互参数命名注意事项
    Service层代码begin、end、status为传入Mapper层getOrderSaleOp10方法的参数 GoodsSalesDTO中name、number是接收返回值的成员变量 Mapper层代码其中#{status}#{begin}#{end}与Service传入的map参数中元素名需要保持一致sql中查询的字段名需要与GoodsSalesDTO中成员变......
  • 部署springboot前后端分离框架
    springboot前后端分离的文件长这样 1.是后端代码2.是前端代码3.是数据库省去了语句参照了一下几个博主的文章部署成功:超详细部署后端:https://blog.csdn.net/weixin_45393094/article/details/123674367运行时遇到报错信息:https://blog.csdn.net/qq_44802992/article/detai......
  • 【电影推荐系统】Spring Boot + Vue3 前后端分离项目
    目录0前言1项目前端介绍1.1项目启动和编译1.1.1项目启动1.1.2项目编译1.2前端技术栈1.3功能模块前端界面展示1.3.1基础功能模块1.3.2用户模块1.3.3特色功能展示1.3.4界面自适应实现2项目后端介绍2.1项目打包部署2.1.1项目打包2.1.2项目部署2.2后端功能实现3数据......
  • SpringBoot 集成 Dubbo
    分布式、微服务与RPC什么是分布式?分布式就是将一个应用程序的功能拆分到多个独立的进程中,每个进程都运行在不同的机器上,通过网络连接起来,这样就形成了一个分布式的系统。什么是微服务架构?微服务架构将应用程序拆分成一组小的服务(微服务),每个服务运行在自己的进程中,服务之间通过......
  • Spring学习记录之命名空间注入
    Spring学习记录之命名空间注入前言这篇文章是我第二次学习b站老杜的spring相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使用,至于......
  • Spring 事务快速上手
    Spring事务与数据库事务关系spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁。spring事务是对数据库事务的封装,最后本质的实现还是在数据库,如果数据库不支持事务,spring的事务是不起作用的。数......
  • SpringBoot2 全局捕获异常实例
    1. SpringBoot全局捕获异常首先写一个会抛出异常的 Controller 类 如下所示,i=1/0,0不能作为除数,显然这个 Controller 类 ErrorController.java会抛出异常。@EnableAutoConfiguration@RestControllerpublicclassErrorController{@RequestMapping("/errorTest......
  • SpringBoot2 读取不同环境的配置文件实例
    SpringBoot 可以在application.properties 中配置信息spring.profiles.active来读取不同环境的配置文件。1.  SpringBoot2读取不同环境的配置文件工程运行环境可能有:开发环境、测试环境和生产环境,可以通过修改application.properties 来获取不同环境的的配置信息。首先我......