springcloud中zuul网关服务

一、配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

Zuul可以通过加载动态过滤机制,从而实现以下各项功能:

  1.验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。

  2.审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。

  3.动态路由: 以动态方式根据需要将请求路由至不同后端集群处。

  4.压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。

  5.负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。

  6.静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。

  7.多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。

二、配置路由规则

zuul:
  routes:
    # 给服务配置路由
    cloud-feign:
      path: /feign/**

默认路由规则

Zuul和Eureka结合使用,可以实现路由的自动配置,自动配置的路由以服务名称为匹配路径,相当于如下配置:

# 默认路由规则
zuul:
  routes:
    # 给服务配置路由
    cloud-feign:
      path: /cloud-feign/**

去掉默认路由规则

zuul:
  #关闭默认路由配置
  ignored-services: cloud-feign 

配置访问前缀

zuul:   
#不能用/zuul
prefix: /proxy

Header过滤及重定向添加Host

zuul:
   #配置过滤敏感的请求头信息,设置为空就不会过滤
   sensitive-headers: Cookie,Set-Cookie,Authorization
   #设置为true重定向是会添加host请求头
   add-host-header: true

三、过滤器

过滤器类型:

pre:在请求被路由到目标服务前执行,比如权限校验、打印日志等功能;
routing:在请求被路由到目标服务时执行,这是使用Apache HttpClient或Netflix Ribbon构建和发送原始HTTP请求的地方;
post:在请求被路由到目标服务后执行,比如给目标服务的响应添加头信息,收集统计数据等功能;
error:请求在其他阶段发生错误时执行。
自定义过滤器

/**
 * @auther: mufeng
 * @Date: 2019/11/26 16:25
 */
@Slf4j
public class AccessFilter extends ZuulFilter {
    /**
     * 过滤器类型,有pre、routing、post、error四种。
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤器执行顺序,数值越小优先级越高。
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否进行过滤,返回true会执行过滤。
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 自定义的过滤器逻辑,当shouldFilter()返回true时会执行
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {

        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        log.info("send {} request to {}",request.getMethod(),request.getRequestURL().toString());
        String token = request.getParameter("at");
        if(1==2){
            log.warn("access token is empty");
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseStatusCode(401);
            return null;
        }
        log.info("access token ok");
        return null;

    }
}

核心过滤器

过滤器名称  过滤类型  优先级 过滤器的作用
ServletDetectionFilter  pre  -3 检测当前请求是通过DispatcherServlet处理运行的还是ZuulServlet运行处理的。
Servlet30WrapperFilter  pre  -2 对原始的HttpServletRequest进行包装。
FormBodyWrapperFilter  pre  -1 将Content-Type为application/x-www-form-urlencoded或multipart/form-data的请求包装成FormBodyRequestWrapper对象。
DebugFilter  route  1 根据zuul.debug.request的配置来决定是否打印debug日志。
PreDecorationFilter  route  5 对当前请求进行预处理以便执行后续操作。
RibbonRoutingFilter  route  10 通过Ribbon和Hystrix来向服务实例发起请求,并将请求结果进行返回。
SimpleHostRoutingFilter  route  100 只对请求上下文中有routeHost参数的进行处理,直接使用HttpClient向routeHost对应的物理地址进行转发。
SendForwardFilter  route  500 只对请求上下文中有forward.to参数的进行处理,进行本地跳转。
SendErrorFilter  post  0 当其他过滤器内部发生异常时的会由它来进行处理,产生错误响应。
SendResponseFilter  post  1000 利用请求上下文的响应信息来组织请求成功的响应内容。

禁用过滤器:

zuul:
  filterClassName:
     filter:
       disable: true

禁用PreLogFilter的示例配置

zuul:
  PreLogFilter:
    pre:
      disable: true 

 

posted @ 2020-05-12 14:48  mufeng07  阅读(165)  评论(0编辑  收藏  举报