Spring Cloud学习记录 06Spring Cloud Gateway 网关

Gateway 网关

Spring Cloud Gateway 网关 组件核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对 应的服务。

补充说明&优点

  • Gateway 替换了 Netflix Zuul 的一套解决方案
  • 隐藏 服务的 IP/端口 等信息
  • 提供统一的API路由管理方式 (url管理)
  • Gateway 核心功能 过滤/路由/断言
  • Gateway 也是个微服务,需要注册到 Eureka

核心功能

  • Route (路由) :路由信息由 ID、目标URL、一组断言、一组Filter 组成 (一般情况会通过断言进行判断 路由匹配)
  • Predicate (断言) :定义匹配的 HTTP 中的任何信息(如:请求头/参数等…
  • Filter (过滤器) :可在 请求/响应 进行一些业务上的处理

工作流程

说明:

  • 客户端 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关 的微服务中进行处理,此时处理运行特定的请求过滤器链

  • 过滤器虚线分开的原因:会在发送代理请求的 请求/响应 执行逻辑(所有 pre 过滤器逻辑先执行,然后执行 代理请求;代理请求完成后,执行 post 过滤器逻辑,进行响应)

示例

代码在 01Spring Cloud 的基础上进行编辑

  1. 创建新Maven工程(无骨架)
    我创建的工程名称 gateway

  2. gateway 依赖配置 pom.xml

    <!-- gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!-- eureka -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  3. gateway 启动类

    @SpringBootApplication
    @EnableDiscoveryClient // Eureka客户端
    public class GatewayApplication {
         
        public static void main(String[] args) {
         
            SpringApplication.run(GatewayApplication.class, args);
        }
    }
    
  4. gateway 配置 application.yml

    server :
        port : 10010
    spring :
        application :
            name : api-gateway
        cloud :
            gateway :
                routes :
                    # 路由id (随意)
                    - id : user-service-route
                      # 代理服务的地址
    #                 uri: http://localhost:9091  # 方式1 固定代理
                      uri : lb://user-service  # 方式2 动态代理
                      # 路由断言,可以配置的映射路径
                      predicates:
                        - Path=/user/**
    eureka :
        client :
            service-url :
                defaultZone : http://localhost:10086/eureka
        instance :
            # 优先应用ip,并非 host
            prefer-ip-address : true
    

    注意:

    • 填写路由断言的路径 不能存在空格 - Path=/user/**

    说明:

    • 代理路径 http://localhost:10010/user/1 ==> http://localhost:9091/user/1
    • 代理路由 有两种方式写,但一般不会写死,因此应用第二种方式
    • 路由配置中uri所用的协议为lb时,gateway 将使用 LoadBalancerClient 把 user-service 通过 eureka 解析为 实际IP 和 端口,并进行ribbon负载均衡
  5. 测试

    1. 依次打开 Eureka、server、gateway 三个服务
    2. 访问 http://localhost:10010/user/1(返回 数据代表成功)

过滤器

通过以上工作流程可得知 ,Gateway 的路由 过滤器允许 修改传入 请求/响应 的HTTP,只作用于特定的路由

过滤器生命周期

Spring Cloud Gateway 的 Filter 有两种: pre(请求被执行前调用)、post(请求被执行后调用) ,以上的工作流程可看出

使用场景

  • 请求鉴权:过滤器链式 调用到 filter()方法 前,如果发现无权限,返回Null
  • 异常处理:过滤器链式 调用到 filter()方法 后,记录异常并返回
  • 服务调用时长统计:过滤器链式 调用到 filter()方法 前后,根据时长统计

常用过滤器工厂

Gateway 中有很多内置的过滤器工厂,我们只需了解常用的过滤器

过滤器工厂名称 说明
AddRequestHeader 对匹配上的请求加上Header(请求头)
RemoveRequestHeader 对匹配上的请求去除Header(请求头)
AddRequestParameter 对匹配上的请求路由添加参数
SetStatus 设置 HTTP请求 的响应码<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值