带你全面了解Gateway

本文详细介绍了Spring Cloud Gateway,作为Spring Cloud的全新项目,旨在替代Zuul,提供更高的性能。内容包括:1. Gateway的介绍、属性及工作原理;2. 多种断言方式,如Path、Query、Method、Host等;3. 动态转发,整合注册中心如Eureka实现服务名称转发;4. 网关过滤器与全局过滤器的使用,包括Path、Query、Body等过滤器以及限流、重定向等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 介绍

1.1 gateway介绍

> Spring Cloud GateWay是Spring Cloud的⼀个全新项⽬,⽬标是取代Netflix Zuul,基于Spring5.0+SpringBoot2.0+WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能⾼于Zuul,官⽅测试,GateWay是Zuul的1.6倍,旨在为微服务架构提供⼀种简单有效的统⼀的API路由管理⽅式

在项目中使用网关需要导入下面的依赖,需要是springcloud项目

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

介绍

1.2 属性介绍

> gateway中包含以下属性

  • Route: 路由,主要的功能就是将请求转发到对应的服务端点,包含一个唯一的路由id,一个目标的url,一系列断言的集合,一组filter过滤器,当断言条件为true的时候就会执行这个路由

  • Predicate: 断言,主要是判断当前访问网关的地址应该执行哪个路由,转发到什么地方,可以通过判断请求中的任何数据来决定结果,比如可以判断请求头header,请求参数等

  • Filter: 过滤器,和servlet中的过滤器类似,主要是在请求转发之前和返回结果之前进行相关的处理

术语

 

1.3 网关如何工作

> 下图描述了网关如何工作,当网关收到请求的时候,会根据定义好的路由映射进行匹配,查看当前的请求地址能够匹配那个mapping, 然后将相关的请求发送到下面的web handler, handler中有一些过滤器组成了责任链对请求进行pre处理,然后最终送达到响应的服务器,在目标返回结果之后再通过过滤器进行post处理,最终返回给调用这个,过滤器的虚线用于区分是前置处理还是后置处理,其实整体过程类似于SpringMVC

工作流程图

 

流程介绍

 

二 断言

> 断言的作用就是做boolean判断,为true则代表符合当前的路由,会转发到对应的地址,Gateway 提供了很多断言的方式,可以让我们对请求进行匹配映射,并且可以多种断言同时使用 > > 断言语法: 方式=值

2.1 Path断言

> 当请求的地址匹配当前path的时候会执行当前路由

predicates:
    -Path=/mg

示例,下面的断言方式和这里一样

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: 08consumer-eureka-feign # 当前路由策略的唯一ID,可以随便写,但是如果出现多个id,必须唯一
          uri: http://localhost:12000 #当前路由指向的真实地址,这个地址是不是最终真实地址,最终地址会拼接上访问地址
          predicates: #配置断言, 符合下面断言的请求会转发到上面的url,断言很多种条件
            - Path=/order/**  #断言的条件是请求的地址符合这个表达式,注意格式为Path=/order/**

2.2 Query断言

> 参数值可以写正则,也可以只写参数名,在传递了符合的参数名和值之后会转发到对应的url

predicates:
	- Query=name,ba. #要求必须传递一个参数名叫name 值为ba开头的数据 .是匹配一个字符 *匹配N个相同的字符 ,  .*可以匹配任何内容

2.3 Method断言

> 当请求方式匹配的时候执行当前路由

predicates:
	- Method=get

2.4 Host断言

> 当是通过指定域名访问当前网关的时候执行对应的路由

predicates:
	- Host=localhost:8080

2.5 Cookie断言

> 当包含某个cookie和值的时候执行

predicates:
	- Cookie=name,yiming

2.6 Header断言

> 当包含某个header和对应的值的时候执行

predicates:
	- Header=reqId,9090\d+ #正则表达式\d+ 数字

2.7 Weight 权重路由

> 权重是将相同的请求分配到不同的服务器, Weight后的第一个参数一致的时候通过后面的数字按照比例分配请求

- id: weight2 #这个id唯一即可
  uri: http://localhost:12000
  predicates:
    - Path=/order/** #访问的地址
    - Weight=group1,2 #这个值用来控制访问当前地址的时候有多少请求会来这个地方,group1随便写的
  
- id: weight8 #唯一id
  uri: http://localhost:12001
  predicates:
    - Path=/order/** #这个地址和上面的地址一样
    - Weight=group1,8 #这里的group1要和上面一样,才会视为一组需要权重划分的操作

2.9 Before 时间路由

> 指定一个时间,在当前时间之前可以访问,可以用于定时停机

predicates:
	- Before=2022-04-19T00:05:00.789+08:00[Asia/Shanghai]

2.10 After 时间路由

> 指定一个时间,在当前时间之后可以访问,可以用于定时开启

predicates:
	- After=2022-04-19T00:05:00.789+08:00[Asia/Shanghai]

2.11 Between时间区间路由

> 在指定的时间区间内可以访问

predicates:
	- Between=2021-04-19T00:05:00.789+08:00[Asia/Shanghai],2022-04-19T00:05:00.789+08:00[Asia/Shanghai]

2.12 RemoteAddr

> 必须来自于某个地址发起的请求才可以访问

predicates:
	- RemoteAddr=192.168.1.1/24 #注意这个如果是本地localhost测试,并且设置了Host=localhost 那么就无法访问了,因为通过localhost服务端得到的你的ip是0:0:0:0:0:0:0:1,那就无法匹配这个地址了

三 动态转发

> 上面的例子中我们的目的地址是直接写死的一个服务器,实际开发中肯定是动态从注册中心中获取 > > 此处以Eureka为例子,其他的注册中心只需要替换对应的 注册中心配置即可

3.1 整合注册中心

3.1.1 添加eureka依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

3.1.2 配置

> 我们需要给网关配置注册中心的位置,并且告诉gateway从注册中心中获取服务,需要将url变成lb开头的协议

spring:
  application:
    name: gateway
  cloud:
    inetutils:
      ignored-interfaces: [ 'VMware.*' ]  #经过测试,我们发现我们的电脑上存在多个网卡的时候, 程序注册到注册中心的时候可能会带错ip过去,比如把虚拟机的网卡ip带过去了,如果是本机内部使用没问题,但是阔机器就不行了# 忽略掉我们不想要的网卡
    gateway:
      routes:
        - id: 08consumer-eureka-feign # 当前路由策略的唯一ID,可以随便写
          uri: lb://08CONSUMER-EUREKA-FEIGN #lb开头代表是负载均衡,意味着需要从注册中心获取数据,获取的是当前名字的服务地址
          predicates: #配置断言, 符合下面断言的请求会转发到上面的url,断言很多种条件
            - Path=/order/**  #断言的条件是请求的地址符合这个表达式,注意格式为Path=/order/**
    loadbalancer: #设置负载均衡
      ribbon:
        enabled: false #设置不用ribbon的负载均衡方式,因为它是阻塞的,设置为false后会自动变为非阻塞
#配置注册中心
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10000/eureka/
  instance:
    prefer-ip-address: true #在注册中心显示的是ip,而不是机器名

> 上面的方式是因为gateway中有默认的一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值