SpringCloud 之 Gateway网关 详解

本文深入探讨Spring Cloud Gateway,介绍了其作为微服务架构中的网关角色,核心概念如路由(Route)、断言(Predicate)和过滤器(Filter)。通过配置示例展示了如何实现动态路由、使用不同Predicate进行请求匹配,以及自定义Filter进行预处理和后处理操作。此外,还涵盖了鉴权、流量监控和熔断等网关功能。
摘要由CSDN通过智能技术生成

Gateway 新一代网关


  • 概述简介
  • 三大核心概念
  • Gateway工作流程
  • 入门配置
  • 通过微服务名实现动态路由
  • Predicate的使用
  • Filter的使用


概述简介


是什么


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RoEqmVBX-1653314908311)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522131056295.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjZByel0-1653314908313)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522130907206.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaRdrpEj-1653314908314)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522131143942.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-89HCyrOs-1653314908315)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522131220223.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-08MJJiKG-1653314908317)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522131944333.png)]

能干吗


  • 反向代理
  • 鉴权
  • 流量监控
  • 熔断
  • 日志监控
  • 。。。。。

微服务架构中网关在哪里


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aG9ZaJSI-1653314908318)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522132359183.png)]

为什么选择Gateway


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3u7cvdON-1653314908319)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522132647377.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EzvJdAJ8-1653314908319)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522132817109.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FwGDZnUT-1653314908319)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522132954780.png)]

Gateway 使用 Spring WebFlux 和 Netty:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YvT5tv6T-1653314908320)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522135800264.png)]

三大核心概念


  • Route(路由)

    路由是构建网关的基本模块,它又ID、目标url、一系列的断言和过滤器组成,如果断言为true则匹配该路由

  • Predicate(断言)

    参考的是Java8的 java.util.function.Predicate

    开发人员可以匹配Http请求中的所有内容(例如请求头和请求参数),如果请求和断言相匹配则进行路由

  • Filter(过滤)

    指的是spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改

  • 总体

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wuhOsNC-1653314908320)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522144529359.png)]

Gateway工作流程


官网总结


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZEw9xd1i-1653314908321)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522144928870.png)]

核心逻辑


  • 路由转发 + 执行过滤器链

入门配置


  • 新建module cloud-gateway-gateway9527

  • 改pom

    新加入gateway依赖:

    <!--gateway-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
      </dependency>
    
  • 写配置

  • 业务类 无

  • 主启动类

    加上 @EnableEurekaClient

  • 9527网关如何做到路由映射

    目前不想暴露8001端口,希望在8001外面套一层9527

  • yml新增网关配置:

    #gateway网关配置
    spring:
      cloud:
        gateway:
          routes:
            - id: payment_routh #payment_routh    #路由的ID,没有固定规则但要求唯一,建议配合服务名
              uri: http://localhost:8001         #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/get/**          #断言,路径相匹配的进行路由
    
            - id: payment_routh2 #payment_routh   #路由的ID,没有固定规则但要求唯一,建议配合服务名
              uri: http://localhost:8001          #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/lb/**             #断言,路径相匹配的进行路由
    
  • 测试:

    • 启动7001
    • 启动8001
    • 启动9527网关
  • 访问说明

    • 添加网关之前:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZedE2ZY-1653314908321)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522161954461.png)]

    • 添加网关之后:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pZnAZ3e-1653314908322)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522162423954.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOXJmCt4-1653314908323)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522162704343.png)]

yml配置说明


gateway网关路由有两种配置方式:

  • 在配置文件ynl中配置

  • 代码中注入 RouteLocator 的 Bean

    官网案例:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uBj0z4PT-1653314908323)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522163838689.png)]

    业务需求:通过9527网关访问到外网的百度新闻网址

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BYAIF7KC-1653314908324)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522210348577.png)]

通过微服务名实现动态路由


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cbHfAJLI-1653314908325)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522211252525.png)]

默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能

  1. 启动:一个eureka7001 + 两个服务提供者8001、8002

  2. 配置yml:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ywes3CgC-1653314908325)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522214947937.png)]

  3. 测试

    启动9527,访问 http://localhost:9527/pay/lb

    多次访问,可以看到:8001、8002两个端口互相切换

Predicate(断言)的使用


是什么


Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route(路由)进行处理

启动 微服务9527:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05tzUKxo-1653314908326)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522222537483.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a7UW0VyW-1653314908326)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522224553039.png)]

常用的Route Predicate


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GbUWkOv-1653314908327)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220522224933559.png)]

After Route Predicate Factory:

表示需要在After后面的时间之后的请求才会正确响应

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5NuNoVkb-1653314908327)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220523112114574.png)]

使用下面的类生成的 当前时间串 来填充上面的 After 后的位置,然后在时间串上进行修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qruaqgsO-1653314908328)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220523112223518.png)]

Cokiee Route Predicate:

表示需要携带cookie访问微服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZHQVK5w-1653314908328)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220523133937887.png)]

测试方法:

  • jmeter
  • postman
  • curl

curl检测:

不带Cookie访问:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L7hdPYkx-1653314908329)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220523135114465.png)]

携带Cookie访问:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G9ALL3H1-1653314908329)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220523135603529.png)]

Header Route Predicate:

表示需要携带http请求头进行访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7Hm9nsv-1653314908329)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220523135837433.png)]

Filter的使用


Spring Cloud GateWay的Filter


生命周期:

  • pre(业务逻辑之前)
  • post(业务逻辑之后)

种类:

  • GatewayFilter(单一的)(31种)
  • GlobalFilter(全局的)(10种)

自定义过滤器


自定义全局过滤器

两个主要接口介绍:implements GlobalFilter,Ordered

作用:

  • 全局日志记录
  • 统一网关鉴权
  • 。。。

案例代码:

@Slf4j
@Component
public class MyLogGatewayFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("进入全局日志记录 "+new Date());

        String name = exchange.getRequest().getQueryParams().getFirst("name");
        if (name == null){
            log.info("非法用户");
            //返回请求不被接受的状态码
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

测试:

  • 启动 注册中心7001、服务提供者8001,8002、网关9527
  • 访问:使用正确地址(携带用户名):http://localhost:9527/pay/lb?name=zl
  • 访问通过
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值