当前位置:   article > 正文

Spring Boot 中使用 Resilience4j 实现弹性微服务的简单了解

Spring Boot 中使用 Resilience4j 实现弹性微服务的简单了解

1. 引言

在微服务架构中,服务的弹性是非常重要的。Resilience4j 是一个轻量级的容错库,专为函数式编程设计,提供了断路器、重试、舱壁、限流器和限时器等功能。

这里不做过多演示,只是查看一下官方案例并换成maven构建相关展示;

2.配置

  1. spring:
  2. application.name: resilience4j-demo
  3. jackson.serialization.indent_output: true # 格式化输出json
  4. server:
  5. port: 9080
  6. management.endpoints.web.exposure.include: '*' # 暴露所有端点
  7. management.endpoint.health.show-details: always # 显示详细健康信息
  8. management.health.diskspace.enabled: false # 关闭磁盘空间健康检查
  9. management.health.db.enabled: false # 关闭数据库健康检查
  10. management.health.circuitbreakers.enabled: true # 开启断路器健康检查
  11. management.health.conditions.enabled: false # 关闭条件健康检查
  12. management.health.ratelimiters.enabled: false # 关闭限流器健康检查
  13. info:
  14. name: ${spring.application.name}
  15. description: resilience4j demo
  16. environment: ${spring.profiles.active}
  17. version: 0.0.1
  18. management.metrics.tags.application: ${spring.application.name} # 添加自定义标签
  19. management.metrics.distribution.percentiles-histogram.http.server.requests: true # 开启http请求统计
  20. management.metrics.distribution.percentiles-histogram.resilience4j.circuitbreaker.calls: true # 开启断路器统计
  21. #resilience4j.circuitbreaker.metrics.use_legacy_binder: true # 使用旧版绑定器
  22. resilience4j.circuitbreaker: # 断路器配置
  23. configs:
  24. default:
  25. registerHealthIndicator: true # 开启健康检查
  26. slidingWindowSize: 10 # 滑动窗口大小
  27. minimumNumberOfCalls: 5 # 最小调用次数
  28. permittedNumberOfCallsInHalfOpenState: 3 # 半开状态最大调用次数
  29. automaticTransitionFromOpenToHalfOpenEnabled: true # 自动切换到半开状态
  30. waitDurationInOpenState: 5s # 半开状态等待时间
  31. failureRateThreshold: 50 # 失败率阈值
  32. eventConsumerBufferSize: 10 # 事件消费者缓冲区大小
  33. recordExceptions: # 记录异常
  34. - org.springframework.web.client.HttpServerErrorException # http服务端错误
  35. - java.util.concurrent.TimeoutException # 超时异常
  36. - java.io.IOException # IO异常
  37. ignoreExceptions: # 忽略异常
  38. - io.github.robwin.exception.BusinessException # 业务异常
  39. shared: # 共享配置
  40. slidingWindowSize: 100 # 滑动窗口大小
  41. permittedNumberOfCallsInHalfOpenState: 30 # 半开状态最大调用次数
  42. waitDurationInOpenState: 1s # 半开状态等待时间
  43. failureRateThreshold: 50 # 失败率阈值
  44. eventConsumerBufferSize: 10 # 事件消费者缓冲区大小
  45. ignoreExceptions: # 忽略异常
  46. - io.github.robwin.exception.BusinessException # 业务异常
  47. instances: # 实例配置
  48. backendA: # 配置 backendA 实例
  49. baseConfig: default # 使用 default 配置
  50. backendB: # 配置 backendB 实例
  51. registerHealthIndicator: true # 开启健康检查
  52. slidingWindowSize: 10 # 滑动窗口大小
  53. minimumNumberOfCalls: 10 # 最小调用次数
  54. permittedNumberOfCallsInHalfOpenState: 3 # 半开状态最大调用次数
  55. waitDurationInOpenState: 5s # 半开状态等待时间
  56. failureRateThreshold: 50 # 失败率阈值
  57. eventConsumerBufferSize: 10 # 事件消费者缓冲区大小
  58. recordFailurePredicate: io.github.robwin.exception.RecordFailurePredicate # 记录异常
  59. resilience4j.retry: # 重试配置
  60. configs:
  61. default:
  62. maxAttempts: 3 # 最大重试次数
  63. waitDuration: 100 # 重试间隔时间 (ms)
  64. retryExceptions: # 记录异常
  65. - org.springframework.web.client.HttpServerErrorException # http服务端错误
  66. - java.util.concurrent.TimeoutException # 超时异常
  67. - java.io.IOException # IO异常
  68. ignoreExceptions: # 忽略异常
  69. - io.github.robwin.exception.BusinessException # 业务异常
  70. instances:
  71. backendA: # 配置 backendA 实例
  72. baseConfig: default # 使用 default 配置
  73. backendB: # 配置 backendB 实例
  74. baseConfig: default # 使用 default 配置
  75. resilience4j.bulkhead: # 舱壁 批量请求配置
  76. configs:
  77. default:
  78. maxConcurrentCalls: 100 # 最大并发调用数
  79. instances:
  80. backendA: # 配置 backendA 实例
  81. maxConcurrentCalls: 10 # 最大并发调用数
  82. backendB:
  83. maxWaitDuration: 10ms # 最大等待时间
  84. maxConcurrentCalls: 20 # 最大并发调用数
  85. resilience4j.thread-pool-bulkhead: # 线程池舱壁 批量请求配置
  86. configs:
  87. default:
  88. maxThreadPoolSize: 4 # 最大线程池大小
  89. coreThreadPoolSize: 2 # 核心线程池大小
  90. queueCapacity: 2 # 队列容量
  91. instances:
  92. backendA:
  93. baseConfig: default # 使用 default 配置
  94. backendB:
  95. maxThreadPoolSize: 1 # 覆盖默认配置,最大线程池大小
  96. coreThreadPoolSize: 1 # 覆盖默认配置,核心线程池大小
  97. queueCapacity: 1 # 覆盖默认配置,队列容量
  98. resilience4j.ratelimiter: # 限流器配置
  99. configs:
  100. default:
  101. registerHealthIndicator: false # 关闭健康检查
  102. limitForPeriod: 10 # 每个周期内的请求限制数
  103. limitRefreshPeriod: 1s # 周期刷新时间,即每秒刷新一次
  104. timeoutDuration: 0 # 请求超时时间,0表示不超时
  105. eventConsumerBufferSize: 100 # 事件消费者缓冲区大小
  106. instances:
  107. backendA:
  108. baseConfig: default # 使用默认配置
  109. backendB:
  110. limitForPeriod: 6 # 每个周期内的请求限制数
  111. limitRefreshPeriod: 500ms # 周期刷新时间,即每500毫秒刷新一次
  112. timeoutDuration: 3s # 请求超时时间,3
  113. resilience4j.timelimiter: # 限时器配置
  114. configs:
  115. default:
  116. cancelRunningFuture: false # 是否取消正在运行的Future
  117. timeoutDuration: 2s # 超时时间,2
  118. instances:
  119. backendA:
  120. baseConfig: default # 使用默认配置
  121. backendB:
  122. baseConfig: default # 使用默认配置

 3.依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.7.5</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  7. <properties>
  8. <maven.compiler.source>17</maven.compiler.source>
  9. <maven.compiler.target>17</maven.compiler.target>
  10. <resilience4j.version>2.0.2</resilience4j.version>
  11. </properties>
  12. <dependencies>
  13. <!-- Spring Boot Starters -->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-webflux</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-actuator</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-aop</artifactId>
  29. </dependency>
  30. <!-- Resilience4j -->
  31. <dependency>
  32. <groupId>io.github.resilience4j</groupId>
  33. <artifactId>resilience4j-spring-boot2</artifactId>
  34. <version>${resilience4j.version}</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>io.github.resilience4j</groupId>
  38. <artifactId>resilience4j-all</artifactId>
  39. <version>${resilience4j.version}</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>io.github.resilience4j</groupId>
  43. <artifactId>resilience4j-reactor</artifactId>
  44. <version>${resilience4j.version}</version>
  45. </dependency>
  46. <!-- Micrometer Prometheus -->
  47. <dependency>
  48. <groupId>io.micrometer</groupId>
  49. <artifactId>micrometer-registry-prometheus</artifactId>
  50. </dependency>
  51. <!-- Chaos Monkey for Spring Boot -->
  52. <dependency>
  53. <groupId>de.codecentric</groupId>
  54. <artifactId>chaos-monkey-spring-boot</artifactId>
  55. <version>2.7.0</version>
  56. </dependency>
  57. <!-- Vavr Jackson -->
  58. <dependency>
  59. <groupId>io.vavr</groupId>
  60. <artifactId>vavr-jackson</artifactId>
  61. <version>0.10.3</version>
  62. </dependency>
  63. <!-- Test Dependencies -->
  64. <dependency>
  65. <groupId>org.springframework.boot</groupId>
  66. <artifactId>spring-boot-starter-test</artifactId>
  67. <scope>test</scope>
  68. </dependency>
  69. <dependency>
  70. <groupId>io.projectreactor</groupId>
  71. <artifactId>reactor-test</artifactId>
  72. <version>3.4.22</version>
  73. <scope>test</scope>
  74. </dependency>
  75. </dependencies>

 这里正好用Prometheus和Grafana看看效果

4 总结

通过本文的介绍,你应该已经了解了如何在 Spring Boot 项目中配置和使用 Resilience4j 来实现断路器、重试、舱壁、限流器和限时器等功能,Resilience4j 提供了丰富的配置选项和灵活的使用方式,帮助你构建弹性的微服务。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/844394
推荐阅读
相关标签
  

闽ICP备14008679号