終於來到鐵人賽最後一天,本來想回顧總結我實作 side project 的過程,但想到讀者應該對於 Ktor 仍有許多疑問而正在猶豫是否要採用它,所以我列出之前有人問我 Ktor 的問題,以我個人觀點來回答這些疑問。
Kotlin 是 JetBrains 所開發的程式語言,Ktor 也是由 JetBrains 開發的 100% Kotlin Web 框架,再加上 JetBrains 的重量級產品 Space 就是使用 Ktor 開發的,所以是足夠成熟穩定的。許多人抱持著疑問是因為現在 Kotlin 大多應用在 Android 開發,比較少人拿來寫 Server-Side,不過我認為未來會有更多後端新專案從 Java 轉往 Kotlin,到時候 Kotlin 後端案例就會增多,自然使用 Ktor 的案例也會增加。
JetBrains 今年有投注更多人力資源於 Ktor 團隊,而且 Kotlin 官方網站也把 Ktor 的位置放在網頁最上方與 Spring 框架並列,最新舉辦的 Kotlin 2021 Premier Event 活動也有包含演講主題 What's New in Ktor 2.0,這代表 JetBrains 是有認真在推廣的。
Ktor 採用 Semantic Versioning,固定每個月的月底會發佈新版本,Ktor 團隊也承諾會儘量維持 API 穩定,大版本異動會保留時間讓你升級再移除 API。根據今年 Ktor roadmap 及過往的 release note,我認為 Ktor 團隊目前是想專心做好框架本身的功能,重構優化現有程式碼,讓開發者體驗更好,而非整合很多第三方函式庫來堆砌功能,所以以 Web 框架核心功能來說是愈趨穩定的。
Ktor 官方重大消息會發佈在 Ktor Blog,這2年的 roadmap 可參考以下2篇文章
以功能的角度來看,Ktor 本身並沒有限制你只能開發多少或多大的功能,只是大專案通常需要比較多功能,然而現在 Ktor 很少已經整合好的框架函式庫可以用而已。如果你不介意手刻或自行整合缺少的功能,那麼前期先花一些時間投資,後期的開發速度會大幅提升,我做這個 side project 的過程就是如此。
如果以效能的角度來看,Ktor 輕量啟動速度快、記憶體花費少,再加上底層引擊可以選擇 Netty,所以我認為效能是可以與其它框架相提並論的。另外在應用程式開發層面也不必擔心,Ktor 本身是基於 Coroutine 開發的,開發者自己也可使用 Coroutine 撰寫簡潔的非同步程式碼。順便一提,網路上搜尋 ktor performance benchmark 的文章,我建議要注意測試的框架版本及測試方式,避免受到過時的資訊誤導 Is Ktor really that slow compared to other micro java frameworks?
優點
缺點
如果你之前沒有寫程式的經驗,而且學習目的是為了找工作,那我建議你學習 Spring Boot,因為工作機會非常多。 反之,如果你是對後端程式開發有興趣,願意花時間自學 Kotlin 及 Web 框架的話,我很推薦你選擇 Ktor。這是因為 Ktor 是微框架,學習方式可以先專注學習 Web 框架本身的功能,後續再自己逐步整合第三方框架函式庫,雖然學習過程會比較長,但會比較了解 Web 框架的運作機制。 而且 Ktor 運作機制不使用 annotation,都是使用函式呼叫,所以很容易透過 IDE 工具 trace 原始碼,了解 Ktor 內部是如何運作的。
與 Ktor 相反,Spring Boot 已經整合好第三方框架函式庫,初學者只要設定及撰寫框架要求實作的程式碼,就可以快速完成功能,容易獲得成就感。但從另一個角度來看,初學者容易只專注於如何設定使用功能,而忽略了 Spring 框架背後的運作機制。此外,因為 Spring 已整合太多技術,市面上的書籍都很厚一本,初學者自學時容易分散注意力,覺得有很多東西要學而怯步,此時我建議要有老師帶領,有計劃地學習比較有效率。在此推薦 Vincent Huang 今年的鐵人賽 Spring Framework X Kotlin 影片教學,初學者可以先對 Spring 各個面向有基本概念,之後再對有興趣的主題深入學習,而且特別的是教學內容是使用 Kotlin 講解。
至於學 Ktor 之前要不要先學 Java,我個人認為不需要,這是因為 Ktor 是 100% Kotlin 開發的,所有範例程式碼也都是 Kotlin 寫的,完全不需要撰寫或閱讀 Java 程式碼。不過 Spring Boot 就建議你至少要能夠閱讀 Java 程式碼,畢竟目前 Spring Boot 使用 Kotlin 開發的比例並不高,網路搜尋到的文章及解決方法大多是使用 Java 寫的。
第一步是先掌握 Kotlin 語法及特性,熟悉 Lambda & DSL 風格的程式碼,再來學 Ktor。在這裡推薦三本 Kotlin 書籍
目前網路上有關 Ktor 的文章很少,而且不夠詳細或已過時,建議直接看官方文件就好。要注意 Ktor 分為 server 端的 web 框架及 client 端的 http client library,我們要看的是 server 端部分。實作方面,可以使用 Project Generator 工具,勾選想要安裝的 Plugin 即可產生專案,而且產生的程式碼就是最好的學習範例。接下來就是根據你安裝的 Plugin,搭配對應的說明文件進行實作,最後完成一個小專案。
因為 Ktor 使用人數很少,所以學習過程中容易有孤獨感…XD,歡迎你加入 Kotlin 讀書會,與同伴一起學習。這裡除了有讀書會活動之外,還有強調動手實作的練功場可以參加喔。
如果你已習慣 Spring 框架的開發方式,那就完全不需要換框架,因為從 Spring 5 開始對 Kotlin 的支援度已經很好了。如果想知道如何使用 Kotlin 搭配 Spring 框架開發,我推薦可以看看 Vincent Huang 今年鐵人賽 Spring Framework X Kotlin 的影片教學。
如果你跟我一樣,想學習與 Java & Spring 不同風格的程式語言及框架 (雖然 Java 新版本一直加入現代新語言的特性…XD),但又不想跳太遠離開 JVM 平台,那我覺得可以學一下 Kotlin & Ktor,讓自己對於後端 Web 框架有另一種思維去解決同一個問題。
如果你喜歡 Ktor 的架構設計,或是原本就習慣 DSL 的開發風格,而且又不需要 Spring 完整的生態系,那麼可以先實作一個小專案玩玩看,再決定是否要繼續使用 Ktor。
今年主要是學習 Kotlin 語言及研究使用 Ktor 開發的 Best Practice,並且已完成以下項目
預計接下來進行以下項目
Feature
改名為 Plugin
,這次順便掃瞄所有程式碼進行替換Query.toFuture(): CompletableFuture<QueryResult>
所以開發時只要操作 Exposed API 就好,儘量隱藏 jasync-sql API 在下層這一年來從學習 Kotlin & Ktor 的基本知識開始,一路上不斷地思考如何解決實作上遇到的問題,到現在完成了一個網站後端的系統雛形。 過程中我學習到
未來我希望能有更多人加入學習 Ktor 的行列,但我知道 Spring 框架生態系實在太強大,很難找到跟我一樣是因為興趣而學習 Ktor 的人,所以我認為推廣 Ktor 最快最有效的方式就是動手實作一個具有一定規模的專案範例,證明 Ktor 是可以做到後端服務常見的功能,而且在 Github 還有開放原始碼可以參考學習。不僅如此,我還希望這個範例不只是範例,是可以讓別人在我改造後的 Ktor 框架上面進行開發,不必從原始的 Ktor 框架開始,縮短開發時間及幫大家先踩雷,這樣才能提高採用 Ktor 的意願。
最後我要感謝 Kotlin 愛台灣 2021 鐵人賽團隊的隊友們,如果我沒有參加團隊,我可能無法堅持到最後完賽。還有要感謝各位讀者,因為我很少寫技術文章,而且內容包含許多實作細節,所以我也不確定大家是否都看得懂我在寫什麼,如果有不清楚的地方,歡迎在下方留言發問。