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

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

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

Golang 后端

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

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

Devbox 為開發(fā)者提供了幾個非常實用的功能:

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

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

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

導(dǎo)入項目到 Cursor

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

測試環(huán)境開發(fā)

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

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

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

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

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

提示 server stared 即為啟動成功

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

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

接口返回沒有問題。

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

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

首先切換到 fix-aiproxy 分支:

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

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

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

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

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

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

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

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

# 查詢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

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

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

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

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

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

然后來到 Devbox 發(fā)布頁面發(fā)布版本:

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

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

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

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

Next.js 前端

前端項目搭建

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

  1. 在 Devbox 中創(chuàng)建一個 Node.js 環(huán)境,版本選擇 20,端口改成 3000。由于 pnpm 安裝依賴比較消耗資源,建議選擇 4c 16G 的配置。然后克隆你自己 Fork 的 Sealos 倉庫: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)建依賴會不成功
  1. 執(zhí)行命令 pnpm i 安裝依賴。
  1. 執(zhí)行命令 pnpm -r --filter ./packages/client-sdk run build 構(gòu)建 client-sdk 包。
  1. 為了讓 Cursor 的 i18n 插件正常工作,我們需要將項目根目錄切換到 sealos/frontend/providers/aiproxy

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

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

對接后端環(huán)境

項目搭建完成后,我們需要配置環(huán)境變量來對接后端服務(wù)。在項目根目錄創(chuàng)建一個 .env 文件,需要配置以下幾個關(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)境變量配置完成后,運行 pnpm dev 即可啟動開發(fā)服務(wù)器。項目的發(fā)布和部署流程與前面介紹的后端開發(fā)流程完全一致。

