# 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);
}
```