[TOC]
## **1. 概括簡介**
> Cloud全家桶中有個很重要的組件就是網關,在1.x版本中都是采用Zuul網關;但是在2.x版本中,zuul的升級遲遲未更新,Spring Cloud最后自己研發了一個網關代替zuul, 那就是Spring Cloud GateWay
### **1.1 GateWay基本介紹**
網關在微服務系統架構的位置如下圖:

以下是來自官網的翻譯:

Spring Cloud GateWay 是基于WebFlux框架 ,使用Reactor模式, 而WebFlux框架底層使用的Netty,GateWay源碼架構:

### **1.2 GateWay作用**
1. 反向代理
2. 鑒權
3. 流量控制
4. 熔斷
5. 日志監控
…
### **1.3 微服務網關所處的位置**

### **1.4 zuul 和 gateway 各自特點和區別**

### **1.5 SpringCloud GateWay 特征**

### **1.6 GateWay三大核心概念**
1. **Route(路由)**
路由是構建網關的基本模塊,它**有ID**,**目標URI**,一系列的**斷言**過濾器組成,如果斷言為true則配備該路由,然后進行轉發。
2. **Predicate(斷言)**
類屬于正則匹配,匹配成功,就進行路由轉發。
3. **Filter(過濾)**
Filter 指的是Spring框架中GatewayFilter的實例,使用過濾器,可以在請求前或者之后對請求進行修改,可以完成**api鑒權、限流、日志**等功能
### **1.7 GateWay三大核心示意圖**

### 1.8 GateWay 工作流程
官網的工作流程圖:


**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 端口的微服務成功

### **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配置,表示對路徑進行配,如果路徑匹配成功就進行路由,匹配不成功就不進行路由,相當于進行的斷言判斷

官網Predicate配置,官網地址:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#gateway-request-predicates-factories
1
官網配置截圖:

**常用的 Route Predicate:**

對應的在yml配置:

注意predicates: 下面可以配置多個斷言規則如下圖:

更多Predicate配置請參考官網
## 3. GateWay 過濾器(Filter)
1. GateWay Filter 只能在業務邏輯之前,和業務邏輯之后
2. GateWay Filter 種類分為 單一的 GateWayFilter 和全局的 GlobalFilter
### 3.1 單一的 GateWayFilter
單一GateWay Filter配置如下截圖:


注意 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,可以成功訪問

請求沒有帶有參數username,無法訪問

或者參數
總結:
通過以上案例,我們可以自己定義全局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
- 熔斷和降級