• Spring之Zuul初步使用


    一、zuul是什么

    zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。

    Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。

    zuul的例子可以参考 netflix 在github上的 simple webapp,可以按照netflix 在github wiki 上文档说明来进行使用。

    二、zuul的工作原理

    1、过滤器机制

    zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。

    zuul把Request route到 用户处理逻辑 的过程中,这些filter参与一些过滤处理,比如Authentication,Load Shedding等。  

    Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。

    Zuul的过滤器之间没有直接的相互通信,他们之间通过一个RequestContext的静态类来进行数据传递的。RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。

    Zuul的过滤器是由Groovy写成,这些过滤器文件被放在Zuul Server上的特定目录下面,Zuul会定期轮询这些目录,修改过的过滤器会动态的加载到Zuul Server中以便过滤请求使用。

    下面有几种标准的过滤器类型:

    Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。

    (1) PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

    (2) ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。

    (3) POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

    (4) ERROR:在其他阶段发生错误时执行该过滤器。

    内置的特殊过滤器

    zuul还提供了一类特殊的过滤器,分别为:StaticResponseFilter和SurgicalDebugFilter

    StaticResponseFilter:StaticResponseFilter允许从Zuul本身生成响应,而不是将请求转发到源。

    SurgicalDebugFilter:SurgicalDebugFilter允许将特定请求路由到分隔的调试集群或主机。

    自定义的过滤器

    除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。

    例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。

    2、过滤器的生命周期

    Zuul请求的生命周期如图,该图详细描述了各种类型的过滤器的执行顺序。

    三、代码

    • api-gateway

      • pom.xml

         <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
                </dependency><dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-test</artifactId>
                    <scope>test</scope>
                    <exclusions>
                        <exclusion>
                            <groupId>org.junit.vintage</groupId>
                            <artifactId>junit-vintage-engine</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
            </dependencies>
      • application.yml

        server:
          port: 9001
        ​
        spring:
          application:
            name: api-gateway
        ​
        ​
        ​
        ​
        #指定注册中心地址
        eureka:
          client:
            serviceUrl:
              defaultZone: http://localhost:8761/eureka/
        ​
        zuul:
          routes:
            order-service: /apigateway/**
            product-service: /apigateway1/**
          #统一入口为上面的配置,其他入口忽略
          ignored-patterns: /*-service/**
        ​
      • 启动类

        @SpringBootApplication
        @EnableZuulProxy
        public class ApiGatewayApplication {
        ​
            public static void main(String[] args) {
                SpringApplication.run(ApiGatewayApplication.class, args);
            }
        ​
        }
      • 启动

    • 配置说明

      默认访问规则  
      http://gateway:port/service-id/**

      例子:默认 /order-service/api/v1/order/save?user_id=2&product_id=1
      自定义 /apigateway/api/v1/order/save?user_id=2&product_id=1

      自定义路由转发:
      zuul:
      routes:
      order-service: /apigateway/**


      环境隔离配置:
      需求 :不想让默认的服务对外暴露接口
      /order-service/api/v1/order/save

      配置:
      zuul:
      ignored-patterns:
      - /*-service/api/v1/order/save

     

  • 相关阅读:
    MYSQL中数据类型介绍
    怎么评估软件上线标准
    文件安全复制之 FastCopy
    强烈推荐美文之《从此刻起,我要》
    浅谈软件测试与墨菲定律
    夜神模拟器--安卓模拟神器
    RoadMap:如何创建产品路线图
    利用Python爬虫刷店铺微博等访问量最简单有效教程
    MySQL 数据库中删除重复数据的方法
    如何测试一个杯子
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11708031.html
Copyright © 2020-2023  润新知