總結(jié)

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

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

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

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業(yè)工程師共享工作效率翻倍的秘密
熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
返回頂部
上一篇
從零開始的機(jī)器學(xué)習(xí)實踐指南
下一篇
FastOpenAPI:Python框架API文檔自動化生成工具,解放你的雙手!
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
国产麻豆精品视频| 精品一区二区在线播放| 免费观看在线综合色| 一区二区三区蜜桃网| 亚洲欧洲精品成人久久奇米网| 欧美日本乱大交xxxxx| 久久综合九色综合97婷婷女人| 91福利社在线观看| 国产三级欧美三级| 亚洲视频一二三区| 视频在线观看国产精品| 国产日韩欧美一区二区三区乱码| 午夜视频久久久久久| 久久99蜜桃精品| 欧美天堂亚洲电影院在线播放| 精品少妇一区二区三区| 国产精品免费观看视频| 日韩电影在线免费| 欧美色综合影院| 国产女主播在线一区二区| 日韩电影免费在线| 97精品视频在线观看自产线路二| 欧美三级视频在线观看| 国产视频911| 久久福利视频一区二区| 欧美一区二区成人6969| 日韩国产欧美在线视频| 91精品中文字幕一区二区三区| 亚洲女同一区二区| 欧美三级中文字幕| 日日夜夜一区二区| 免费视频一区二区| 国产精品看片你懂得| 奇米色一区二区三区四区| 91在线观看高清| 精品国产sm最大网站免费看| 精品国产乱码久久久久久夜甘婷婷| 欧美精品一卡二卡| 久久精品人人做人人爽人人| 韩国中文字幕2020精品| 激情综合网最新| 99久久夜色精品国产网站| 91精品国产品国语在线不卡| 国产成人精品aa毛片| 国产精品久久久久久亚洲毛片| 欧美日韩国产高清一区二区三区| 色网站国产精品| 欧美久久久久久久久中文字幕| 日韩成人av影视| 亚洲女人****多毛耸耸8| 国产日韩三级在线| 欧美不卡一二三| 日韩视频一区二区三区| 日韩欧美一级二级三级久久久| 91在线免费播放| www.欧美色图| 91在线播放网址| 91亚洲国产成人精品一区二区三| 成人免费视频视频在线观看免费| 国产一区二区不卡| 成人禁用看黄a在线| 99re8在线精品视频免费播放| 成人短视频下载 | 蜜桃av一区二区| 男人的天堂亚洲一区| 美女一区二区三区在线观看| 老汉av免费一区二区三区| 美女网站色91| 国产一区二区三区av电影| 国产丶欧美丶日本不卡视频| 成年人网站91| 欧美日韩五月天| 欧美成人艳星乳罩| 中文字幕一区二区三区不卡| 一区二区三区四区乱视频| 午夜伊人狠狠久久| 秋霞成人午夜伦在线观看| 国内精品嫩模私拍在线| av在线不卡观看免费观看| 欧美在线视频你懂得| 精品国产成人系列| 久久蜜桃av一区二区天堂| 亚洲码国产岛国毛片在线| 日本成人中文字幕| 不卡视频免费播放| 欧美一级二级三级蜜桃| 亚洲欧洲日产国码二区| 蜜桃一区二区三区四区| 成人av在线一区二区| 欧美挠脚心视频网站| 国产精品久久久一本精品| 视频一区中文字幕国产| 99国产欧美另类久久久精品| 精品国产一区二区在线观看| 一区二区三区色| 国产麻豆一精品一av一免费| 欧美日韩日本视频| 亚洲欧美日韩国产综合在线| 久久av中文字幕片| 91精品国产综合久久精品图片 | 岛国精品在线播放| 日韩亚洲欧美中文三级| 亚洲午夜精品一区二区三区他趣| 成人免费的视频| 国产日本亚洲高清| 韩国av一区二区三区在线观看| 欧美巨大另类极品videosbest | 日韩高清一级片| 欧美日韩亚洲综合一区二区三区| 国产精品久久久久天堂| 国产成人在线网站| 久久久久久久久久久久久女国产乱| 三级一区在线视频先锋| 8x8x8国产精品| 午夜av电影一区| 欧美日韩一二区| 亚洲成a人片在线不卡一二三区| 色哟哟一区二区| 亚洲制服欧美中文字幕中文字幕| 99久久伊人精品| 91精品国产麻豆国产自产在线| 亚洲国产va精品久久久不卡综合| 91久久精品日日躁夜夜躁欧美| 夜夜嗨av一区二区三区中文字幕 | 一区二区在线观看视频| 色视频成人在线观看免| 亚洲一区二区三区四区中文字幕| 日本韩国一区二区三区视频| 一区二区三区欧美日韩| 欧美日韩精品一区二区三区四区 | 日韩欧美一级精品久久| 国产伦精品一区二区三区视频青涩 | 自拍偷在线精品自拍偷无码专区| av动漫一区二区| 最新不卡av在线| 欧美群妇大交群的观看方式| 美女精品一区二区| 国产欧美日韩不卡| 99久久精品一区| 日本伊人色综合网| 欧美激情一区不卡| 欧美特级限制片免费在线观看| 爽好多水快深点欧美视频| 久久精品网站免费观看| 91香蕉视频mp4| 免费成人在线网站| 亚洲最快最全在线视频| 久久久无码精品亚洲日韩按摩| 99久久免费国产| 久久国产精品99久久人人澡| 亚洲一区二区三区在线看| 久久久久久日产精品| 在线不卡欧美精品一区二区三区| 高清国产一区二区三区| 免费看精品久久片| 国产精品久久一卡二卡| 2017欧美狠狠色| 欧美性猛片xxxx免费看久爱| 高清不卡一二三区| 丝袜亚洲另类丝袜在线| 欧美激情中文字幕| 精品国产免费久久| 色哟哟一区二区| 国产高清在线精品| 蜜桃免费网站一区二区三区| 亚洲妇熟xx妇色黄| 亚洲精品国产一区二区精华液| 日韩欧美国产1| 日本久久一区二区三区| 欧美日韩高清一区| 91免费视频观看| 国产一区视频在线看| 日韩国产欧美三级| 国产亚洲精品精华液| 一本色道a无线码一区v| 国产精品一区二区免费不卡| 日韩经典中文字幕一区| 日本不卡视频在线| 亚洲国产另类精品专区| 一区二区欧美在线观看| 日韩午夜精品视频| 制服丝袜亚洲色图| 欧美午夜精品一区二区三区| 91一区二区三区在线观看| 国产麻豆视频一区| 国精产品一区一区三区mba视频| 国产一区二区精品久久91| 国产91对白在线观看九色| 国产精品2024| av电影在线观看不卡| 色婷婷综合中文久久一本| 欧美电影在线免费观看| 精品福利在线导航| 久久精品一区二区三区不卡| 国产欧美视频在线观看| 国产精品国产三级国产aⅴ入口 | 国产视频一区二区三区在线观看| 一区二区三区中文在线| 亚洲免费电影在线| 久久精品免费看|