[TOC]
## **1. 概括简介**
> Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用Zuul网关;但是在2.x版本中,zuul的升级迟迟未更新,Spring Cloud最后自己研发了一个网关代替zuul, 那就是Spring Cloud GateWay
### **1.1 GateWay基本介绍**
网关在微服务系统架构的位置如下图:
![](https://img.kancloud.cn/86/27/86275512b2c253f46edf93b053f4cdf8_1547x707.png)
以下是来自官网的翻译:
![](https://img.kancloud.cn/54/34/543444a3a6ec7cb00efe0d8fd3fd98ad_1751x332.png)
Spring Cloud GateWay 是基于WebFlux框架 ,使用Reactor模式, 而WebFlux框架底层使用的Netty,GateWay源码架构:
![](https://img.kancloud.cn/fc/2d/fc2d8dc6c75fb0385af076c101e5ae4f_713x467.png)
### **1.2 GateWay作用**
1. 反向代理
2. 鉴权
3. 流量控制
4. 熔断
5. 日志监控
…
### **1.3 微服务网关所处的位置**
![](https://img.kancloud.cn/ff/07/ff07118ec4362969c2c8962fd2e002d9_935x654.png)
### **1.4 zuul 和 gateway 各自特点和区别**
![](https://img.kancloud.cn/1f/a2/1fa299cac61df8b409ddd1d634f36144_1488x348.png)
### **1.5 SpringCloud GateWay 特征**
![](https://img.kancloud.cn/2e/d1/2ed13943090449030232b26d973b49a4_895x413.png)
### **1.6 GateWay三大核心概念**
1. **Route(路由)**
路由是构建网关的基本模块,它**有ID**,**目标URI**,一系列的**断言**过滤器组成,如果断言为true则配备该路由,然后进行转发。
2. **Predicate(断言)**
类属于正则匹配,匹配成功,就进行路由转发。
3. **Filter(过滤)**
Filter 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求前或者之后对请求进行修改,可以完成**api鉴权、限流、日志**等功能
### **1.7 GateWay三大核心示意图**
![](https://img.kancloud.cn/58/b0/58b05748563b818a6f99cf79f7efaac1_1737x625.png)
### 1.8 GateWay 工作流程
官网的工作流程图:
![](https://img.kancloud.cn/7a/be/7abe78cfdd34aaeb072f2e509cf92856_595x747.png)
![](https://img.kancloud.cn/10/ae/10ae506f7d22a927abbacfb868fb6b84_1762x385.png)
**GateWay核心逻辑:路由转发 + 执行过滤器链**
## **2. GateWay入门配置**
### **2.1 创建gateway模块**
1. 新建一个springboot模块:springcloud-gateway9527
添加依赖
```
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
```
2. yml配置文件添加配置
```
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
# 路由集合
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8003 #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8002 #匹配后提供服务的路由地址
predicates:
- Path=/order/getPaymenttimeoutById/** # 断言,路径相匹配的进行路由
#- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai]
#- Cookie=username,zzyy
#- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
eureka:
instance:
hostname: cloud-gateway-service
client: #服务提供者provider注册进eureka服务列表内
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://localhost:7001/eureka
```
3. 主启动类
```
@EnableEurekaClient
@SpringBootApplication
public class SpringcloudGateway9527Application {
```
启动测试:
通过gateway网关 访问 8003 端口的微服务成功
![](https://img.kancloud.cn/51/98/5198e34b8df8231f7e82a25d5a4f5d10_676x156.png)
### **2.2 GateWay动态路由**
* **通过微服务名实现动态路由**
默认情况下Gateway 会根据注册中心注册的服务列表,以注册中心上的微服务名为路径创建动态路由进行转发,从而实现动态路由功能(能负载均衡)
* 路由配置修改(负载均衡)
* 需要修改YML配置文件
* 需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
```
lb://serviceName
```
gateway在微服务中自动为我们创建负载均衡uri,注意:注意添加`discovery.locator.enabled=true`表示开启从注册中心动态创建路由的功能,利用微服务名进行路由或者在主启动类加上`@EnableDiscoveryClient `表示开启服务注册和发现
```
@EnableDiscoveryClient
@SpringBootApplication
public class FyjmallGatewayApplication {
```
`uri: lb://cloud-payment-service` 表示匹配后提供服务的路由地址, cloud-payment-service是注册中心上的微服务名
```
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
# 路由集合
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
# uri: http://localhost:8003 #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由
- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: lb://cloud-payment-service #匹配后提供服务的路由地址
# uri: http://localhost:8002 #匹配后提供服务的路由地址
predicates:
- Path=/order/getPaymenttimeoutById/** # 断言,路径相匹配的进行路由
```
### 2.3 路由先后顺序
路由断言匹配 是按照 配置的先后顺序的,如果路由配置断言匹配先匹配上,那么久进行路由,接下来的路由就不会走了
以上配置就能实现动态路由,实现负载均衡的功能
GateWay Predicate(断言)
我们先看上面我们的配置,如下图红框总的predicate配置,表示对路径进行配,如果路径匹配成功就进行路由,匹配不成功就不进行路由,相当于进行的断言判断
![](https://img.kancloud.cn/b7/63/b7632b064fbf381740102176f211cf7d_1058x549.png)
官网Predicate配置,官网地址:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#gateway-request-predicates-factories
1
官网配置截图:
![](https://img.kancloud.cn/d3/6b/d36bc58488a49432ea80e04aa13a72b3_1747x850.png)
**常用的 Route Predicate:**
![](https://img.kancloud.cn/22/2c/222ca2146c990def65b57aa3cd767c50_449x644.png)
对应的在yml配置:
![](https://img.kancloud.cn/55/24/5524a2e58cd6f52ca6750d0b21576dbc_699x176.png)
注意predicates: 下面可以配置多个断言规则如下图:
![](https://img.kancloud.cn/f8/b4/f8b4469d81410253e0fcb45babac5b78_889x107.png)
更多Predicate配置请参考官网
## 3. GateWay 过滤器(Filter)
1. GateWay Filter 只能在业务逻辑之前,和业务逻辑之后
2. GateWay Filter 种类分为 单一的 GateWayFilter 和全局的 GlobalFilter
### 3.1 单一的 GateWayFilter
单一GateWay Filter配置如下截图:
![](https://img.kancloud.cn/a8/26/a8262bbd004fe605821d13f41c0f312c_1639x364.png)
![](https://img.kancloud.cn/52/68/5268233221f969c44a2608b1f9af7f86_1136x526.png)
注意 AddRequestParameter 参数表示添加请求参数,还有许多这样的参数配置,请参考官网。
### 3.2 自定义全局过滤器
1. 自定义过滤器要实现2个接口,GlobalFilter,Ordered
2. 主要能够实现全局日志记录,统一网关鉴权等…
案例代码:
```
@Component
public class MyGlobalFilter implements GlobalFilter,Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String username = exchange.getRequest().getQueryParams().getFirst("username");
if (username == null) {
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
// 放行
return chain.filter(exchange);
}
// 表示排名
@Override
public int getOrder() {
return 0;
}
}
```
测试:
请求带有参数username,可以成功访问
![](https://img.kancloud.cn/a2/c4/a2c4fe55e7005ea295e542c2aa3f04f7_586x111.png)
请求没有带有参数username,无法访问
![](https://img.kancloud.cn/49/c2/49c289e771b7c818b9161ddffd601ca6_809x323.png)
或者参数
总结:
通过以上案例,我们可以自己定义全局GlobalFilter,对请求进行过滤,可以根据我们自己的定义的规则来过滤每一个请求
[https://www.jianshu.com/p/38d0657abb00](https://www.jianshu.com/p/38d0657abb00)
- springcloud
- springcloud的作用
- springboot服务提供者和消费者
- Eureka
- ribbon
- Feign
- feign在微服务中的使用
- feign充当http请求工具
- Hystrix 熔断器
- Zuul 路由网关
- Spring Cloud Config 分布式配置中心
- config介绍与配置
- Spring Cloud Config 配置实战
- Spring Cloud Bus
- gateway
- 概念讲解
- 实例
- GateWay
- 统一日志追踪
- 分布式锁
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安装
- 1.2 特性
- 1.3 实例
- 1. 整合nacos服务发现
- 2. 整合nacos配置功能
- 1.4 生产部署方案
- 环境隔离
- 原理讲解
- 1. 服务发现
- 2. sentinel
- 3. Seata事务
- CAP理论
- 3.1 安装
- 分布式协议
- 4.熔断和降级
- springcloud与alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服务框架付费
- SkyWalking
- 介绍与相关资料
- APM系统简单对比(zipkin,pinpoint和skywalking)
- server安装部署
- agent安装
- 日志清理
- 统一日志中心
- docker安装部署
- 安装部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定时清理数据
- index Lifecycle Management
- 没数据排查思路
- ELK自身组件监控
- 多租户方案
- 慢查询sql
- 日志审计
- 开发
- 登录认证
- 链路追踪
- elk
- Filebeat
- Filebeat基础
- Filebeat安装部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安装
- rpm安装
- docker安装Logstash
- grok调试
- Grok语法调试
- Grok常用表达式
- 配置中常见判断
- filter提取器
- elasticsearch
- 安装
- rpm安装
- docker安装es
- 使用
- 概念
- 基础
- 中文分词
- 统计
- 排序
- 倒排与正排索引
- 自定义dynamic
- 练习
- nested object
- 父子关系模型
- 高亮
- 搜索提示
- kibana
- 安装
- docker安装
- rpm安装
- 整合
- 收集日志
- 慢sql
- 日志审计s
- 云
- 分布式架构
- 分布式锁
- Redis实现
- redisson
- 熔断和降级