## 《分布式异常重试服务平台 X-RETRY》 # 简介 X-RETRY 基于服务治理的思想我们开发了重试治理的功能,支持动态配置,接入方式基本无需入侵业务代码,并使用多种策略结合的方式在链路层面控制重试放大效应,兼顾易用性、灵活性、安全性的分布式异常重试服务平台 # 社区 https://www.byteblogs.com/chat # 特性 1. 管控重试流量,预防重试风暴,及早发现和预警,并且提供流程管理手段 2. 保证易用性: 业务接入成本小。避免依赖研发人员的技术水平,保障重试的稳定性 3. 灵活性: 能够动态调整配置,启动/停止任务,以及终止运行中的重试数据 4. 操作简单:一分钟上手,支持WEB页面对重试数据CRUD操作。 5. 数据大盘: 实时管控系统重试数据。 6. 多样化退避策略: Cron、固定间隔、等级触发、随机时间触发 7. 容器化部署: 服务端支持docker容器部署 8. 高性能调度平台: 支持服务端节点动态扩容和缩容 9. 多样化重试类型: 支持ONLY_LOCAL、ONLY_REMOTE、LOCAL_REMOTE多种重试类型 10. 重试数据管理: 可以做到重试数据不丢失、重试数据一键回放 11. 支持多样化的告警方式: 邮箱、企业微信、钉钉 # 快速入门 ## 添加依赖 ```java com.x.retry x-retry-client-starter 0.0.0.1-SNAPSHOT ``` ## 配置 添加注解开启X-RETRY功能 ```java @SpringBootApplication @EnableXRetry(group = "example_group") public class ExampleApplication { public static void main(String[] args) { SpringApplication.run(ExampleApplication.class, args); } } ``` 为需要重试的方法添加重试注解 ```java @Retryable(scene = "errorMethodForLocalAndRemote", localTimes = 3, retryStrategy = RetryType.LOCAL_REMOTE) public String errorMethodForLocalAndRemote(String name) { double i = 1 / 0; return "这是一个简单的异常方法"; } ``` ## Retryable 详解 |属性|类型|必须指定|默认值|描述| |-|-|-|-|-| | scene |String|是|无|场景| | include | Throwable |否|无|包含的异常| | exclude |Throwable|否|无|排除的异常| | retryStrategy|RetryType|是|LOCAL_REMOTE|重试策略| | retryMethod|RetryMethod|是|RetryAnnotationMethod|重试处理入口| | bizId | BizIdGenerate |是| SimpleBizIdGenerate |自定义业务id,默认为hash(param),传入成员列表,全部拼接取hash| | bizNo |String|否|无| bizNo spel表达式| | localTimes |int|是|3| 本地重试次数 次数必须大于等于1| | localInterval |int|是|2| 本地重试间隔时间(s)| ## 配置部署服务端调度平台 ### 初始化数据库 数据库脚本位置 ``` doc/sql/x_retry.sql ``` ### 系统配置 ```yaml spring: datasource: name: x_retry url: jdbc:mysql://localhost:3306/x_retry?useSSL=false&characterEncoding=utf8&useUnicode=true username: root password: root type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver hikari: connection-timeout: 30000 minimum-idle: 5 maximum-pool-size: 20 auto-commit: true idle-timeout: 30000 pool-name: x_retry max-lifetime: 1800000 connection-test-query: SELECT 1 resources: static-locations: classpath:admin/ mybatis-plus: mapper-locations: classpath:/mapper/*.xml typeAliasesPackage: com.x.retry.server.persistence.mybatis.po global-config: db-config: field-strategy: NOT_EMPTY capital-mode: false logic-delete-value: 1 logic-not-delete-value: 0 configuration: map-underscore-to-camel-case: true cache-enabled: true x-retry: lastDays: 30 # 拉取重试数据的天数 retryPullPageSize: 100 # 拉取重试数据的每批次的大小 nettyPort: 1788 # 服务端netty端口 totalPartition: 32 # 重试和死信表的分区总数 ``` ##项目部署 如果你已经正确按照系统了,那么你可以输入 ``` http://localhost:8080 ``` 会出现登陆页面: ![img.png](images/login.png) 输入用户名: admin, 密码: 123456 ## 组配置 通过`新建`按钮配置点开配置组、场景、通知界面 ![group_list.png](./images/group_list.png) ### 组配置 组名称: 名称是数字、字母、下划线组合,最长64个字符长度 状态: 开启/关闭, 通过状态开启或关闭组状态 路由策略: 描述: 知道分区 : ![goup_config.png](./images/goup_config.png) ### 场景配置 ![goup_config.png](./images/goup_config.png) ### 通知配置 ![notify_config.png](images/notify_config.png) ### 重试列表 ![retry_task_list.png](./images/retry_task_list.png) ### 重试日志列表 ![retry_log_list.png](./images/retry_log_list.png) ### 死信队列列表 ![retry_dead_letter_list.png](./images/retry_dead_letter_list.png) ### 用户列表 ![user_list.png](./images/user_list.png) ### 新增用户 ![user_add.png](./images/user_add.png)