在API网关spring cloud gateway和负载均衡框架ribbon实战文章中,主要实现网关与负载均衡等基本功能,详见代码。本节内容将继续围绕此代码展开,主要讲解spring cloud gateway自定义过滤器的功能。本节内容的代码也会提交到GitHub上,注意提交的内容。
本节主要讲解全局过滤器和局部过滤器。注意下面的示例不能作为生产环境的代码,只是简单的演示自定义过滤器的使用方式,无需纠结实现的功能是否完善。下面主要针对不同的过滤器选择几种场景进行代码演示,不代表某个场景就必须使用全局或者局部的过滤器。 全局过滤器: 1、限流:每分钟只能访问5次服务
2、接口用时统计 局部过滤器: 1、简单的权限检查
2、指定IP访问
1、全局过滤器-限流
本节主要演示全局过滤器的用法:实现 GlobalFilter 和 Ordered,重写相关方法,加入到spring容器管理即可,无需配置,全局过滤器对所有的路由都有效。
packagecom.yefengyu.gateway.globalFilter;importio.github.bucket4j.Bandwidth;importio.github.bucket4j.Bucket;importio.github.bucket4j.Bucket4j;importio.github.bucket4j.Refill;importorg.springframework.cloud.gateway.filter.GatewayFilterChain;importorg.springframework.cloud.gateway.filter.GlobalFilter;importorg.springframework.core.Ordered;importorg.springframework.http.HttpStatus;importorg.springframework.stereotype.Component;importorg.springframework.web.server.ServerWebExchange;importreactor.core.publisher.Mono;importjava.time.Duration;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;//全局过滤器,实现GlobalFilter接口,和Ordered接口即可。
@Componentpublic class FluidControlGlobalGatewayFilter implementsGlobalFilter, Ordered
{int capacity = 5;//桶的最大容量,即能装载 Token 的最大数量
int refillTokens = 1; //每次 Token 补充量
Duration duration= Duration.ofSeconds(1); //补充 Token 的时间间隔
private static final Map BUCKET_CACHE = new ConcurrentHashMap<>();privateBucket createNewBucket()
{
Refill refill=Refill.greedy(refillTokens, duration);
Bandwidth limit=Bandwidth.classic(capacity, refill);returnBucket4j.builder().addLimit(limit).build();
}
@Overridepublic Monofilter(ServerWebExchange exchange, Gateway