Spring Cloud Zuul

使用SpringBoot2 开发的基于Spring Framework 5开发的Gateway框架,用于替代 Netflix zuul

介绍

image-20211208153717511

网关的功能

  • 让客户端只需要访问一个服务地址

  • 保护网内的服务调用安全

  • 实现了 监控、弹性和安全性的路由

  • 过滤器完成以下功能

    • 跨域问题

      只要访问网关就能解决跨域问题

    • 身份认证与安全

    • 审查监控

    • 动态路由

    • 压力测试

    • 负载分配

    • 静态响应处理

    • 多区域弹性

实现方案

  • Nginx + Lua
  • Kong
  • Traefik
  • Spring Cloud Netflix Zuul
  • Spring Cloud Gateway

网关的工作方式

image-20211208165809450

搭建方式

创建一个注册中心

创建一个Product

创建一个Order 用Feing

搭建一个nginx 负载均衡到多个Gateway

使用zuul

  1. manven中引入 org.springframework.cloud spring-cloud-starter-netflix-zuul包

  2. application.yml

    1
    2
    3
    4
    zuul:
    ignoredServices: '*'
    routes:
    users: /myusers/** # myusers是前缀
  3. Application启动类上加入@EnableZuulProxy

  4. application.yml中添加路由规则

    1
    2
    3
    4
    5
    zuul:
    routes:
    users: # 自定义ID 可以有多个
    path: /myusers/** # URL映射路径
    serviceId: users_service #eureka的注册中心的ID
  5. 由于已经有了 Web Actuator hystrix ribbon 所以这些都不必添加了

  6. pom.xml 全文

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/>
    </parent>
    <groupId>org.akachi.eurekademo</groupId>
    <artifactId>zuul-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>zuul-service</name>
    <description>Demo project for Spring Boot</description>
    <properties>
    <java.version>11</java.version>
    </properties>
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Finchley.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    <version>2.0.0.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.0.0.RELEASE</version>
    </dependency>
    </dependencies>
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>

    </project>

  7. application.yml 全文

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    server:
    port: ${SERVICE_PORT:18880}
    spring:
    application:
    name: zuul-service
    main:
    allow-bean-definition-overriding: true
    eureka:
    client:
    register-with-eureka: true # 将自己注册到注册中心 默认 true
    fetch-registry: true # 是否从注册中心获取服务注册信息 默认true
    service-url:
    defaultZone: http://root:123456@localhost:18761/eureka/,http://root:123456@localhost:18762/eureka/,http://root:123456@localhost:18763/eureka/
    registry-fetch-interval-seconds: 1000 # 表示 eureka Client 间隔多久去服务器拉取注册信息,默认为 30 秒。
    zuul:
    routes:
    eurekademo-service-product: # 自定义ID 可以有多个
    path: /product/** # URL映射路径
    serviceId: eurekademo-service-product #eureka的注册中心的ID
  8. 由于约定大于配置其实不必配置zuul rules也可以通过刚才的地址访问(只要集成eureka)

路由配置

1
2
3
4
5
zuul:
ignored-services: /**/list #/product/list 就访问不到
ignored-patterns: eurekademo-service-product # 排除service多个就","分割
ignored-headers:
prefix: /shop #前缀配置

过滤器

image-20211209144240557

过滤类型

  • pre 配置路径与配置路由规则 找到需要转发的目标地址
    • 身份认证
    • 选择路由
    • 请求日志
  • routing 转发请求通过routing来完成
  • post 是返回信息
    • 对响应增加http头
    • 收集统计度量指标
    • 将响应以流的方式发送回客户端
  • error 任意过程出现问题都会转到error

关键名词

  • 执行顺序 integer中数值越小越先执行,同类型之间进行排序,不同类型的执行顺序是 pre>routing>post
  • 条件,可以开关过滤器
  • 动作: 执行符合条件的动作

参考资料