3.Zuul-过滤器

1.什么是Zuul?  

路由+过滤器=Zuul,核心是一系列的过滤器

2.Zuul的过滤器:

  • pre:可以在请求被路由之前调用
  • route:在路由请求时候被调用
  • post:在route和error过滤器之后被调用
  • error:处理请求时发生错误时被调用

3.生命周期

流程:请求首先到达pre类型的过滤器(前置过滤器,一般做参数校验、限流、鉴权),接下来是routing类过滤器(将外部请求转发到Origin Server上去),然后是post类过滤器(可以在这里做响应数据的加工、统计、日志)

整个生命周期中出现异常,将走error类过滤器。

application.yml:

zuul:
routes:
xxx-service: /fajun/** #fajun/开头的请求前缀都会路由到xxx-service服务上
host: #url路由形式时有效
connect-timeout-millis: 10000
socket-timeout-millis: 10000
retryable: false #是否开启重试机制
sensitive-headers: #敏感头不过滤,例如:cookie、set-cookie
#禁用/**/bbb请求路由
#ignored-patterns:
#- /**/bbb
#设置查看路由规则的权限
management:
security:
enabled: false

 过滤器demo(通过继承ZuulFilter然后覆写4个方法):

package com.wangfajun.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
import javax.servlet.http.HttpServletRequest;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;

public class TokenFilter extends ZuulFilter {

  //filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型 @Override public String filterType() { return PRE_TYPE; }
   //filterOrder:通过int值来定义过滤器的执行顺序(数字越小,越靠前执行) @Override public int filterOrder() { return PRE_DECORATION_FILTER_ORDER-1; }
   //shouldFilter:返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。在上例中,我们直接返回true,所以该过滤器总是生效 @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { RequestContext requestContext = RequestContext.getCurrentContext(); HttpServletRequest request = requestContext.getRequest(); String token = request.getParameter("token"); if(StringUtils.isEmpty(token)){ requestContext.setSendZuulResponse(false);//不通过 requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);//设置权限不足状态码 requestContext.setResponseBody("xxxx"); } return null; } }

启动类:

package com.wangfajun;

import com.wangfajun.filter.TokenFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy //开启Zuul代理
public class ApiGetwayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGetwayApplication.class, args);
    }

    @Bean
    public TokenFilter tokenFilter() {
        return new TokenFilter();
    }
}

pom:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> </dependencies>
原文地址:https://www.cnblogs.com/wangfajun/p/9285084.html