以 AI Proxy 應(yīng)用為例,這是一個(gè)典型的前后端分離架構(gòu)的應(yīng)用,主要由兩部分組成:

  1. 基于 Next.js 開(kāi)發(fā)的前端應(yīng)用和 BFF 層。BFF 層負(fù)責(zé)用戶鑒權(quán),并將經(jīng)過(guò)驗(yàn)證的請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)。
  2. 使用 Golang 開(kāi)發(fā)的后端服務(wù),負(fù)責(zé)核心業(yè)務(wù)邏輯,包括 token 存儲(chǔ)、日志記錄和請(qǐng)求轉(zhuǎn)發(fā)等功能。

接下來(lái),我將詳細(xì)介紹如何高效地開(kāi)發(fā)這樣一個(gè)生產(chǎn)級(jí)別的系統(tǒng)。

Golang 后端

創(chuàng)建開(kāi)發(fā)環(huán)境

首先在 Sealos Cloud (https://hzh.sealos.run) 中打開(kāi) Debox 應(yīng)用,創(chuàng)建一個(gè)新項(xiàng)目,選擇 Go 作為運(yùn)行環(huán)境,選擇 1.23 版本。

Devbox 為開(kāi)發(fā)者提供了幾個(gè)非常實(shí)用的功能:

創(chuàng)建完成后,幾秒鐘即可啟動(dòng)開(kāi)發(fā)環(huán)境。

環(huán)境準(zhǔn)備好后,我們直接用 Cursor 連接開(kāi)發(fā)環(huán)境。在操作選項(xiàng)中選擇使用 Cursor 連接:

首次打開(kāi)會(huì)提示安裝 Devbox 插件,安裝后即可自動(dòng)連接開(kāi)發(fā)環(huán)境。

導(dǎo)入項(xiàng)目到 Cursor

首先 Fork Sealos 源碼到自己的倉(cāng)庫(kù),然后再將你自己的倉(cāng)庫(kù)克隆到 Devbox 開(kāi)發(fā)環(huán)境:

測(cè)試環(huán)境開(kāi)發(fā)

在 Cursor 的面板中切換到 “Databse” 標(biāo)簽頁(yè),然后點(diǎn)擊箭頭指向的按鈕,在瀏覽器中打開(kāi) Sealos 的數(shù)據(jù)庫(kù)應(yīng)用:

然后創(chuàng)建 PostgreSQL 和 Redis 實(shí)例。

回到 Cursor 面板的 “Database” 標(biāo)簽頁(yè),點(diǎn)擊刷新即可看到剛創(chuàng)建的數(shù)據(jù)庫(kù)實(shí)例,點(diǎn)擊可復(fù)制連接信息:

在終端中啟動(dòng)服務(wù):

export ADMIN_KEY=sealos-admin
export SQL_DSN=<復(fù)制的pgsql連接串>/postgres
export REDIS_CONN_STRING=<復(fù)制的redis連接串>
go run . --port 8080

提示 server stared 即為啟動(dòng)成功

在 Cursor 面板的 “Network” 標(biāo)簽頁(yè)中,點(diǎn)擊地址欄右側(cè)的 ?? 按鈕,然后在彈窗中選擇 “Copy”,將地址復(fù)制到自己電腦上使用 curl 進(jìn)行測(cè)試:

curl https://mmznjndvzdrv.sealoshzh.site/api/status -H "Authorization: sealos-admin"

接口返回沒(méi)有問(wèn)題。

優(yōu)化數(shù)據(jù)庫(kù)設(shè)計(jì)

在開(kāi)發(fā)過(guò)程中,我們發(fā)現(xiàn)數(shù)據(jù)庫(kù)中 Group 和 Token 之間的外鍵約束增加了系統(tǒng)維護(hù)的復(fù)雜度。為了簡(jiǎn)化這一關(guān)系,我們可以將外鍵約束改為程序?qū)用娴娘@式調(diào)用,這樣可以讓代碼邏輯更加清晰和可控。

