springcloudgateway學習

API網關

大型項目開發過程中,往往都是由各個不同的微服務組成的,服務可能分佈在不同地區不同機房,那用戶如何知道訪問某服務的時候該服務的實際地址呢,這時候就需要API網關了

API 網關就像服務的門面一樣,是系統對外的唯一接口,所有的請求經過網關代理轉發到對應的服務實例,這樣就不需要用戶關注微服務的信息了

而且網關層也可以集成一些非業務功能,比如說鑑權,限流,訪問日誌,監控等操作

對於服務數量衆多、複雜度較高、規模比較大的系統來說,使用 API 網關具有以下好處:

客戶端通過 API 網關與微服務交互時,客戶端只需要知道 API 網關地址即可,而不需要維護大量的服務地址,簡化了客戶端的開發。
客戶端直接與 API 網關通信,能夠減少客戶端與各個服務的交互次數。
客戶端與後端的服務耦合度降低。
節省流量,提高性能,提升用戶體驗。
API 網關還提供了安全、流控、過濾、緩存、計費以及監控等 API 管理功能。

常見的 API 網關實現方案主要有以下 5 種:

  • Spring Cloud Gateway
  • Spring Cloud Netflix Zuul
  • Kong
  • Nginx+Lua
  • Traefik

Spring Cloud Gateway

Spring Cloud Gateway 是 Spring Cloud 團隊基於 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技術開發的高性能 API 網關組件。
Spring Cloud Gateway 旨在提供一種簡單而有效的途徑來發送 API,併爲它們提供橫切關注點,例如:安全性,監控/指標和彈性。
Spring Cloud Gateway 是基於 WebFlux 框架實現的,而 WebFlux 框架底層則使用了高性能的 Reactor 模式通信框架 Netty

Spring Cloud Gateway 核心概念

Spring Cloud GateWay 最主要的功能就是路由轉發,而在定義轉發規則時主要涉及了以下三個核心概念,如下表。

核心概念 描述
Route(路由) 網關最基本的模塊。它由一個 ID、一個目標 URI、一組斷言(Predicate)和一組過濾器(Filter)組成。
Predicate(斷言) 路由轉發的判斷條件,我們可以通過 Predicate 對 HTTP 請求進行匹配,例如請求方式、請求路徑、請求頭、參數等,如果請求與斷言匹配成功,則將請求轉發到相應的服務。
Filter(過濾器) 過濾器,我們可以使用它對請求進行攔截和修改,還可以使用它對上文的響應進行再處理。

Gateway 的工作流程

Spring Cloud Gateway 工作流程如下圖。

Spring Cloud Gateway 工作流程

Spring Cloud Gateway 工作流程說明如下:

1
2
3
4
5
6
7
8
客戶端將請求發送到 Spring Cloud Gateway 上。
Spring Cloud Gateway 通過 Gateway Handler Mapping 找到與請求相匹配的路由,將其發送給 Gateway Web Handler。
Gateway Web Handler 通過指定的過濾器鏈(Filter Chain),將請求轉發到實際的服務節點中,執行業務邏輯返回響應結果。
過濾器之間用虛線分開是因爲過濾器可能會在轉發請求之前(pre)或之後(post)執行業務邏輯。
過濾器(Filter)可以在請求被轉發到服務端前,對請求進行攔截和修改,例如參數校驗、權限校驗、流量監控、日誌輸出以及協議轉換等。
過濾器可以在響應返回客戶端之前,對響應進行攔截和再處理,例如修改響應內容或響應頭、日誌輸出、流量監控等。
響應原路返回給客戶端。

動手實操

操作步驟
1
2
3
4
5
6
7
準備部署nacos

docker run -d -p 8848:8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname --restart always --name nacos2 nacos/nacos-server

創建一個新項目,集成SpringCloudGateway網關
創建服務ABC註冊到nacos
測試
集成SpringCloudGateway網關

SpringCloud 在最新版的JAVA要求支持是>17 且Springboot 與nacos 之間存在版本要求

本文使用

1
2
3
4
5
<java.version>1.8</java.version>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>

  1. 推薦使用 https://start.aliyun.com/ 搭建項目

start.aliyun.com

  1. 開啓 spring.cloud.gateway.discovery.locator.enabled= true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Nacos幫助文檔: https://nacos:io/zh-cn/docs/concepts:html
# Nacos認證信息
spring:
cloud:
nacos:
config:
username: nacos
password: nacos
contextPath: /nacos
# 設置配置中心服務端地址
server-addr: 124.223.114.198:8848
# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,請不要填寫這個值,直接留空即可
# spring:cloud:nacos:config:namespace:
# 與服務註冊與發現組件結合,設置爲 true 後;id默認爲微服務名稱xxx-server;gatewayapplication有feign自動做負載均衡;
#不需要定製化顯式配置;已生成默認的id=xservice,uri: lb://xserver , path=/serviceId/**
gateway:
discovery:
locator:
enabled: true

  1. 啓動一個微服務1並結合網關訪問
  2. 啓動一個微服務2並結合網關訪問
Nacos + Spring Cloud Gateway動態路由配置

我們知道,nacos是可以實現 配置的動態刷新 和 服務發現的。那麼我們將 Spring Cloud Gateway的配置放到 nacos上是否就可以實現動態的刷新路由呢?

通過測試發現是可以實現的。此處我們通過 Spring Cloud Alibaba技術來實現。

1、服務的註冊和發現使用 Spring Cloud Alibaba Nacos來實現。
2、網關使用 Spring Cloud Gateway來實現。

結論: 其實只需要在 Spring Cloud Gateway中整合 Spring Cloud Alibaba Nacos Config,網關的路由配置就可以自動刷新了,不需要額外的編碼。

如果想通過 lb://XXXX-service 訪問微服務,則需要 spring-cloud-starter-loadbalancer

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章