zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    [BZOJ4869][洛谷P3747][六省联考2017]相逢是问候(线段树)
    [WC2014][BZOJ3435][洛谷P3920]紫荆花之恋(动态点分治+treap)
    JavaScript对象JQuery In Action
    每日一条SQL LEFT JOIN
    Div border 显示不出来的原因
    HTML列表标记:dl、dt、dd
    The Effective Executive 笔记 一
    c# 解析JSON的几种办法
    使用if else 容易犯的错
    每日一句SQL:内联视图
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11708031.html
Copyright © 2011-2022 走看看