首先切換到 fix-aiproxy 分支:

sealos/service/aiproxy/model/group.go 文件中,我們需要將 Group 結(jié)構(gòu)體中一個(gè)外鍵約束改成在程序內(nèi)顯示調(diào)用更新和刪除來(lái)降低維護(hù)心智。

這里我選擇使用 Cursor 的 Chat 功能讓 AI 自己寫(xiě)代碼,最后生成的結(jié)果如下:

這種實(shí)現(xiàn)方式的優(yōu)勢(shì)在于:當(dāng)刪除 Group 時(shí),相關(guān)的 Token 刪除操作會(huì)在同一個(gè)事務(wù)中完成。由于是在事務(wù)內(nèi)進(jìn)行,我們不需要擔(dān)心刪除失敗或系統(tǒng)宕機(jī)導(dǎo)致的數(shù)據(jù)不一致問(wèn)題。

我們可以通過(guò)一系列測(cè)試來(lái)驗(yàn)證這個(gè)優(yōu)化是否達(dá)到預(yù)期效果。首先編譯并運(yùn)行服務(wù):

go build . && ./aiproxy --port 8080

然后通過(guò)以下 API 調(diào)用來(lái)測(cè)試完整的 Group 和 Token 生命周期:

# 創(chuàng)建一個(gè)group
curl https://gawavirgsomu.sealosbja.site/api/group/ -H "Authorization: sealos-admin" -d '{
"id": "ns-admin"
}'

# 創(chuàng)建一個(gè)token
curl https://gawavirgsomu.sealosbja.site/api/token/ns-admin -H "Authorization: sealos-admin" -d '{
"name": "token 1"
}'

# 查詢(xún)token
curl https://gawavirgsomu.sealosbja.site/api/tokens/ -H "Authorization: sealos-admin"

# 刪除group
curl https://gawavirgsomu.sealosbja.site/api/group/ns-admin -H "Authorization: sealos-admin" -X DELETE

# 再次查詢(xún)token
curl https://gawavirgsomu.sealosbja.site/api/tokens/ -H "Authorization: sealos-admin"

測(cè)試結(jié)果符合預(yù)期,確認(rèn)優(yōu)化方案可行。接下來(lái)我們就可以提交這些更改并創(chuàng)建 Pull Request 了。

上線到生產(chǎn)環(huán)境

首先在 Cursor 目錄頂層的 endpoint.sh 中設(shè)置啟動(dòng)命令,在文件中添加以下啟動(dòng)配置:

cd sealos/service/aiproxy
export ADMIN_KEY=sealos-admin
# 可以再創(chuàng)建一個(gè)單獨(dú)的生產(chǎn)環(huán)境數(shù)據(jù)庫(kù),與開(kāi)發(fā)環(huán)境隔離
export SQL_DSN=<復(fù)制的pgsql連接串>/postgres
export REDIS_CONN_STRING=<復(fù)制的redis連接串>
# 使用編譯好的二進(jìn)制文件
./aiproxy --port 8080

然后來(lái)到 Devbox 發(fā)布頁(yè)面發(fā)布版本:

點(diǎn)擊發(fā)布按鈕后,等待發(fā)布流程完成。發(fā)布成功后,點(diǎn)擊 “上線” 按鈕進(jìn)入部署頁(yè)面,然后點(diǎn)擊 “部署應(yīng)用” 即可:

部署完成后,進(jìn)入應(yīng)用的詳情頁(yè)面,等待應(yīng)用變成 running 狀態(tài),然后復(fù)制公網(wǎng)地址:

這個(gè)公網(wǎng)地址就是生產(chǎn)環(huán)境的域名,我們可以使用生產(chǎn)環(huán)境的域名進(jìn)行測(cè)試:

# 這里使用的是生產(chǎn)環(huán)境的域名
curl https://jpesudzryuhp.sealosbja.site/api/tokens/ -H "Authorization: sealos-admin"

