zoukankan      html  css  js  c++  java
  • springcloud 网关过滤器Zuul Filter

    为什么需要网关过滤器?

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

      比如:OrderServiceProductServiceUserService...

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

      

      类似下面这样:

      

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

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

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

     

    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; }

    配了就行了。重启服务。

  • 相关阅读:
    ## 序列化和反序列化
    C#小型资源管理器
    codeforces #310 div1 B
    codeforces #310 div1 A
    BZOJ 1030 文本生成器
    BZOJ 2806 cheat
    BZOJ 2553 禁忌
    BZOJ 4199 品酒大会
    codeforces #309 div1 D
    codeforces #309 div1 C
  • 原文地址:https://www.cnblogs.com/bigbigxiao/p/12122052.html
Copyright © 2011-2022 走看看