概要
采用前后端分離的開發方式之后, 確實減輕了后端的開發負擔, 但同時, 也加大了前后端開發之間溝通的負擔.
最近, 我根據之前很長一段時間的項目實踐, 總結了一套后端的開發框架, 主要是基於 golang 和 prisma. 它的主要功能在於:
- 本身很簡單, 更多的在於組合各種技術
- 充分利用 prisma 服務生成的 graphql 接口, 幾乎所有的 CURD 操作都自動化
- 除了通過 prisma 連接數據庫, 也可以使用 golang 直接連接數據庫, 使用了 gorose 這個 ORM
- 提供基本的 JWT 認證功能, 權限和業務關聯比較緊, 目前從框架中去掉了
- 各類型接口提供的示例 API(graphql/rest), 增加 RESTful 接口只要參照現有的接口就行
- 上傳/下載 提供接口示例, 也可以用來對接其他存儲服務
- 提供了 websocket 接口的示例
- 整個 golang 工程其實就是個模板, git clone 之后改改名字, 通過配置好自己的 prisma schema, 就能直接使用
用好這個工程, 需要對 prisma-v1 有一定的了解 項目名稱 illuminant, 開源在 gitee.com: https://gitee.com/wangyubin/illuminant 歡迎試用!
整體介紹
- 核心是 illuminant 工程
- 其中 download/upload api 可以直接對接磁盤, 也可以對接存儲服務
- 通過反向代理連接 prisma 自動生成的的 graphql 接口
- 通過 gorose ORM 直接連接 Mysql 數據庫
- 對外可以提供 3 種類型的接口
- graphql: prisma 自動生成
- rest: 作為自動生成接口的補充, 一般項目都不需要此類接口
- websocket: 如有實時推送或類似這方面的需求, 可以實現相關接口
補充說明
Q. 有了 prisma 自動生成的 graphql 接口, 為什么還要 rest 接口和 websocket 接口?
其實 prisma 自動生成的接口, 已經能夠滿足各類 CURD 需求.
但是對於一些統計分析的需求, 或者需要后端進行分析和計算的需求, 可以自定義 rest api, 作為 graphql api 的擴展
Q. 為什么要通過 illuminant 加一層反向代理, 而不是直接暴露 prisma 的 graphql 接口?
看過代碼就知道, 其實 illuminant 中的反向代理就是直接將客戶端的請求轉發到 prisma, 沒有任何特殊的操作.
但是直接暴露 prisma 生成的接口, 對於后續的管理不利, 至少想對接口做個簡單的用戶名/密碼認證都很困難, 因為你不可能去改 prisma 的源碼來支持你的認證機制.
加了一層之后, 可以在 illuminant 中更靈活的對來自客戶端的請求進行控制, 后續就算想加權限也不是不可能,
而 prisma 的 graphql 服務, 可以把它看作是一個提供豐富的 graphql 接口的 ORM
Q. 既然 prisma 生成的 graphql 接口已經很強大, 為什么還需要 gorose ORM 來連接數據庫
prisma 的 graphql 確實很強大, 也能完成幾乎所有的需求.
但是它還是有一些缺陷, 比如對事務的支持不是很好, 而且也不支持直接運行 SQL 等等.
所以, illuminant 中留下這個口子, 也是為了更靈活的應對未知的需求.
illuminant 代碼結構介紹
- 紫色虛線部分: 是后端的入口
- main.go: 主要是初始化配置文件, logger 等等
- route.go: 基於 gin 框架, 包含一些 API 示例(login, upload/download, graphql, todo 的 CURD 等)
- middleware: 暫時只有一個 jwt 認證的 middleware
- 紅色虛線部分: prisma 相關的部分, 其實整個 illuminant 框架主要就是想利用 prisma 來減輕 API 的開發
- prisma: prisma 配置, 包括 prisma 服務定義(prisma.yml), 數據庫模型定義(datamodel.prisma), 以及啟動服務的 docker-compose.yml
- prisma-client: 根據數據庫自動生成的 prisma golang client, 除了反向代理, 也可以通過這個 client 來訪問 prisma
- 藍色虛線部分: 和 prisma 並行的, 另一套自定義 API 的方式
- controller: 處理請求和返回值
- service: 處理實際業務, 連接 controller 和 model
- model: 定義數據庫的 ORM
- 黃色虛線部分: 共通的模塊
解決的問題
illuminant 本意是要做個后端開發的模板, 目的是用來做項目前期的快速的嘗試, 着重在提高后端的 開發的效率 上,
利用 prisma, 盡量減少后端的負擔, 使得項目能夠盡快使用起來, 盡快的驗證需求.
如果要用來做為生產環境的系統, 其實也未嘗不可.
權限部分的實現我在另外一個項目中也有嘗試, 只是還沒有集成到 illuminant 中.