Next.js 前端

前端項(xiàng)目搭建

前端環(huán)境的搭建與后端類(lèi)似,具體步驟如下:

  1. 在 Devbox 中創(chuàng)建一個(gè) Node.js 環(huán)境,版本選擇 20,端口改成 3000。由于 pnpm 安裝依賴(lài)比較消耗資源,建議選擇 4c 16G 的配置。然后克隆你自己 Fork 的 Sealos 倉(cāng)庫(kù):git clone https://github.com/xxx/sealos.git。AI Proxy 的前端代碼位于 sealos/frontend/providers/aiproxy 目錄。
  2. 切換到 sealos/frontend 目錄,首先修改 sealos/frontend/package.josn 文件,去除 node 版本限制,直接刪除 "node": "20.4.0""pnpm": "8.9.0" 這兩行即可,這一步很重要,不然代碼構(gòu)建依賴(lài)會(huì)不成功。
  1. 執(zhí)行命令 pnpm i 安裝依賴(lài)。
  1. 執(zhí)行命令 pnpm -r --filter ./packages/client-sdk run build 構(gòu)建 client-sdk 包。
  1. 為了讓 Cursor 的 i18n 插件正常工作,我們需要將項(xiàng)目根目錄切換到 sealos/frontend/providers/aiproxy

切換目錄后,建議安裝所有 @recommended 插件以獲得最佳的開(kāi)發(fā)體驗(yàn):

  1. 之前只是構(gòu)建出了 Sealos Desktop SDK,并沒(méi)有安裝 aiproxy 的依賴(lài),aiproxy 的依賴(lài)需要在 aiproxy 工作目錄下 sealos/frontend/providers/aiproxy 進(jìn)行安裝。直接執(zhí)行命令 pnpm i 安裝即可:

對(duì)接后端環(huán)境

項(xiàng)目搭建完成后,我們需要配置環(huán)境變量來(lái)對(duì)接后端服務(wù)。在項(xiàng)目根目錄創(chuàng)建一個(gè) .env 文件,需要配置以下幾個(gè)關(guān)鍵變量:

NEXT_PUBLIC_MOCK_USER=""
AI_PROXY_BACKEND_KEY=""
APP_TOKEN_JWT_KEY="test123"
AI_PROXY_BACKEND=""
AI_PROXY_BACKEND_INTERNAL=""
ADMIN_NAMESPACES=""

mock 數(shù)據(jù)如下:

{
"workspaceId" : "test"
}

環(huán)境變量配置完成后,運(yùn)行 pnpm dev 即可啟動(dòng)開(kāi)發(fā)服務(wù)器。項(xiàng)目的發(fā)布和部署流程與前面介紹的后端開(kāi)發(fā)流程完全一致。

總結(jié)

AI Proxy 前端項(xiàng)目采用了經(jīng)典的 Next.js App Router 架構(gòu),其中 app/[lng] 目錄用于頁(yè)面路由,app/api 目錄則用于后端 API 路由。

在這個(gè)項(xiàng)目中,Next.js 的后端實(shí)際上是一個(gè)中間層,它主要負(fù)責(zé)用戶認(rèn)證相關(guān)的業(yè)務(wù)邏輯,并將經(jīng)過(guò)認(rèn)證的請(qǐng)求轉(zhuǎn)發(fā)給真正的 Golang 后端服務(wù)。這種分層設(shè)計(jì)可以讓 Golang 后端專(zhuān)注于核心業(yè)務(wù)邏輯,不需要關(guān)心認(rèn)證等基礎(chǔ)設(shè)施,從而提高了代碼的靈活性和可移植性。

本文轉(zhuǎn)載自公眾號(hào)@sealos

上一篇:

免費(fèi)強(qiáng)大的API開(kāi)發(fā)和調(diào)試工具——Reqable

下一篇:

Ollama Python 調(diào)用:本地大模型的高效交互方式
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)