springcloud 网关过滤器Zuul Filter

为什么需要网关过滤器?

  微服务架构体系中,通常一个业务系统会有很多的微服务,

  比如:OrderService、ProductService、UserService...,

  为了让调用更简单,一般会在这些服务前端再封装一层,

  

  类似下面这样:

  

  前面这一层俗称为“网关层”,其存在意义在于,将"1对N"问题 转换成了"1对1”问题(路由),

  同时在请求到达真正的微服务之前,可以做一些预处理(过滤),

  比如:登录验证,日志打印...

 

Filter 的生命周期

  Filter 的生命周期有 4 个,分别是

     “PRE(前置过滤器)”:该类型的filters在Request routing到源web-service之前执行。用来实现Authentication、选择源服务地址等;

    “ROUTING(路由选择)”:该类型的filters用于把Request routing到源web-service,源web-service是实现业务逻辑的服务。这里使用HttpClient请求web-service;

    “POST(后置过滤器)” :该类型的filters在ROUTING返回Response后执行。用来实现对Response结果进行修改,收集统计数据以及把Response传输会客户端。

    “ERROR(错误过滤器)”:上面三个过程中任何一个出现错误都交由ERROR类型的filters进行处理。

  整个生命周期可以用下图来表示

"coustom"是自定义过滤器。

搭建过滤器

1.创建个网关微服务。zuul-server-20001(2001是端口号方便看)

2.在prm.xml导入zuul依赖包

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

3.在配置类中添加注解 @EnableZuulProxy;

@EnableZuulProxy这个注解是开启网关
@SpringBootApplication
//加上网关注解
@RestController
@EnableZuulProxy
public class ZuulServerApplication {

    @RequestMapping("/")
    public String show(){
        return "你好网关";
    }
    public static void main(String[] args) {
        SpringApplication.run(ZuulServerApplication.class, args);
    }
}

4.在yml里添加配置,注意网关也要指定注册中心地址。

#自定义路由映射zuul:  routes:    #你微服务的名字:/随便来个别名/你的微服务api    orders-server1: /order/**    orders-server: /order/**    user-server: /user/**  prefix: "/"  #禁止所有服务使用服务名访问  ignored-services: "*"

启动网关服务,就行了。

如果要自定义过滤器在网关微服务中建个类继承zuulfilter

/**
 * 这是网关的自定义过滤器
 */
@Component
    public class LoginZuulFilter extends ZuulFilter {
    @Override
    public String filterType() {    //这个过滤器设置为前置过滤器
        return "pre";
    }

  
    @Override
    public int filterOrder() {
        return 1;
    }

    /**
     * 次方法返回true,就执行下面的run方法
     * @return
     */
    @Override
    public boolean shouldFilter() {
        //获取请求上下文
        RequestContext context = RequestContext.getCurrentContext();
        //获取当前请求对象
        HttpServletRequest request = context.getRequest();
        //获取请求路径
        String requestURI = request.getRequestURI();
        //判断是否含有login路径,有就return turn
        if(requestURI.toUpperCase().contains("LOGIN")){
            return false;
        }
        return true;
    }

    /**
     * 在run方法中添加业务逻辑
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        //获取请求上下文
        RequestContext context = RequestContext.getCurrentContext();
        //获取当前请求对象
        HttpServletRequest request = context.getRequest();
        //获取当前响应对象
        HttpServletResponse response = context.getResponse();
        //获取头信息
        String tokin = request.getHeader("x-tokin");
        //判断tokin是否存在
        if(tokin==null){
            HashMap<Object, Object> map = new HashMap<>();
            map.put("booter",false);
            map.put("massage","亲登录");
            String s = JSON.toJSONString(map);
            try {
                response.getWriter().write(s);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //阻止放行
            context.setSendZuulResponse(false);
        }

        return null;
    }

配了就行了。重启服务。

原文地址:https://www.cnblogs.com/bigbigxiao/p/12122052.html

时间: 2024-08-30 15:28:54

springcloud 网关过滤器Zuul Filter的相关文章

SpringCloud网关组件zuul

1.引入如下依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupI

SpringCloud学习记录——网关(Zuul)

在微服务中网关的作用: 1.接收请求——与一般访问相同 2.转发请求 3.请求过滤 网关作用图示: 从上图可以看出,网关的作用实际上是对原始的请求方式插入了一层:在请求中间加入了一层网关,这样使得外部的所有请求都导向网关,再由网关来转发给具体服务处理. 加入网关的优势: 1.请求统一:原本的请求方式可能会因为访问的服务不同,出现访问地址也不同的问题,插入网关之后,访问地址统一指向网关:对于请求方而言,只需要记住一个访问地址就可以了,省事了: 2.通用功能的统一处理:与请求相关的各种操作都可以在网

Spring Cloud(七)服务网关 Zuul Filter 使用

上一篇文章中,讲了Zuul 转发,动态路由,负载均衡,等等一些Zuul 的特性,这个一篇文章,讲Zuul Filter 使用,关于网关的作用,这里就不再次赘述了,重点是zuul的Filter ,我们可以实现安全控制,比如,只有请求参数中有token和密码的客户端才能访问服务端的资源.那么如何来实现Filter了? Spring Cloud Zuul zuul 执行流程 Zuul大部分功能都是通过过滤器来实现的.Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期. PRE:

走进AngularJs(七) 过滤器(filter) - 吕大豹

时间 2013-12-15 16:22:00  博客园-原创精华区 原文  http://www.cnblogs.com/lvdabao/p/3475426.html 主题 AngularJS 过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们是:currency(货币).date(日期).filter(子串匹配).json(格式化json对象).

基于BitSet的布隆过滤器(Bloom Filter)

布隆过滤器 Bloom Filter 是由Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员.如果检测结果为是,该元素不一定在集合中:但如果检测结果为否,该元素一定不在集合中.因此Bloom filter具有100%的召回率.这样每个检测请求返回有"在集合内(可能错误)"和"不在集合内(绝对不在集合内)"两种情况,可见 Bloom filter 是牺牲了正确率和时间以节省空间. 当

.NET单点登录之过滤器(filter)--【SSO】

在.NET单点登录的探索中,用到一个知识点:过滤器(filter).常见的几种验证:Authorization filters,验证用户是否有权限访问页面:Action Filter,验证用户登录的时候是否用户信息存在:异常处理,比如session过期后可以返回登录页面等等. 一.Filter包含什么? filter主要分为四种,遍布于MVC,从页面请求到授权,到访问资源的各个阶段. Authorization filters:用于处理验证处理相关的操作 Action filters:在Cont

布隆过滤器(Bloom Filter)详解

布隆过滤器(Bloom Filter)详解 2012-07-13 18:35 by Haippy, 29358 阅读, 6 评论, 收藏, 编辑   布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Fi

Java三大器之过滤器(Filter)的工作原理和代码演示

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Fi

Struts2 源码分析——过滤器(Filter)

章节简言 上一章笔者试着建一个Hello world的例子.是一个空白的struts2例子.明白了运行struts2至少需要用到哪一些Jar包.而这一章笔者将根据前面章节(Struts2 源码分析——核心机制)里的机制图片来分析源码.如果还不明白核心机制的朋友,请转到对应的章节进行阅读.笔者为了方便读者阅读,也把图片在次贴到了本章中.如下 根据图片笔者就明白我们首要分析便是橙黄色(Servlet Filters).也就是传说的过滤器(Filter).相信看过笔者前面几个章节的读者都明白strut