Ktor 的架構設計及開發風格是我所喜歡的,但相對地使用 Ktor 開發也要付出代價。因為 Ktor 以 unopinionated 的原則進行設計,所以很多功能不像 Spring 框架開箱即用,必須要先花時間自行開發缺少的功能及整合其它函式庫,這使得許多開發者猶豫是否要使用 Ktor 開發。另一方面,Ktor 是一個很年輕的框架,使用人數不多,網路上的範例也很少,而且大多為展示簡單的單一功能,缺乏將各個功能整合起來的完整後端服務範例,所以開發者必須根據自身經驗,事先思考如何規劃專案的檔案結構及程式架構,才能建構大型且容易維護的專案。
雖然 Ktor 不像 Spring 是一間什麼都有能馬上入住的樣品屋,但卻是一間小而美的毛胚屋,我可以按照我的想法進行內部隔間及裝潢,符合我的客製化需求,最後打造一間擁有個人風格的房屋。
以下是我想要整合的框架及實作的功能清單,最後完成一個後端服務範例,供大家參考學習。截至目前為止,codebase 累計已有 241 個 kt 檔,不含空白行超過 13000 行。後續我會逐一說明如何實作,讀者可直接挑有興趣的主題閱讀。
app.infra.i18n.langs = ["zh-TW", "en"]
lang()
進行操作authorize(ClubAuth.Admin) {
put<UUIDEntityIdLocation, UpdateUserForm, Unit>(ClubOpenApi.UpdateUser) { _, form ->
clubUserService.updateUser(form)
call.respond(HttpStatusCode.OK)
}
}
validate()
,類別可實作此函式檢查設定值是否合法
data class SessionConfig(
val expireDuration: Duration? = null,
val extendDuration: Duration? = null
) : ValidateableConfig {
override fun validate() {
require(if (expireDuration != null && extendDuration != null) expireDuration > extendDuration else true) {
"expireDuration $expireDuration should be greater than extendDuration $extendDuration"
}
}
}
每個子專案各自擁有以下項目
為了整合 DevOps 流程,我內建 Ops 子專案,目前包含 Operation Team 及 AppTeam 2種使用者角色,另外還有 Root 及 Monitor 2種服務角色。每種角色只可以呼叫有其權限的 API,可以進行權限控管。
Club 為展示功能的範例專案, 目前包含 Admin 及 Member 2種使用者角色,以 iOS, Android App 作為使用者客戶端