springboot 项目中 zuul 的使用,限流
(1)
package com.hikvision.platform;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class PlatformZuulApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(PlatformZuulApplication.class);
application.run(args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(PlatformZuulApplication.class);
}
}
(2)
package com.hikvision.platform.config;
import com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.config.RateLimitKeyGenerator;
import com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.config.RateLimitUtils;
import com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.config.properties.RateLimitProperties;
import com.marcosbarbero.cloud.autoconfigure.zuul.ratelimit.support.DefaultRateLimitKeyGenerator;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.netflix.zuul.filters.Route;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServletRequest;
/**
-
自定义zuul换成key
-
@author
-
@date created in 2020/5/11 16:15
-
@since
*/
@Configuration
@ConditionalOnProperty(name = “zuul.ratelimit.enabled”, havingValue = “true”)
public class DefineRateLimitKeyGenerator {@Value("${zuul.routes.resource.service-id}")
private String resourceServiceId;@Bean
public RateLimitKeyGenerator ratelimitKeyGenerator(RateLimitProperties properties, RateLimitUtils rateLimitUtils) {
return new DefaultRateLimitKeyGenerator(properties, rateLimitUtils) {
@Override
public String key(HttpServletRequest request, Route route, RateLimitProperties.Policy policy) {
String routeId = route.getId();
if (resourceServiceId.equals(routeId)) {
String authorization = request.getHeader(“Authorization”);
if (StringUtils.isNotBlank(authorization)) {
return super.key(request, route, policy) + “:” + authorization.split("😊[0];
}
}
return super.key(request, route, policy);
}
};
}
}
(3)配置
#context
server.port=9250
spring.application.name=zuul-server
#redis相关配置
spring.redis.host=10.19.180.198
spring.redis.port=6379
spring.redis.database=0
spring.redis.password=
spring.redis.timeout=3000
spring.redis.jedis.pool.min-idle=0
spring.redis.jedis.pool.max-idle=10
spring.redis.jedis.pool.max-active=10
spring.redis.jedis.pool.max-wait=3000
#zuul相关配置
#zuul.sensitiveHeaders设置为空,代表不过滤任何Header信息,Header会向下转发
zuul.sensitive-headers=
#数据开放服务路由配置
zuul.routes.resource.service-id=resource
#忽略掉路由前缀
zuul.routes.resource.strip-prefix=false
#路由的请求路径
zuul.routes.resource.path=/platform/resource/**
#路由的地址
zuul.routes.resource.url=http://127.0.0.1:9258
#zuul限流相关配置
zuul.ratelimit.enabled=true
#不添加限流信息请求头
zuul.ratelimit.add-response-headers=false
#对应存储类型(用来存储统计信息)
zuul.ratelimit.repository=REDIS
#代理之后
zuul.ratelimit.behind-proxy=true
#默认限流策略
#可选 - 每个刷新时间窗口对应的请求数量限制
zuul.ratelimit.default-policy-list[0].limit=10000
#可选 - 每个刷新时间窗口对应的请求时间限制(秒)
#zuul.ratelimit.default-policy-list[0].quota=10
#刷新时间窗口的时间,默认值 (秒)
zuul.ratelimit.default-policy-list[0].refresh-interval=60
#限流方式 - 请求源头地址
zuul.ratelimit.default-policy-list[0].type[0]=origin
#限流方式 - 请求uri
zuul.ratelimit.default-policy-list[0].type[1]=url
#数据开放服务限流策略
#可选 - 每个刷新时间窗口对应的请求数量限制
zuul.ratelimit.policy-list.resource[0].limit=10000
#可选 - 每个刷新时间窗口对应的请求时间限制(秒)
#zuul.ratelimit.policy-list.resource[0].quota=1
#刷新窗口的时间,默认值(秒)
zuul.ratelimit.policy-list.resource[0].refresh-interval=60
(4)依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- zuul依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>com.marcosbarbero.cloud</groupId>
<artifactId>spring-cloud-zuul-ratelimit</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>