作者:小傅哥
部落格:https://bugstack.cn
沉澱、分享、成長,讓自己和他人都能有所收穫!😄
大家好,我是技術UP主小傅哥。
還是在22年的時候,小傅哥做了一套基於 Netty 協議轉換和通訊的 API閘道器,分享給夥伴們學習使用,增加一些業務開發以外的知識積累。不過很多夥伴都問過小傅哥,為啥要自研閘道器呢?SpringCloud Gateway 不就可以用嗎?🤔 那你知道為什麼自研嗎?
不少夥伴問為啥自研,😂 但其實從我進入網際網路大廠,核心的分散式技術框架,幾乎就全部都是公司自研。從 rpc、mq、快取元件(配合redis叢集)、配置中心、分庫分表、任務排程、全鏈路監控,再到我們提到的 API 閘道器,全部的都是自研。
後來才知道,因為之前用過一些開源元件,在流程承載方面發生過重大事故。因為是開源的元件,沒法對每一個細節進行把控。而全部的自研,就會有非常強的把控力度,各個細節實現都可以做具體的最佳化方案,同時所有的元件自研,還可以更好的串聯起來使用。另外還有一個點,就是這些開源的元件,更容易被攻擊,如果有漏洞要升級,那公司全升級一遍的成本,不亞於一次大規模裁員的賠償!當然,一些中小廠還是用市面開源的就好,因為自研的成本並不低!
那麼為了讓大家更好的瞭解下大廠的API,今天我們就來體驗一款大廠開發的元原生API閘道器。有了這樣一個學習,在看API閘道器專案,也會更清楚自己在做什麼。
- 官網:https://higress.io/zh-cn/
- 原始碼:https://github.com/alibaba/higress
- 部署:https://github.com/higress-group/higress-standalone -
獨立執行版,用於測試
- 案例:https://gitcode.net/KnowledgePlanet/road-map/xfg-dev-tech-higress -
部署測試
Higress 是一套比較龐大的工程,為了讓大家可以方便的體驗到,小傅哥會教給大家怎麼做一個獨立的部署和配置閘道器負載。此外文末還提供了基於 Netty 的 API閘道器學習教程。
一、Higress 介紹
Higress 是基於阿里內部兩年多的 Envoy Gateway 實踐沉澱,以開源 Istio 與 Envoy 為核心構建的雲原生 API 閘道器。Higress 實現了安全防護閘道器、流量閘道器、微服務閘道器三層閘道器合一,可以顯著降低閘道器的部署和運維成本。
- 生產等級;支援每秒請求量達數十萬級的大規模場景。徹底擺脫 reload 引起的流量抖動,配置變更毫秒級生效且業務無感。
- 平滑演進;支援 Nacos/Zookeeper/Eureka 等多種註冊中心,可以不依賴 K8s Service 進行服務發現,支援非容器架構平滑演進到雲原生架構。同時支援 Nginx、ServiceMesh。這些方面是非常重要的,也就是你之前部署的到各個方面的服務,都可以被 Higress 統一管理,這也是我們設計閘道器的目的。
- 便於擴充套件;提供 Wasm、Lua、程序外三種外掛擴充套件機制,支援多語言編寫外掛,生效粒度支援全域性級、域名級,路由級。外掛支援熱更新,變更外掛邏輯和配置都對流量無損。
接下來,小傅哥就帶著大家安裝部署體驗下。什麼東西都是上手了才有感覺。
二、環境部署
- 雲伺服器:2c4g 最低,我是用的 2c8g 體驗的。https://yun.xfg.plus - 價格實惠。
- 基礎環境:Docker、Portainer、Git 【在小傅哥的 bugstack.cn 路書中都有講解安裝和使用】
- 整體安裝完會如圖所示。
1. 軟體準備
1.1 方式一
在你的 Linux 伺服器,透過 Git 命令檢出安裝專案;
git clone https://github.com/higress-group/higress-standalone.git
1.2 方式二
手動下載;https://github.com/higress-group/higress-standalone/archive/refs/heads/main.zip 在透過 ssh 的 sftp 工具上傳到雲伺服器。之後解壓 unzip
2. 安裝 higress
2.1 執行 configure.sh
[root@lavm-aqhgp9nber github]# cd higress-standalone-main/bin/
[root@lavm-aqhgp9nber bin]# ls
base.sh configure.sh logs.sh reset.sh shutdown.sh startup.sh status.sh update.sh
[root@lavm-aqhgp9nber bin]# ./configure.sh
- 執行 ./configure.sh 後,注意選擇 nacos 其他的預設值就可以,直接回車。
- 執行過程會自動檢測,nacos 的安裝和刪掉。這些不用操作。
- 如果執行中遇到了失敗或者自己選擇錯了,可以重新執行 ./configure.sh -r
2.2 執行 startup.sh
[root@lavm-aqhgp9nber bin]# ./startup.sh
- 這一步就傻瓜式的了,直接就可以安裝完成。
3. 安裝 nginx
透過安裝 Nginx 模擬出2個請求服務地址,如果你部署 SpringBoot 提供出 HTTP 介面也是可以。
- 上傳到伺服器端執行指令碼
docker-compose -f nginx-docker-compose.yml up -d
三、閘道器配置
1. 服務來源
這裡要配置的是,透過 https://xxx/api 訪問到閘道器服務後,要訪問到哪些服務來源上。
- 服務來源支援非常多的型別,包括;Nacos、Zookeeper、Consul、Eureka、固定地址、DNS 域名。這裡小傅哥選擇固定地址配置。
- 分別配置了 nginx-01、nginx-02 這樣我們配置路由的時候可以負載到這2個地址。
2. 路由配置
路由配置的作用就是指定你透過閘道器地址負載到對應的目標服務上,這裡我們會讓 http://117.72.37.243/api/ 請求負載到2個 nginx 上。
- 透過路由api地址,訪問到目標服務。
- 這裡可以配置的玩法還有很多,可以自己在嘗試下。
3. 策略配置
- 你可以為訪問自己的路由介面配置對應的外掛,比如重寫URl、跨域、限流等各項功能。
四、服務驗證
- 地址:http://117.72.37.243/api/ - 你需要換成自己的IP地址
- 首先,我在 Nginx 的 HTML 中,配置了2個不同的請求結果,一個 01、一個 02
- 之後,訪問閘道器地址加上 /api 接下來訪問就會看到結果的變化了。
有了這個大廠閘道器的體驗,大家就瞭解了一套閘道器是如何使用的,作用是什麼啦。接下來,如果感興趣技術的積累,想擴充套件下自己,也可以學習一套閘道器程式碼的實現。
五、閘道器學習
除了業務開發,小傅哥自己也是非常感興趣於這樣的閘道器技術元件的實現,所以在日常的工作中也積累了很多閘道器的設計。後來在22年做了一套輕量的閘道器係統,把核心的核心邏輯實現出來讓大家學習。幫助了很多夥伴學習專案後找到了不錯的工作。
整個API閘道器設計核心內容分為這麼五塊;
第一塊
:是關於通訊的協議處理,也是閘道器最本質的處理內容。這裡需要藉助 NIO 框架 Netty 處理 HTTP 請求,並進行協議轉換泛化呼叫到 RPC 服務返回資料資訊。第二塊
:是關於註冊中心,這裡需要把閘道器通訊系統當做一個算力,每部署一個閘道器服務,都需要向註冊中心註冊一個算力。而註冊中心還需要接收 RPC 介面的註冊,這部分可以是基於 SDK 自動掃描註冊也可以是人工介入管理。當 RPC 註冊完成後,會被註冊中心經過AHP權重計算分配到一組閘道器算力上進行使用。第三塊
:是關於路由服務,每一個註冊上來的Netty通訊服務,都會與他對應提供的分組閘道器相關聯,例如:wg/(a/b/c)/user/... a/b/c 需要匹配到 Nginx 路由配置上,以確保不同的介面呼叫請求到對應的 Netty 服務上。PS:如果對應錯誤或者為啟動,可能會發生類似B站事故。第四塊
:責任鏈下外掛模組的呼叫,鑑權、授信、熔斷、降級、限流、切量等,這些服務雖然不算是閘道器的定義下的內容,但作為共性通用的服務,它們通常也是被放到閘道器層統一設計實現和使用的。第五塊
:管理後臺,作為一個閘道器專案少不了一個與之對應的管理後臺,使用者介面的註冊維護、mock測試、日誌查詢、流量整形、閘道器管理等服務。
專案學習地址:https://bugstack.cn/md/assembly/api-gateway/api-gateway.html