- 概要
- 整體介紹
- 補充說明
- Q. 有了 prisma 自動生成的 graphql 介面, 為什么還要 rest 介面和 websocket 介面?
- Q. 為什么要通過 illuminant 加一層反向代理, 而不是直接暴露 prisma 的 graphql 介面?
- Q. 既然 prisma 生成的 graphql 介面已經很強大, 為什么還需要 gorose ORM 來連接資料庫
- 補充說明
- illuminant 代碼結構介紹
- 解決的問題
概要
采用前后端分離的開發方式之后, 確實減輕了后端的開發負擔, 但同時, 也加大了前后端開發之間溝通的負擔.
最近, 我根據之前很長一段時間的專案實踐, 總結了一套后端的開發框架, 主要是基于 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 中.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20841.html
標籤:Go
