Spring Cloud Zuul?
zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。
在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。主要功能是路由转发和过滤器。
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
Application.java
@EnableZuulProxy
api-gateway-dev.yml
zuul:
# 全部服务忽略敏感头(全部服务都可传递cookie)
sensitive-headers:
routes:
# /myProduct/** 路由到 product
myProduct:
path: /myProduct/**
serviceId: product
#简洁写法
#product: /myProduct/**
#排除某些路由
ignored-patterns:
- /**/product/listForOrder
ZuulConfig.java
/**
* 配置文件修改了之后代码也动态更新
*/
@Component
public class ZuulConfig {
@ConfigurationProperties("zuul")
@RefreshScope
public ZuulProperties zuulProperties(){
return new ZuulProperties();
}
}
pre过滤器(在方法前执行)
@Component
public class TokenFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request= requestContext.getRequest();
//从url参数中获取,也可以从cookie hearder里获取
String token = request.getParameter("token");
if(StringUtils.isEmpty(token)){
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
}
return null;
}
}
post过滤器(方法后执行)
public class addResponseHeaderFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletResponse response = requestContext.getResponse();
response.setHeader("X-Foo", UUID.randomUUID().toString());
return null;
}
}
限流(令牌桶)
RateLimiterFilter.java
public class RateLimiterFilter extends ZuulFilter {
//每秒钟放100令牌
private static final RateLimiter RATE_LIMITER = RateLimiter.create(100);
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return FilterConstants.SERVLET_DETECTION_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
if (!RATE_LIMITER.tryAcquire()) {
throw new RateLimitException();
}
return null;
}
}
RateLimitException.java
public class RateLimitException extends RuntimeException {
}
跨域
/**
* 跨域配置
*/
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter(){
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); //支持cookie跨域
config.setAllowedOrigins(Arrays.asList("*")); //域名
config.setAllowedHeaders(Arrays.asList("*")); //允许头
config.setAllowedMethods(Arrays.asList("*")); //允许方法 GET POST
config.setMaxAge(300l); //缓存时间 在300秒内相同的跨域请求不再进行检查
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
网友评论