• Spring Cloud Gateway 网关组件及搭建实例


    Spring Cloud Gateway 是 Spring Cloud 团队基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技术开发的高性能 API 网关组件。Spring Cloud Gateway 旨在提供一种简单而有效的途径来发送 API,并为它们提供横切关注点,例如:安全性,监控/指标和弹性。

    Spring Cloud Gateway 是基于 WebFlux 框架实现的,而 WebFlux 框架底层则使用了高性能的 Reactor 模式通信框架 Netty。它最主要的功能就是路由转发,在定义转发规则时主要涉及以下三个核心概念:

    • Route(路由)—— 网关最基本的模块。它由一个 ID、一个目标 URI、一组断言(Predicate)和一组过滤器(Filter)组成。
    • Predicate(断言)—— 路由转发的判断条件,可以通过 Predicate 对 HTTP 请求进行匹配,例如请求方式、请求路径、请求头、参数等,如果请求与断言匹配成功,则将请求转发到相应的服务。
    • Filter(过滤器)—— 过滤器,可以使用它对请求进行拦截和修改,还可以使用它对上文的响应进行再处理。

    工作流程

    1. 客户端将请求发送到 Spring Cloud Gateway 上。
    2. Spring Cloud Gateway 通过 Gateway Handler Mapping 找到与请求相匹配的路由,将其发送给 Gateway Web Handler。
    3. Gateway Web Handler 通过指定的过滤器链(Filter Chain),将请求转发到实际的服务节点中,执行业务逻辑返回响应结果。
    4. 过滤器之间用虚线分开是因为过滤器可能会在转发请求之前(pre)或之后(post)执行业务逻辑。
    5. 过滤器(Filter)可以在请求被转发到服务端前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等。
    6. 过滤器可以在响应返回客户端之前,对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。
    7. 响应原路返回给客户端。
      在这里插入图片描述

    动态路由

    默认情况下,Spring Cloud Gateway 会根据服务注册中心(例如 Eureka Server)中维护的服务列表,以服务名(spring.application.name)作为路径创建动态路由进行转发,从而实现动态路由功能。

    可以在配置文件中,将 Route 的 uri 地址修改为形式 lb://service-name

    • lb:uri 的协议,表示开启 Spring Cloud Gateway 的负载均衡功能。
    • service-name:服务名,Spring Cloud Gateway 会根据它获取到具体的微服务地址。
     routes:
        - id: provider_dept_list_routh   #路由 id,没有固定规则,但唯一
              uri: lb://MICROSERVICECLOUDPROVIDERDEPT #动态路由,使用服务名代替具体端口
    
    • 1
    • 2
    • 3

    过滤器

    Spring Cloud Gateway 提供了以下两种类型的过滤器,可以对请求和响应进行精细化控制。按照作用范围又可以划分为GatewayFilter、GlobalFilter

    • Pre 类型:这种过滤器在请求被转发到微服务之前可以对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等操作。
    • Post 类型:这种过滤器在微服务对请求做出响应后可以对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。
     filters:
         - AddRequestParameter=X-Request-Id,1024
         # 过滤器工厂会在匹配的请求头加上一对请求头,名称为 X-Request-Id,值为 1024
         - PrefixPath=/dept # 在请求路径前面加上 /dept
    
    • 1
    • 2
    • 3
    • 4

    搭建实例

    1. 在项目 pom.xml 中引入Spring Cloud Gateway依赖(Gateway官方案例

      <!--特别注意:在 gateway 网关服务中不能引入 spring-boot-starter-web 的依赖,否则会报错-->
      <!-- Spring Cloud Gateway 网关组件依赖-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-gateway</artifactId>
      </dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    2. 配置 application.yml 文件

      test:
        #  hostport: httpbin.org:80
        #  hostport: localhost:5000
        #  uri: http://${test.hostport}
        #  uri: lb://httpbin
        uri: http://localhost:8001
      
      spring:
        jmx:
          enabled: false
        cloud:
          gateway:
            default-filters:
            # - PrefixPath=/httpbin
            - PrefixPath=/dept
            - AddResponseHeader=X-Response-Default-Foo, Default-Bar
      
            routes:
            # =====================================
            # to run server
            # $ wscat --listen 9000
            # to run client
            # $ wscat --connect ws://localhost:8080/echo
             - id: websocket_test
              uri: ws://localhost:9000
              order: 9000
              predicates:
            	  - Path=/echo
            - id: websocket_test
              uri: ws://localhost:8001
              order: 9000
              predicates:
                - Path=/dept
            # =====================================
            - id: default_path_to_httpbin
              uri: ${test.uri}
              order: 10000
              predicates:
                - Path=/**
      
      logging:
        level:
          org.springframework.cloud.gateway: TRACE
          org.springframework.http.server.reactive: DEBUG
          org.springframework.web.reactive: DEBUG
          reactor.ipc.netty: DEBUG
          reactor.netty: DEBUG
      
      management.endpoints.web.exposure.include: '*'
      
      server:
        port: 9527
      
      • 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
    3. Http Restful Demo 测试

      1、服务提供者请求连接 http://localhost:8001/dept/list?uname=123
      2、gateway网关请求转发 http://localhost:9527/list?uname=123
      
      • 1
      • 2

    在这里插入图片描述

    1. Websocket Demo 测试

      1. test Demo
      wscat -l 9000	# 在本地9000端口启动websocket服务监听
      ws://localhost:9527/echo	# 使用postman测试收发信息情况
      
      • 1
      • 2
      • 3

    在这里插入图片描述

      2. test1 Demo
      ws://localhost:8001/dept/test/websocket   # 服务提供者请求连接
      ws://localhost:9527/test/websocket	# gateway网关请求转发
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在这里插入图片描述


    参考链接
    1、Github : spring-cloud/spring-cloud-gateway
    2、Gateway集成WebSocket 实现前后端通信
    3、推荐一个websocket测试工具:wscat
    4、spring cloud gateway-filter的那些事
    5、SpringCloud gateway (史上最全)

  • 相关阅读:
    探索DrissionPage:结合浏览器自动化与数据包操控的先进工具
    RabbitMQ 总结
    Spark Streaming系列-5、应用案例: 百度搜索风云榜
    C++数据结构X篇_22_希尔排序(不稳定的排序)
    一步一图带你构建 Linux 页表体系 —— 详解虚拟内存如何与物理内存进行映射
    安全入门day01
    卡尔曼时间序列预测
    【leetcode】单词长度的最大乘积
    公众号点击原文下载文件怎么设置
    必背积分表
  • 原文地址:https://blog.csdn.net/qq_37635772/article/details/128136041