# smart-middleware-tools **Repository Path**: zeaot/smart-middleware-tools ## Basic Information - **Project Name**: smart-middleware-tools - **Description**: 软件研发辅助工具,如限流与降级工具(单机版)等 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-08-14 - **Last Updated**: 2022-12-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: 限流工具, 降级工具 ## README ### 一.单机版中间件 #### 1.1 概述 > **组件定位** * 致力于业务业务接入,灵活使用; * 支持定制与扩展; > 组件功能 * 稳定性工具之单机版限流工具,支持方法维度与更系粒度参数的限流 * 稳定性工具之单机版降级工具,支持方法维度与更系粒度参数的降级 * 全局主键生成器工具 ### 二.组件介绍 #### 2.1 限流 > **限流** * 支持限流的快速接入,如方法接入、切面接入等; * 支持限流的扩展,如使用Guava的RateLimiter限流,也可以扩展使用其他的; * 支持方法参数细粒度使用自定义方法参数解析器,实现精准限流&降级; #### 2.2 降级 > **降级** * 支持降级的快速接入,如方法接入、切面接入等; * 支持降级的扩展,如抛出异常,定制处理器; ### 三.组件设计 #### 3.1 核心api > **核心api定义与默认实现** * 核心api包装 * 默认使用guava进行限流 * 默认qps设置为0时进行降级 ```xml com.wunong.smart smart-rate-limiter-core 1.0.0-SNAPSHOT ``` #### 3.2 与Spring集成starter > **核心api默认实现Spring实现** * 核心api默认实现Spring注册 * 支持自定义扩展,如自定义异常与信息 * 支持Aop切面注解快速接入 * 支持方法调用参数指定限流key解析器 ```xml com.wunong.smart smart-rate-limiter-starter 1.0.0-SNAPSHOT ``` #### 3.3 限流api > **限流器** * 限流器定义,参考guava的RateLimiter * 支持限流&降级 ```java public interface IRateLimiter { /** * 尝试获取指定数量的许可 * * @param permits * @return */ boolean tryAcquire(int permits); /** * 尝试获取许可 * * @return */ boolean tryAcquire(); /** * 获取配置的qps * * @return */ int getQps(); /** * 是否为降级 * 1. 即对应qps设置为0 * * @return */ default boolean isDegraded() { return getQps() <= 0; } } ``` > **Guava限流实现** * 基于guava实现限流器 * 若设置qps为0代表降级 ```java public class GuavaRateLimiter implements IRateLimiter { /** * 限流器 */ private final RateLimiter rateLimiter; /** * qps值 */ private final int qps; public GuavaRateLimiter(int qps) { if (qps < 0) { throw new IllegalArgumentException("非法的限流值:" + qps); } this.qps = qps; // 若设置的大于0,则创建限流器 if (qps > 0) { this.rateLimiter = RateLimiter.create(qps); } else { this.rateLimiter = null; } } public static GuavaRateLimiter create(int qps) { return new GuavaRateLimiter(qps); } /** * 尝试获取许可 * * @param permits * @return */ @Override public boolean tryAcquire(int permits) { if (isDegraded()) { return false; } // 没有限流器,代表需要进行限流 if (Objects.isNull(rateLimiter)) { return false; } return rateLimiter.tryAcquire(permits); } /** * 尝试获取许可 * * @return */ @Override public boolean tryAcquire() { return tryAcquire(1); } @Override public int getQps() { return qps; } } ``` > **方法key生成器** * 基于方法维度生成指定的限流标识 ```java public interface MethodKeyProvider { /** * 方法限流key生成器 */ MethodKeyProvider DEFAULT_PROVIDER = new DefaultMethodKeyProvider(); /** * 根据方法限流key标识 * * @param method * @return */ String getKey(Method method); } ```