美文网首页
Spring Cloud Zuul(服务网关)

Spring Cloud Zuul(服务网关)

作者: bullion | 来源:发表于2019-03-31 18:17 被阅读0次

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);

    }

}

相关文章

网友评论

      本文标题:Spring Cloud Zuul(服务网关)

      本文链接:https://www.haomeiwen.com/subject/xhlubqtx.html