zuul功能

  • Zuul 包含了对请求路由和校验过滤两个最主要的功能:
    • 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础:
      • 客户端请求网关/api/product,通过路由转发到product服务,客户端请求网关/api/order,通过路由转发到order服务
      • 而过滤功能则负责对请求的处理过程进行干预,是实现请求校验等功能的基础。
  • Zuul 和 Eureka 进行整合,将 Zuul 自身注册为 Eureka 服务治理中的服务,同时从 Eureka 中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。

注意:Zuul服务最终还是会注册进Eureka

zuul自定义过滤器

  • 自定义过虑器需要继承 ZuulFilter,ZuulFilter是一个抽象类,需要覆盖它的4个方法,如下:
    • filterType:返回字符串代表过滤器的类型,返回值有:
      • pre:在请求路由之前执行
      • route:在请求路由时调用
      • post:请求路由之后调用, 也就是在route和errror过滤器之后调用
      • error:处理请求发生错误时调用
    • filterOrder:此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。
    • shouldFilter:返回Boolean值,判断该过滤器是否执行。返回true表示要执行此过虑器,false不执行。
    • run:过滤器的业务逻辑。
  • 自定义过滤器 LoginFilter
    • 继承 ZuulFilter
    • 在类上添加 @Component 注解 (一定不要少了)
    • 实现抽象方法

示例:

@Component //一定不要少了
public class LoginFilter extends ZuulFilter {
    Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public String filterType() {
        return "pre"; //请求路由前调用
    }

    @Override
    public int filterOrder() {
        return 1; //int值来定义过滤器的执行顺序,数值越小优先级越高
    }

    @Override
    public boolean shouldFilter() {
        return true; //该过滤器是否执行,true执行,false不执行
    }

    //定义 过滤功能
    @Override
    public Object run() {

        //1.获取请求上下文
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getParameter("token");
        //如果说请求带了token值,则表示已经登录过
        if (token == null) {
            logger.warn("此操作需要先登录系统");
            //没有登录 过,则不进行路由转发
            context.setSendZuulResponse(false);//拒绝访问
            context.setResponseStatusCode(200); //响应状态码
            try {
                context.getResponse().getWriter().write("token is empty...");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        //通过,会进行路由转发
        logger.info("通过,会进行路由转发");
        return null;
    }
}

Q.E.D.


擅长前端的Java程序员