SpringCloud全家桶 (第四期:Zuul网关之ZuulFilter过滤器)

一: 什么是SpringCloud

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.

翻译如下

Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台。

SpringCloud主要框架

上一篇文章已经说了SpringCloud Zuul中的路由功能,这篇文章解释下ZuulFilter过滤器

zuul核心就是一系列的filter

二:filter执行顺序

在这里插入图片描述
先执行Pre filters,再执行Routing filters ,最后执行Post filters。在这三个任意一个位置出现错误,都会执行Error filters

三:Zuul过滤器类型介绍

在这里插入图片描述

四:操作步骤

  1. 创建springboot项目,导入依赖
  2. 创建xxx类继承ZuulFilter
  3. 实现ZuulFilter的四个方法
  4. 配置Bean

五:实例

1.创建一个springboot项目,导入依赖

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

2.创建一个类ServiceFilter继承ZuulFilter,并实现以下的四个方法

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;

/**
 *  过滤器
 */
public class BusinessFilter extends ZuulFilter {

    /**
     * 过滤类型:pre,routing,post,error
     * @return
     */
    @Override
    public String filterType() {
        return null;
    }

    /**
     * 过滤顺序	
     * filterType相同过滤类型中,数值越小,优先级越高(负数也可以,0和-1,-1的优先级高)
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否过滤,默认为false
     * true:执行;    false:不执行
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return false;
    }

    /**
     * 业务
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        return null;
    }
}

3.修改BusinessFilter过滤器

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

import javax.servlet.http.HttpServletRequest;

/**
 * 过滤器
 */
public class BusinessFilter extends ZuulFilter {

    /**
     * 过滤类型:pre,routing,post,error
     *
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤顺序,数值越小,优先级越高(负数也可以,0和-1,-1的优先级高)
     *
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否过滤,默认为false
     * true:执行;    false:不执行
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 业务
     *
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext ct = RequestContext.getCurrentContext();
        HttpServletRequest request = ct.getRequest();
        String authorization = request.getParameter("authorization");
        if (authorization == null || authorization.isEmpty()) {
            ct.setSendZuulResponse(false);//返回false,不会继续向下执行
            ct.setResponseBody(" 非法的请求: token is empty! ");//返回内容
            ct.getResponse().setContentType("text/json;charset=utf-8");
        }
        return null;
    }

}

至于为什么ctx.setSendZuulResponse(false)设置为false就不执行,原理如下:
ctx.setSendZuulResponse(false) 告诉 Zuul 不需要将当前请求转发到后端的服务。原理体现在 shouldFilter() 方法上,源码在 org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter 中的 shouldFilter() 方法里,代码如下所示。

 public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        return ctx.getRouteHost() == null && ctx.get("serviceId") != null && ctx.sendZuulResponse();
    }

六:测试

启动相关服务,访问

在这里插入图片描述
在这里插入图片描述

参考链接:
http://c.biancheng.net/view/5417.html
https://blog.csdn.net/qq_38526573/article/details/93209757

上一篇:SpringCloud Zuul网关
下一篇:SpringCloud Config配置中心

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值