Java配置类代码
package com.springcloudalibaba.gateway.configurer;
import com.springcloudalibaba.bclass.base.BaseLoginUserInfo;
import com.springcloudalibaba.bclass.enums.SysKeyEnum;
import com.springcloudalibaba.bclass.util.JwtUtil;
import com.springcloudalibaba.bclass.util.StrUtil;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Objects;
/**
* @描述: 限流维度配置
* @作者: lixing
* @日期 2021/7/17 14:20
*/
@Component
@Configuration
public class RequestRateLimiterConfig {
/**
* @描述 获取请求用户ip作为限流key
* @作者 lixing
* @日期 2021/7/17 14:21
* @Param []
* @return org.springframework.cloud.gateway.filter.ratelimit.KeyResolver
*
* 配置方法:参考网关过滤器的 RequestRateLimiter 配置项
*/
@Bean
public HostAddressKeyResolver hostAddressKeyResolver() {
return new HostAddressKeyResolver();
}
/**
* @描述 获取请求用户id作为限流key
* @作者 lixing
* @日期 2021/7/17 14:22
* @Param []
* @return org.springframework.cloud.gateway.filter.ratelimit.KeyResolver
*
* 配置方法:参考网关过滤器的 RequestRateLimiter 配置项
*/
@Bean
public UserKeyResolver userKeyResolver() {
return new UserKeyResolver();
}
/**
* @描述 获取请求地址的URL地址作为限流key
* @作者 lixing
* @日期 2021/7/17 14:26
* @Param []
* @return org.springframework.cloud.gateway.filter.ratelimit.KeyResolver
*
* 配置方法:参考网关过滤器的 RequestRateLimiter 配置项
*/
@Bean
@Primary
public UrlKeyResolver urlKeyResolver() {
return new UrlKeyResolver();
}
}
/**
* @描述 基于ip进行限流
* @作者 lixing
* @日期 2021/7/18 14:26
*/
class HostAddressKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getHostName());
}
}
/**
* @描述 基于用户id进行限流
* @作者 lixing
* @日期 2021/7/18 14:26
*/
class UserKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
String token = exchange.getRequest().getHeaders().getFirst(SysKeyEnum.TOKEN.getKey());
if (!StrUtil.isEffective(token)) {
return Mono.just("default");
}
try {
BaseLoginUserInfo baseLoginUserInfo = JwtUtil.verifyJwtForHs256(token);
return Mono.just(baseLoginUserInfo.getAccount());
} catch (Exception e) {
return Mono.just("default");
}
}
}
/**
* @描述 基于请求URL地址进行限流
* @作者 lixing
* @日期 2021/7/18 14:26
*/
class UrlKeyResolver implements KeyResolver {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getPath().value());
}
}
网关配置
spring:
# TODO SpringCloud配置
cloud:
# TODO 网关配置
gateway:
# 路由机制
discovery:
locator:
# true 默认路由机制
# 开启服务注册和发现功能,服务网关自动根据服务发现为每一个服务创建一个路由,这个路由将以(大写服务名)开头的请求路径转发到对应的服务中
# 默认网关访问 127.0.0.1:8763/大写服务名/服务上下文/Controller/Method
# false 关闭默认路由机制,需要手动配置routes,默认通过路由名进行跳转的方式将失效
enabled: false
# 将请求路径上的服务名配置为小写
# 默认网关访问 127.0.0.1:8763/小写写服务名/服务上下文/Controller/Method
lower-case-service-id: true
# 路由地址
routes:
# TODO 基于 【API-AUTH】 服务的路由配置
# 直接访问 127.0.0.1:8768/apiAuth/auth/login
# 网关访问 127.0.0.1:8763/springCloudGateway/gatewayAuth/auth/login
- id: BFF-API-AUTH-ROUTE
uri: lb://apiAuth
predicates:
- Path=/springCloudGateway/gatewayAuth/**
filters:
# 过滤掉第一个路径的值
- StripPrefix=1
# 过滤器实现路径重写功能:将 /gatewayAuth/** 重写为 /apiAuth/**
- RewritePath=/gatewayAuth/(?<segment>.*),/apiAuth/$\{segment}
# 自定义 [请求ip] 过滤器。*表示允许所有ip请求,其它格式为:127.0.0.1,192.168.0.110
- MyIp=192.168.0.110,192.168.0.116
# 自定义 [请求参数] 过滤器。参数1:是否打印请求参数,参数2:是否解密请求参数
- MyRequestParams=Y,Y
# 请求限流
- name: RequestRateLimiter
args:
# 自定义限流key|字段解析器
key-resolver: '#{@urlKeyResolver}'
# 每秒向令牌桶添加1个令牌
redis-rate-limiter.replenishRate: 1
# 令牌桶最多存储10个令牌
redis-rate-limiter.burstCapacity: 10