美文网首页
微服务网关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