美文网首页
【九】Spring Cloud zuul

【九】Spring Cloud zuul

作者: lemonMT | 来源:发表于2019-03-13 10:18 被阅读0次

    zuul相当于是路由网关,默认结合了Ribbon。Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接。

    1.zuul单独搭建网关项目

    1.1 增加项目依赖

     <!--增加服务注册能力-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <!--增加网关能力-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            </dependency>
    

    1.2 增加配置文件配置

    server:
      port: 8855
    spring:
      application:
        name: demo-springcloud-zuul
    zuul:
    
      routes:
        api-a:
          path: /api-a/**
          serviceId: demo-springcloud-service-order
    
        api-b:
          path: /api-b/**
          serviceId: demo-springcloud-service-user
    eureka:
      client:
        service-url:
          defaultZone: http://user:user@demo-springcloud-eureka-one:8761/eureka/
      instance:
        prefer-ip-address: true
    

    1.3 启动类增加代码修改

    //开启网关能力
    @EnableZuulProxy
    @EnableDiscoveryClient
    @SpringBootApplication
    public class DemoSpringcloudZuulApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoSpringcloudZuulApplication.class, args);
        }
    
    
        //实例化我们的拦截器
        @Bean
        public AccessFilter accessFilter() {
            return new AccessFilter();
        }
    }
    

    1.4 增加一些常用的拦截器

    //利用Zuul的过滤器来实现我们对外服务的安全控制, 这个只是pre过滤器
    public class AccessFilter extends ZuulFilter {
    
    
        /**
         * filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
         * pre:可以在请求被路由之前调用
         * routing:在路由请求时候被调用
         * post:在routing和error过滤器之后被调用
         * error:处理请求时发生错误时被调用
         */
        @Override
        public String filterType() {
            return "pre";
        }
    
        @Override
        public int filterOrder() {
            return 0;
        }
    
        @Override
        public boolean shouldFilter() {
            //这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
            return true;
        }
    
        //过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问
        @Override
        public Object run() throws ZuulException {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
    
    
            Object accessToken = request.getParameter("age");
            if(accessToken == null) {
                System.out.println("未通过安全校验");
                ctx.setSendZuulResponse(false);
                ctx.setResponseStatusCode(401);
    
                return "you can not  access to the  api-*";
            }
    
            System.out.println("通过安全校验");
            return null;
    
        }
    }
    

    1.5调用例子

    image.png

    2.zuul其他相关知识

    2.1 zuul常用的过滤器

    就和上文一样,我们同时继承 zuulFilter,里面有四种方法

    1. filterType:该函数需要返回一个字符串来代表过滤器的类型,而这个类型就是在HTTP请求过程中定义的各个阶段。在Zuul中默认定义了四种不同生命周期的过滤器类型,具体如下:
    • pre:可以在请求被路由之前调用。
    • routing:在路由请求时候被调用。
    • post:在routing和error过滤器之后被调用。
    • error:处理请求时发生错误时被调用。
    • filterOrder:通过int值来定义过滤器的执行顺序,数值越小优先级越高。
    • shouldFilter:返回一个boolean类型来判断该过滤器是否要执行。我们可以通过此方法来指定过滤器的有效范围。
    • run:过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。
    image.png image.png

    2.2 zuul处理异常

    因为zuul不太好用,建议替换成gateway. 所以后续再更新这块。
    todo

    相关文章

      网友评论

          本文标题:【九】Spring Cloud zuul

          本文链接:https://www.haomeiwen.com/subject/xandpqtx.html