體驗下,大廠在使用功能的API網關!

作者:小傅哥

博客:https://bugstack.cn

沉澱、分享、成長,讓自己和他人都能有所收穫!😄

大家好,我是技術UP主小傅哥。

還是在22年的時候,小傅哥做了一套基於 Netty 協議轉換和通信的 API網關,分享給夥伴們學習使用,增加一些業務開發以外的知識積累。不過很多夥伴都問過小傅哥,爲啥要自研網關呢?SpringCloud Gateway 不就可以用嗎?🤔 那你知道爲什麼自研嗎?

不少夥伴問爲啥自研,😂 但其實從我進入互聯網大廠,核心的分佈式技術框架,幾乎就全部都是公司自研。從 rpc、mq、緩存組件(配合redis集羣)、配置中心、分庫分表、任務調度、全鏈路監控,再到我們提到的 API 網關,全部的都是自研。

後來才知道,因爲之前用過一些開源組件,在流程承載方面發生過重大事故。因爲是開源的組件,沒法對每一個細節進行把控。而全部的自研,就會有非常強的把控力度,各個細節實現都可以做具體的優化方案,同時所有的組件自研,還可以更好的串聯起來使用。另外還有一個點,就是這些開源的組件,更容易被攻擊,如果有漏洞要升級,那公司全升級一遍的成本,不亞於一次大規模裁員的賠償!當然,一些中小廠還是用市面開源的就好,因爲自研的成本並不低!

那麼爲了讓大家更好的瞭解下大廠的API,今天我們就來體驗一款大廠開發的元原生API網關。有了這樣一個學習,在看API網關項目,也會更清楚自己在做什麼。

Higress 是一套比較龐大的工程,爲了讓大家可以方便的體驗到,小傅哥會教給大家怎麼做一個獨立的部署和配置網關負載。此外文末還提供了基於 Netty 的 API網關學習教程。

一、Higress 介紹

Higress 是基於阿里內部兩年多的 Envoy Gateway 實踐沉澱,以開源 IstioEnvoy 爲核心構建的雲原生 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、跨域、限流等各項功能。

四、服務驗證

  • 首先,我在 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

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