gateway限流
实体与xml转换1:封装实体类2:实体转xml2:xml转实体数据1:封装实体类实体类使用xml标签来标识根节点和子节点名称@xmlAccesorType(XmlAccessType.NONE)//声明根节点名称@xmlRootElement(name = "queryResult")public class Abean implements Serializable{//节点名称...
·
Gateway说明:
Spring Cloud Gateway 作为新一代网关,性能上有很大提升,而且 加了许多实用的功能。今天说下 Gateway 在spring cloud中的限流配置。
限流的目的:
由于API 网关作为所有请求的入口,请求量大,所以可以对并发访问的请求进行限速来保护服务的可用性
目前限流提供了基于 Redis 的实现,我们需要增加pom文件以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
可以通过 KeyResolver 来指定限流的 Key,比如我们需要根据用户,IP ,接口等来做限流
IP 限流的 Key 指定具体代码如下
@Bean
public KeyResolver ipKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
public static String getIpAddr(ServerHttpRequest request) {
HttpHeaders headers = request.getHeaders();
List<String> ips = headers.get("X-Forwarded-For");
String ip = "127.0.0.1";
if (ips != null && ips.size() > 0) {
ip = ips.get(0);
}
return ip;
}
用户限流:
@Bean
KeyResolver userKeyResolver() {
return exchange ->
Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}
接口限流:
@Bean
KeyResolver apiKeyResolver() {
return exchange ->
Mono.just(exchange.getRequest().getPath().value());
}
然后配置限流的过滤器
server:
port: 8080
spring:
redis:
host: 127.0.0.1
port: 6379
cloud:
gateway:
routes:
- id: test
uri: lb://test
predicates:
- Path=/test/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@ipKeyResolver}"
以下需注意几点:
filter 名称必须是 RequestRateLimiter。
redis-rate-limiter.replenishRate:允许用户每秒处理多少个请求。
redis-rate-limiter.burstCapacity:令牌桶的容量,允许在 1s 内完成的最大请求数。
key-resolver:使用 SpEL 按名称引用 bean。
更多推荐
已为社区贡献1条内容
所有评论(0)