[feat]:使用 resilience4j代码实例
Showing
11 changed files
with
582 additions
and
0 deletions
pom.xml
0 → 100644
| 1 | <?xml version="1.0"?> | ||
| 2 | <project | ||
| 3 | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" | ||
| 4 | xmlns="http://maven.apache.org/POM/4.0.0" | ||
| 5 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | ||
| 6 | <modelVersion>4.0.0</modelVersion> | ||
| 7 | <groupId>hcom.seektrut</groupId> | ||
| 8 | <artifactId>spring-boot-resilience4j</artifactId> | ||
| 9 | <version>0.0.1-SNAPSHOT</version> | ||
| 10 | <name>spring-boot-resilience4j</name> | ||
| 11 | <url>http://maven.apache.org</url> | ||
| 12 | <properties> | ||
| 13 | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||
| 14 | </properties> | ||
| 15 | |||
| 16 | <dependencyManagement> | ||
| 17 | <dependencies> | ||
| 18 | <dependency> | ||
| 19 | <groupId>org.springframework.boot</groupId> | ||
| 20 | <artifactId>spring-boot-dependencies</artifactId> | ||
| 21 | <!-- 2.4.12 --> | ||
| 22 | <!-- <version>2.3.12.RELEASE</version>--> | ||
| 23 | <version>2.4.12</version> | ||
| 24 | <type>pom</type> | ||
| 25 | <scope>import</scope> | ||
| 26 | </dependency> | ||
| 27 | </dependencies> | ||
| 28 | </dependencyManagement> | ||
| 29 | |||
| 30 | <dependencies> | ||
| 31 | <!-- 1.引入 resilience4j-spring-boot2 和 spring-boot-starter-aop --> | ||
| 32 | <dependency> | ||
| 33 | <groupId>io.github.resilience4j</groupId> | ||
| 34 | <artifactId>resilience4j-spring-boot2</artifactId> | ||
| 35 | <version>1.7.0</version> | ||
| 36 | </dependency> | ||
| 37 | <dependency> | ||
| 38 | <groupId>org.springframework.boot</groupId> | ||
| 39 | <artifactId>spring-boot-starter-web</artifactId> | ||
| 40 | </dependency> | ||
| 41 | <dependency> | ||
| 42 | <groupId>org.springframework.boot</groupId> | ||
| 43 | <artifactId>spring-boot-starter-aop</artifactId> | ||
| 44 | </dependency> | ||
| 45 | |||
| 46 | <!-- 引入监控 --> | ||
| 47 | <dependency> | ||
| 48 | <groupId>org.springframework.boot</groupId> | ||
| 49 | <artifactId>spring-boot-starter-actuator</artifactId> | ||
| 50 | </dependency> | ||
| 51 | <dependency> | ||
| 52 | <groupId>org.springframework.boot</groupId> | ||
| 53 | <artifactId>spring-boot-configuration-processor</artifactId> | ||
| 54 | </dependency> | ||
| 55 | </dependencies> | ||
| 56 | |||
| 57 | <build> | ||
| 58 | <finalName>spring-boot-resilience4j</finalName> | ||
| 59 | <plugins> | ||
| 60 | <plugin> | ||
| 61 | <groupId>org.springframework.boot</groupId> | ||
| 62 | <artifactId>spring-boot-maven-plugin</artifactId> | ||
| 63 | <configuration> | ||
| 64 | <mainClass>com.seektruth.demo.spring.boot.resilience4j.BootStrap</mainClass> | ||
| 65 | </configuration> | ||
| 66 | <executions> | ||
| 67 | <execution> | ||
| 68 | <goals> | ||
| 69 | <goal>repackage</goal> | ||
| 70 | </goals> | ||
| 71 | </execution> | ||
| 72 | </executions> | ||
| 73 | </plugin> | ||
| 74 | <plugin> <!-- 打jar包 --> | ||
| 75 | <groupId>org.apache.maven.plugins</groupId> | ||
| 76 | <artifactId>maven-jar-plugin</artifactId> | ||
| 77 | <version>2.4</version> | ||
| 78 | <configuration> | ||
| 79 | <excludes> | ||
| 80 | <exclude>**/*.properties</exclude> | ||
| 81 | </excludes> | ||
| 82 | </configuration> | ||
| 83 | </plugin> | ||
| 84 | <plugin> <!-- 打源码 --> | ||
| 85 | <groupId>org.apache.maven.plugins</groupId> | ||
| 86 | <artifactId>maven-source-plugin</artifactId> | ||
| 87 | <version>2.4</version> | ||
| 88 | <configuration> | ||
| 89 | <attach>true</attach> | ||
| 90 | </configuration> | ||
| 91 | <executions> | ||
| 92 | <execution> | ||
| 93 | <phase>compile</phase> | ||
| 94 | <goals> | ||
| 95 | <goal>jar</goal> | ||
| 96 | </goals> | ||
| 97 | </execution> | ||
| 98 | </executions> | ||
| 99 | </plugin> | ||
| 100 | <plugin> | ||
| 101 | <groupId>org.apache.maven.plugins</groupId> | ||
| 102 | <artifactId>maven-surefire-plugin</artifactId> | ||
| 103 | <configuration> | ||
| 104 | <skip>true</skip> | ||
| 105 | </configuration> | ||
| 106 | </plugin> | ||
| 107 | <plugin> | ||
| 108 | <groupId>org.apache.maven.plugins</groupId> | ||
| 109 | <artifactId>maven-compiler-plugin</artifactId> | ||
| 110 | <configuration> | ||
| 111 | <source>8</source> | ||
| 112 | <target>8</target> | ||
| 113 | </configuration> | ||
| 114 | </plugin> | ||
| 115 | </plugins> | ||
| 116 | </build> | ||
| 117 | </project> |
| 1 | package com.seektruth.demo.spring.boot.resilience4j; | ||
| 2 | |||
| 3 | |||
| 4 | import org.springframework.boot.SpringApplication; | ||
| 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
| 6 | import org.springframework.context.ApplicationEvent; | ||
| 7 | import org.springframework.context.ApplicationListener; | ||
| 8 | import org.springframework.context.ConfigurableApplicationContext; | ||
| 9 | import org.springframework.context.event.ContextClosedEvent; | ||
| 10 | |||
| 11 | /** | ||
| 12 | * spring boot resilience4j demo 启动类 | ||
| 13 | */ | ||
| 14 | @SpringBootApplication | ||
| 15 | public class BootStrap { | ||
| 16 | |||
| 17 | public static void main(String[] args) { | ||
| 18 | ConfigurableApplicationContext ctx = SpringApplication.run(BootStrap.class,args); | ||
| 19 | boolean running = ctx.isRunning(); | ||
| 20 | if(running){ | ||
| 21 | System.out.println("启动已启动"); | ||
| 22 | } | ||
| 23 | } | ||
| 24 | } |
| 1 | package com.seektruth.demo.spring.boot.resilience4j.aspect; | ||
| 2 | |||
| 3 | import org.aspectj.lang.ProceedingJoinPoint; | ||
| 4 | import org.aspectj.lang.annotation.Around; | ||
| 5 | import org.aspectj.lang.annotation.Aspect; | ||
| 6 | import org.aspectj.lang.annotation.Pointcut; | ||
| 7 | import org.slf4j.Logger; | ||
| 8 | import org.slf4j.LoggerFactory; | ||
| 9 | import org.springframework.core.Ordered; | ||
| 10 | |||
| 11 | /** | ||
| 12 | * 操作日志切面 | ||
| 13 | */ | ||
| 14 | @Aspect | ||
| 15 | public class OperateLogAspect implements Ordered { | ||
| 16 | private static final Logger LOG = LoggerFactory.getLogger(OperateLogAspect.class); | ||
| 17 | |||
| 18 | /** | ||
| 19 | * 设置切入点:横切所有 controller 类的所有方法 | ||
| 20 | */ | ||
| 21 | @Pointcut("execution(* com.seektruth.demo.spring.boot.resillience4j.controller.*.*(..))") | ||
| 22 | public void operateLogPointcut() { | ||
| 23 | // 该方法无方法体,主要为了让同类中其他方法使用此切入点 | ||
| 24 | } | ||
| 25 | |||
| 26 | /** | ||
| 27 | * 配置环绕通知,打印入参日志 | ||
| 28 | * | ||
| 29 | * @param joinPoint 连接点 | ||
| 30 | */ | ||
| 31 | @Around("operateLogPointcut()") | ||
| 32 | public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { | ||
| 33 | String className = joinPoint.getTarget().getClass().getName(); | ||
| 34 | String methodName = joinPoint.getSignature().getName(); | ||
| 35 | Object[] args = joinPoint.getArgs(); | ||
| 36 | LOG.info("========================================"); | ||
| 37 | LOG.info(" 操作日志打印:调用 {} {} 方法,请求参数:{}",className,methodName,args); | ||
| 38 | LOG.info("========================================"); | ||
| 39 | return joinPoint.proceed(args); | ||
| 40 | } | ||
| 41 | |||
| 42 | @Override | ||
| 43 | public int getOrder() { | ||
| 44 | // 设置切面先后顺序 | ||
| 45 | return Ordered.HIGHEST_PRECEDENCE; | ||
| 46 | } | ||
| 47 | } |
src/main/java/com/seektruth/demo/spring/boot/resilience4j/config/GlobalExceptionHandler.java
0 → 100644
| 1 | package com.seektruth.demo.spring.boot.resilience4j.config; | ||
| 2 | |||
| 3 | import io.github.resilience4j.circuitbreaker.CallNotPermittedException; | ||
| 4 | import org.springframework.web.bind.annotation.RestControllerAdvice; | ||
| 5 | |||
| 6 | /** | ||
| 7 | * 全局异常处理类 | ||
| 8 | */ | ||
| 9 | @RestControllerAdvice | ||
| 10 | public class GlobalExceptionHandler { | ||
| 11 | |||
| 12 | @org.springframework.web.bind.annotation.ExceptionHandler(CallNotPermittedException.class) | ||
| 13 | public CallNotPermittedException callNotPermittedException(CallNotPermittedException ex) { | ||
| 14 | System.out.println("全局处理异常"); | ||
| 15 | return ex; | ||
| 16 | } | ||
| 17 | } |
src/main/java/com/seektruth/demo/spring/boot/resilience4j/config/RegistryEventBeanConfig.java
0 → 100644
| 1 | package com.seektruth.demo.spring.boot.resilience4j.config; | ||
| 2 | |||
| 3 | import io.github.resilience4j.circuitbreaker.CircuitBreaker; | ||
| 4 | import io.github.resilience4j.core.registry.EntryAddedEvent; | ||
| 5 | import io.github.resilience4j.core.registry.EntryRemovedEvent; | ||
| 6 | import io.github.resilience4j.core.registry.EntryReplacedEvent; | ||
| 7 | import io.github.resilience4j.core.registry.RegistryEventConsumer; | ||
| 8 | import org.slf4j.Logger; | ||
| 9 | import org.slf4j.LoggerFactory; | ||
| 10 | import org.springframework.context.annotation.Bean; | ||
| 11 | import org.springframework.context.annotation.Configuration; | ||
| 12 | |||
| 13 | /** | ||
| 14 | * RegistryEvent 配置类 | ||
| 15 | */ | ||
| 16 | @Configuration | ||
| 17 | public class RegistryEventBeanConfig { | ||
| 18 | |||
| 19 | private static final Logger LOG = LoggerFactory.getLogger(RegistryEventBeanConfig.class); | ||
| 20 | |||
| 21 | // 熔断器注册时间消费者 | ||
| 22 | @Bean | ||
| 23 | public RegistryEventConsumer<CircuitBreaker> myRegistryEventConsumer() { | ||
| 24 | |||
| 25 | return new RegistryEventConsumer<CircuitBreaker>() { | ||
| 26 | @Override | ||
| 27 | public void onEntryAddedEvent(EntryAddedEvent<CircuitBreaker> entryAddedEvent) { | ||
| 28 | // 打印熔断器事件 | ||
| 29 | entryAddedEvent.getAddedEntry().getEventPublisher().onEvent( | ||
| 30 | event -> LOG.info("触发 CircuitBreaker onEntryAddedEvent事件:{}", event.toString()) | ||
| 31 | ); | ||
| 32 | } | ||
| 33 | |||
| 34 | @Override | ||
| 35 | public void onEntryRemovedEvent(EntryRemovedEvent<CircuitBreaker> entryRemoveEvent) { | ||
| 36 | |||
| 37 | } | ||
| 38 | |||
| 39 | @Override | ||
| 40 | public void onEntryReplacedEvent(EntryReplacedEvent<CircuitBreaker> entryReplacedEvent) { | ||
| 41 | |||
| 42 | } | ||
| 43 | }; | ||
| 44 | } | ||
| 45 | |||
| 46 | } |
| 1 | package com.seektruth.demo.spring.boot.resilience4j.controller; | ||
| 2 | |||
| 3 | import io.github.resilience4j.bulkhead.BulkheadFullException; | ||
| 4 | import io.github.resilience4j.circuitbreaker.CallNotPermittedException; | ||
| 5 | import io.github.resilience4j.ratelimiter.RequestNotPermitted; | ||
| 6 | import io.github.resilience4j.retry.MaxRetriesExceededException; | ||
| 7 | |||
| 8 | /** | ||
| 9 | * 降级方法 | ||
| 10 | */ | ||
| 11 | public class BaseController { | ||
| 12 | |||
| 13 | public String fallback(CallNotPermittedException ex){ | ||
| 14 | return "服务已熔断。"; | ||
| 15 | } | ||
| 16 | |||
| 17 | public String fallback(BulkheadFullException ex){ | ||
| 18 | return "服务并发限制,不允许访问。"; | ||
| 19 | } | ||
| 20 | |||
| 21 | public String fallback(RequestNotPermitted ex){ | ||
| 22 | return "限速了不允许访问了。"; | ||
| 23 | } | ||
| 24 | |||
| 25 | public String fallback(MaxRetriesExceededException ex){ | ||
| 26 | return "重试过多,不允许访问。"; | ||
| 27 | } | ||
| 28 | |||
| 29 | public String fallback(Throwable ex){ | ||
| 30 | return "服务降级了。"; | ||
| 31 | } | ||
| 32 | } |
src/main/java/com/seektruth/demo/spring/boot/resilience4j/controller/BusinessController.java
0 → 100644
| 1 | package com.seektruth.demo.spring.boot.resilience4j.controller; | ||
| 2 | |||
| 3 | import com.seektruth.demo.spring.boot.resilience4j.service.BusinessService; | ||
| 4 | import io.github.resilience4j.bulkhead.annotation.Bulkhead; | ||
| 5 | import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; | ||
| 6 | import io.github.resilience4j.ratelimiter.annotation.RateLimiter; | ||
| 7 | import io.github.resilience4j.retry.annotation.Retry; | ||
| 8 | import io.github.resilience4j.timelimiter.annotation.TimeLimiter; | ||
| 9 | import org.springframework.beans.factory.annotation.Autowired; | ||
| 10 | import org.springframework.web.bind.annotation.RequestMapping; | ||
| 11 | import org.springframework.web.bind.annotation.RestController; | ||
| 12 | |||
| 13 | /** | ||
| 14 | * 业务控制器 | ||
| 15 | */ | ||
| 16 | @RestController | ||
| 17 | @RequestMapping("/business") | ||
| 18 | public class BusinessController extends BaseController { | ||
| 19 | |||
| 20 | @Autowired | ||
| 21 | private BusinessService service; | ||
| 22 | |||
| 23 | @Bulkhead(name="bulkheadInstance",type = Bulkhead.Type.SEMAPHORE,fallbackMethod = "fallback") | ||
| 24 | @RequestMapping("/bulkhead/semaphore") | ||
| 25 | public String bulkheadSemaphore(){ | ||
| 26 | return service.query(); | ||
| 27 | } | ||
| 28 | |||
| 29 | @Bulkhead(name="bulkheadInstance",type = Bulkhead.Type.THREADPOOL,fallbackMethod = "fallback") | ||
| 30 | @RequestMapping("/bulkhead/thread") | ||
| 31 | public String bulkheadThread(){ | ||
| 32 | return service.query(); | ||
| 33 | } | ||
| 34 | |||
| 35 | @CircuitBreaker(name="circuitbreakerCountBased",fallbackMethod = "fallback") | ||
| 36 | @RequestMapping("/circuitBreaker/exception") | ||
| 37 | public String circuitBreakerException(){ | ||
| 38 | return service.query(); | ||
| 39 | } | ||
| 40 | |||
| 41 | @CircuitBreaker(name="circuitbreakerTimeBased",fallbackMethod = "fallback") | ||
| 42 | @RequestMapping("/circuitBreaker/slowcall") | ||
| 43 | public String circuitBreakerSlowCall(){ | ||
| 44 | return service.query(); | ||
| 45 | } | ||
| 46 | |||
| 47 | @RateLimiter(name="ratelimiterInstance", fallbackMethod = "fallback") | ||
| 48 | @RequestMapping("/ratelimiter") | ||
| 49 | public String rateLimiter(){ | ||
| 50 | return service.query(); | ||
| 51 | } | ||
| 52 | |||
| 53 | @Retry(name="retryinInstance", fallbackMethod = "fallback") | ||
| 54 | @RequestMapping("/retry") | ||
| 55 | public String retry(){ | ||
| 56 | return service.query(); | ||
| 57 | } | ||
| 58 | |||
| 59 | @TimeLimiter(name="timelimiterInstance", fallbackMethod = "fallback") | ||
| 60 | @RequestMapping("/timelimit") | ||
| 61 | public String timelimit(){ | ||
| 62 | return service.query(); | ||
| 63 | } | ||
| 64 | |||
| 65 | } |
src/main/java/com/seektruth/demo/spring/boot/resilience4j/service/impl/BusinessServiceImpl.java
0 → 100644
| 1 | package com.seektruth.demo.spring.boot.resilience4j.service.impl; | ||
| 2 | |||
| 3 | import com.seektruth.demo.spring.boot.resilience4j.service.BusinessService; | ||
| 4 | import org.springframework.stereotype.Service; | ||
| 5 | |||
| 6 | import java.util.concurrent.ThreadLocalRandom; | ||
| 7 | import java.util.concurrent.TimeUnit; | ||
| 8 | |||
| 9 | /** | ||
| 10 | * 业务处理实现类 | ||
| 11 | */ | ||
| 12 | @Service | ||
| 13 | public class BusinessServiceImpl implements BusinessService { | ||
| 14 | |||
| 15 | @Override | ||
| 16 | public String query() { | ||
| 17 | randomSleep(); | ||
| 18 | return "当前业务正常。"; | ||
| 19 | } | ||
| 20 | |||
| 21 | public void randomSleep(){ | ||
| 22 | Integer time = ThreadLocalRandom.current().nextInt(10); | ||
| 23 | try { | ||
| 24 | TimeUnit.SECONDS.sleep(time); | ||
| 25 | } catch (InterruptedException e) { | ||
| 26 | e.printStackTrace(); | ||
| 27 | } | ||
| 28 | System.out.println("当前业务处理时长:"+time+"秒"); | ||
| 29 | } | ||
| 30 | } |
src/main/resources/application.yml
0 → 100644
| 1 | |||
| 2 | # 端口 | ||
| 3 | server: | ||
| 4 | port: 9080 | ||
| 5 | # 应用名 | ||
| 6 | spring: | ||
| 7 | application: | ||
| 8 | name: spring-boot-resilience4j-demo | ||
| 9 | |||
| 10 | # 监控信息配置 | ||
| 11 | management: | ||
| 12 | endpoints: | ||
| 13 | web: | ||
| 14 | exposure: | ||
| 15 | include: '*' | ||
| 16 | health: | ||
| 17 | show-details: always | ||
| 18 | diskspace: | ||
| 19 | enabled: false | ||
| 20 | circuitbreakers: | ||
| 21 | enabled: true | ||
| 22 | ratelimiters: | ||
| 23 | enabled: false | ||
| 24 | metrics: | ||
| 25 | tags: | ||
| 26 | application: ${spring.application.name} | ||
| 27 | distribution: | ||
| 28 | percentiles-histogram: | ||
| 29 | http: | ||
| 30 | server: | ||
| 31 | requests: true | ||
| 32 | resilience4j: | ||
| 33 | circuitbreaker: | ||
| 34 | calls: true | ||
| 35 | |||
| 36 | # resillience4j 舱壁配置 | ||
| 37 | resilience4j.bulkhead: | ||
| 38 | configs: | ||
| 39 | base: | ||
| 40 | # 最大并发调用数量 | ||
| 41 | maxConcurrentCalls: 2 | ||
| 42 | # 线程尝试进入舱壁的最大等待时间(单位:毫秒) | ||
| 43 | maxWaitDuration: 10000 | ||
| 44 | # | ||
| 45 | writableStackTraceEnabled: true | ||
| 46 | # 时间消费者缓冲区 | ||
| 47 | eventConsumerBufferSize: 10 | ||
| 48 | instances: | ||
| 49 | bulkheadInstance: | ||
| 50 | # 指定使用 base 配置 | ||
| 51 | baseConfig: base | ||
| 52 | |||
| 53 | # resillience4j 熔断器配置 | ||
| 54 | resilience4j.circuitbreaker: | ||
| 55 | configs: | ||
| 56 | basecount: | ||
| 57 | # 滑动窗口类型:COUNT_BASED(基于计数),TIME_BASED(基于时间) | ||
| 58 | slidingWindowType: COUNT_BASED | ||
| 59 | # 窗口大小(滑动窗口类型是COUNT_BASED,单位为个;滑动窗口类型是TIME_BASED,单位为秒) | ||
| 60 | slidingWindowSize: 10 | ||
| 61 | # 失败率百分比权重(50%),大于等于此值则熔断器打开 | ||
| 62 | failureRateThreshold: 50 | ||
| 63 | # 慢调用百分比(认为所有调用时间超过 slowCallDurationThreshold的都是慢调用),大于等于此值则熔断器打开 | ||
| 64 | slowCallRateThreshold: 50 | ||
| 65 | # 调用持续多长时间被认定为慢调用,并增加慢调用比例 | ||
| 66 | slowCallDurationThreshold: 1100 | ||
| 67 | # 熔断器状态为半打开时,允许的调用数量 | ||
| 68 | permittedNumberOfCallsInHalfOpenState: 2 | ||
| 69 | # 半打开状态等待的最大持续时间(0代表无限等待直到允许的调用都完成) | ||
| 70 | #maxWaitDurationInHalfOpenState: 0 | ||
| 71 | # 计算失败率或慢调用前,要求的最小调用数量 | ||
| 72 | minimumNumberOfCalls: 2 | ||
| 73 | # 熔断器状态由 OPEN 到 HALF_OPEN 等待的时间 | ||
| 74 | waitDurationInOpenState: 60000 | ||
| 75 | # 熔断器状态是否自动从 OPEN 转到 HALF_OPEN。true:自动(会使用1个线程去自动切换状态);false:当有新的调用进来时再进行转换 | ||
| 76 | automaticTransitionFromOpenToHalfOpenEnabled: false | ||
| 77 | recordExceptions: | ||
| 78 | - java.lang.Exception | ||
| 79 | ignoreExceptions: | ||
| 80 | - com.seektruth.demo.spring.boot.resilience4j.exception.ResultException | ||
| 81 | |||
| 82 | # 定制化 Predicate 用于判断此异常是否为失败调用。 | ||
| 83 | #recordFailurePredicate: org.spring.boot.resilience4j.exception.RecordFailurePredicate | ||
| 84 | # 定制化 Predicate 用于判断此异常是否被忽略。 | ||
| 85 | #ignoreExceptionPredicate: | ||
| 86 | basetime: | ||
| 87 | # 滑动窗口类型:COUNT_BASED(基于计数),TIME_BASED(基于时间) | ||
| 88 | slidingWindowType: TIME_BASED | ||
| 89 | # 窗口大小(滑动窗口类型是COUNT_BASED,单位为个;滑动窗口类型是TIME_BASED,单位为秒) | ||
| 90 | slidingWindowSize: 10 | ||
| 91 | # 失败率百分比权重(50%),大于等于此值则熔断器打开 | ||
| 92 | failureRateThreshold: 50 | ||
| 93 | # 慢调用百分比(认为所有调用时间超过 slowCallDurationThreshold的都是慢调用),大于等于此值则熔断器打开 | ||
| 94 | slowCallRateThreshold: 50 | ||
| 95 | # 调用持续多长时间被认定为慢调用,并增加慢调用比例 | ||
| 96 | slowCallDurationThreshold: 1100 | ||
| 97 | # 熔断器状态为半打开时,允许的调用数量 | ||
| 98 | permittedNumberOfCallsInHalfOpenState: 2 | ||
| 99 | # 半打开状态等待的最大持续时间(0代表无限等待直到允许的调用都完成) | ||
| 100 | #maxWaitDurationInHalfOpenState: 0 | ||
| 101 | # 计算失败率或慢调用前,要求的最小调用数量 | ||
| 102 | minimumNumberOfCalls: 2 | ||
| 103 | # 熔断器状态由 OPEN 到 HALF_OPEN 等待的时间 | ||
| 104 | waitDurationInOpenState: 60000 | ||
| 105 | # 熔断器状态是否自动从 OPEN 转到 HALF_OPEN。true:自动(会使用1个线程去自动切换状态);false:当有新的调用进来时再进行转换 | ||
| 106 | automaticTransitionFromOpenToHalfOpenEnabled: false | ||
| 107 | recordExceptions: | ||
| 108 | - java.lang.Exception | ||
| 109 | ignoreExceptions: | ||
| 110 | - com.seektruth.demo.spring.boot.resilience4j.exception.ResultException | ||
| 111 | # 定制化 Predicate 用于判断此异常是否为失败调用。 | ||
| 112 | #recordFailurePredicate: org.spring.boot.resilience4j.exception.RecordFailurePredicate | ||
| 113 | # 定制化 Predicate 用于判断此异常是否被忽略。 | ||
| 114 | #ignoreExceptionPredicate: | ||
| 115 | instances: | ||
| 116 | circuitbreakerCountBased: | ||
| 117 | baseConfig: basecount | ||
| 118 | circuitbreakerTimeBased: | ||
| 119 | baseConfig: basetime | ||
| 120 | |||
| 121 | # resilience4j RateLimiter | ||
| 122 | resilience4j.ratelimiter: | ||
| 123 | configs: | ||
| 124 | base: | ||
| 125 | # 在一个limit刷新周期内,可用的许可数量 | ||
| 126 | limitForPeriod: 50 | ||
| 127 | # limit 刷新的周期(单位:纳秒) | ||
| 128 | limitRefreshPeriod: 500 | ||
| 129 | # 线程等待许可的等待时间(单位:秒) | ||
| 130 | timeoutDuration: 2 | ||
| 131 | # subscribeForEvents: | ||
| 132 | # allowHealthIndicatorToFail: | ||
| 133 | # registerHealthIndicator: | ||
| 134 | # eventConsumerBufferSize: | ||
| 135 | # writableStackTraceEnabled: | ||
| 136 | instances: | ||
| 137 | ratelimiterInstance: | ||
| 138 | baseConfig: base | ||
| 139 | |||
| 140 | # resilience4j Retry | ||
| 141 | resilience4j.retry: | ||
| 142 | configs: | ||
| 143 | base: | ||
| 144 | # 等待下次重试时间 | ||
| 145 | waitDuration: | ||
| 146 | # 根据尝试次数和结果或异常修改失败后的等待间隔的函数。 | ||
| 147 | # intervalBiFunction: | ||
| 148 | # 最大重试次数 | ||
| 149 | maxAttempts: 2 | ||
| 150 | # 断言异常是否需要重试 | ||
| 151 | # retryExceptionPredicate: | ||
| 152 | # 断言返回的结果是否需要重试 | ||
| 153 | # resultPredicate: | ||
| 154 | # 需要重试的 异常列表 | ||
| 155 | retryExceptions: | ||
| 156 | - java.lang.Exception | ||
| 157 | # 忽略重试的 异常列表 | ||
| 158 | ignoreExceptions: | ||
| 159 | - java.lang.Exception | ||
| 160 | # 重试事件缓冲区大小 | ||
| 161 | eventConsumerBufferSize: 10 | ||
| 162 | # 开启指数回退策略 | ||
| 163 | enableExponentialBackoff: false | ||
| 164 | # 指数回退的乘数 | ||
| 165 | # exponentialBackoffMultiplier: | ||
| 166 | # 指数回退最大间隔 | ||
| 167 | # exponentialMaxWaitDuration: | ||
| 168 | # 开启或关闭随机延迟策略 | ||
| 169 | enableRandomizedWait: false | ||
| 170 | # 随机延迟因子 | ||
| 171 | # randomizedWaitFactor: | ||
| 172 | instances: | ||
| 173 | retryinInstance: | ||
| 174 | baseConfig: base | ||
| 175 | |||
| 176 | # resilience4j TimeLimiter | ||
| 177 | resilience4j.TimeLimiter: | ||
| 178 | configs: | ||
| 179 | base: | ||
| 180 | # 超时时间(单位:秒) | ||
| 181 | timeoutDuration: 2 | ||
| 182 | # 取消正在执行的 Future | ||
| 183 | cancelRunningFuture: true | ||
| 184 | # 超时事件缓冲区大小 | ||
| 185 | eventConsumerBufferSize: 10 | ||
| 186 | instances: | ||
| 187 | timelimiterInstance: | ||
| 188 | baseConfig: base | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or sign in to post a comment