SpringCloud 之 Gateway网关 详解

Gateway 新一代网关


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

文章目录

  • Gateway 新一代网关
    • 概述简介
      • 是什么
      • 能干吗
      • 微服务架构中网关在哪里
      • 为什么选择Gateway
    • 三大核心概念
    • Gateway工作流程
      • 官网总结
      • 核心逻辑
    • 入门配置
    • 通过微服务名实现动态路由
    • Predicate(断言)的使用
      • 是什么
      • 常用的Route Predicate
        • After Route Predicate Factory:
        • Cokiee Route Predicate:
        • Header Route Predicate:
    • Filter的使用
      • Spring Cloud GateWay的Filter
      • 自定义过滤器


概述简介


是什么


SpringCloud 之 Gateway网关 详解_第1张图片

SpringCloud 之 Gateway网关 详解_第2张图片

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

SpringCloud 之 Gateway网关 详解_第3张图片

SpringCloud 之 Gateway网关 详解_第4张图片

能干吗


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

微服务架构中网关在哪里


SpringCloud 之 Gateway网关 详解_第5张图片

为什么选择Gateway


SpringCloud 之 Gateway网关 详解_第6张图片

SpringCloud 之 Gateway网关 详解_第7张图片

SpringCloud 之 Gateway网关 详解_第8张图片

Gateway 使用 Spring WebFlux 和 Netty:

SpringCloud 之 Gateway网关 详解_第9张图片

三大核心概念


  • Route(路由)

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

  • Predicate(断言)

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

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

  • Filter(过滤)

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

  • 总体

    SpringCloud 之 Gateway网关 详解_第10张图片

Gateway工作流程


官网总结


SpringCloud 之 Gateway网关 详解_第11张图片

核心逻辑


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

入门配置


  • 新建module cloud-gateway-gateway9527

  • 改pom

    新加入gateway依赖:

    
    
        org.springframework.cloud
        spring-cloud-starter-gateway
      
    
  • 写配置

  • 业务类 无

  • 主启动类

    加上 @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网关
  • 访问说明

    • 添加网关之前:

      SpringCloud 之 Gateway网关 详解_第12张图片

    • 添加网关之后:

      SpringCloud 之 Gateway网关 详解_第13张图片

    SpringCloud 之 Gateway网关 详解_第14张图片

yml配置说明


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

  • 在配置文件ynl中配置

  • 代码中注入 RouteLocator 的 Bean

    官网案例:

    SpringCloud 之 Gateway网关 详解_第15张图片

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

    SpringCloud 之 Gateway网关 详解_第16张图片

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


SpringCloud 之 Gateway网关 详解_第17张图片

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

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

  2. 配置yml:

    SpringCloud 之 Gateway网关 详解_第18张图片

  3. 测试

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

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

Predicate(断言)的使用


是什么


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

启动 微服务9527:

SpringCloud 之 Gateway网关 详解_第19张图片

SpringCloud 之 Gateway网关 详解_第20张图片

常用的Route Predicate


SpringCloud 之 Gateway网关 详解_第21张图片

After Route Predicate Factory:

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

SpringCloud 之 Gateway网关 详解_第22张图片

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

SpringCloud 之 Gateway网关 详解_第23张图片

Cokiee Route Predicate:

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

SpringCloud 之 Gateway网关 详解_第24张图片

测试方法:

  • jmeter
  • postman
  • curl

curl检测:

不带Cookie访问:

SpringCloud 之 Gateway网关 详解_第25张图片

携带Cookie访问:

SpringCloud 之 Gateway网关 详解_第26张图片

Header Route Predicate:

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

SpringCloud 之 Gateway网关 详解_第27张图片

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
  • 访问通过

你可能感兴趣的:(Spring,Cloud,spring,cloud,gateway,微服务,java,后端)