美文网首页
微服务网关zuul

微服务网关zuul

作者: sunpy | 来源:发表于2020-09-20 19:03 被阅读0次

zuul功能

统一接入:智能路由、AB测试、灰度测试、负载均衡、容灾处理、日志埋点
流量监控:限流处理、服务降级
安全防护:鉴权处理、监控、机器网络隔离

1. zuul端点管理

便于直观查看Zuul的路径和微服务的映射。

# 忽略所有的服务
management:
  endpoints:
    web:
      exposure:
        include: "*"

2. 不暴露服务接口

zuul:
  ignored-services: user-consumer

3. zuul过滤器


(1)过滤类型FilterType,请求的生命期:

PRE类型:过滤器在请求被路由之前调用。
ROUTING类型:过滤器将请求路由到微服务。
POST类型:过滤器在路由到微服务以后执行。
ERROR类型:其他阶段发生错误时执行过滤器。
(2)过滤顺序FilterOrder:

(3)自定义过滤器:

@Component
public class RequestTokenFilter extends ZuulFilter {


    private final String REDIS_VAL = "abc123456";

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return FilterConstants.PRE_DECORATION_FILTER_ORDER;
    }

    @Override
    public boolean shouldFilter() {
        RequestContext rc = RequestContext.getCurrentContext();
        HttpServletRequest req = rc.getRequest();
        String token = req.getHeader("token");

        if (REDIS_VAL.equalsIgnoreCase(token)) {
            return false;
        }

        return true;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest req = requestContext.getRequest();

        String token = req.getHeader("token");

        if (!REDIS_VAL.equalsIgnoreCase(token)) {
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseBody("no token permission");
            // 没有访问权限状态码
            requestContext.setResponseStatusCode(401);
        }

        return null;
    }
}

(4)禁用过滤器

zuul:
  RequestTokenFilter:
    pre:
      disable: true

4. zuul容错回退

@Component
public class ServiceFallbackProvider implements FallbackProvider {

    @Override
    public String getRoute() {
        return "*";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {

        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.INTERNAL_SERVER_ERROR;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return HttpStatus.INTERNAL_SERVER_ERROR.value();
            }

            @Override
            public String getStatusText() throws IOException {
                return null;
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("当前服务不可用,请稍候再试!".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders httpHeaders = new HttpHeaders();
                httpHeaders.setContentType(MediaType.APPLICATION_JSON);
                return httpHeaders;
            }
        };
    }
}

相关文章

网友评论

      本文标题:微服务网关zuul

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