带你全面了解Gateway
一 介绍
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中有默认的一个
阿J~: 每个知识点讲解清晰 ,学到了学到了
好程序员IT教育: 需要源码的同学,后台dd吧~
好程序员IT教育: 如果还不会如何面试,可以后台踹小源帮你分析指导!
好程序员IT教育: 后台DD小源,回复1,领取Java学习资料包!
好程序员IT教育: 好程序员秉承只收本科以上的同学,并保证薪资不低于1万,后台dd1,领取Java学习资料包。