iT邦幫忙

2021 iThome 鐵人賽

DAY 30
0
Modern Web

基於 Kotlin Ktor 建構支援模組化開發的 Web 框架系列 第 30

[Day 30] Ktor Q&A 與 Side Project Roadmap

終於來到鐵人賽最後一天,本來想回顧總結我實作 side project 的過程,但想到讀者應該對於 Ktor 仍有許多疑問而正在猶豫是否要採用它,所以我列出之前有人問我 Ktor 的問題,以我個人觀點來回答這些疑問。

Ktor Q&A

目前 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 本身並沒有限制你只能開發多少或多大的功能,只是大專案通常需要比較多功能,然而現在 Ktor 很少已經整合好的框架函式庫可以用而已。如果你不介意手刻或自行整合缺少的功能,那麼前期先花一些時間投資,後期的開發速度會大幅提升,我做這個 side project 的過程就是如此。

如果以效能的角度來看,Ktor 輕量啟動速度快、記憶體花費少,再加上底層引擊可以選擇 Netty,所以我認為效能是可以與其它框架相提並論的。另外在應用程式開發層面也不必擔心,Ktor 本身是基於 Coroutine 開發的,開發者自己也可使用 Coroutine 撰寫簡潔的非同步程式碼。順便一提,網路上搜尋 ktor performance benchmark 的文章,我建議要注意測試的框架版本及測試方式,避免受到過時的資訊誤導 Is Ktor really that slow compared to other micro java frameworks?

使用 Ktor 框架開發的優缺點?

優點

  • 簡潔易懂的 DSL 風格、大量使用 extension function 擴充功能、基於 Coroutine 函式庫,充份發揮 Kotlin 語言的優點
  • 架構設計允許開發者很容易實作 Plugin 進行擴展及客製化
  • Unopinionated 的設計原則,開發者不受框架限制,可自由挑選想要整合的第三方框架函式庫
  • 幾行程式碼就可以完成一個 API,可以快速開發一個小專案
  • 輕量而且核心很小、所以啟動速度快,記憶體花費少,開發與測試的效率提高許多
  • JetBrains 是開發 IDE 軟體的公司,所以很重視開發者體驗及開發工具的整合。Ktor 團隊今年推出了 Ktor Project Generator 及新版本 IntelliJ Ktor Plugin,雖然新版 Plugin 僅限 IntelliJ Ultimate 版本,不過 Ktor 本身仍然是 OpenSource 免付費的。

缺點

  • 需花時間自行整合第三方框架及函式庫
  • 缺乏常用套件支援,例如 OpenAPI Generator, i18n
  • 官方文件仍有改進空間,有時需要自己 trace source code。不過最近幾個月補文件的速度飛快,感覺有請人專門在寫文件
  • 社群人數、網路教學文章、GitHub 專案範例都很少,只能依靠官方文件及主動發問解決問題。不過現在官方 Slack Channel 有團隊成員進駐負責回答問題,不必害怕變孤兒求救無門。

Ktor 適合初學者嗎? 一定要先學會 Java 嗎?

如果你之前沒有寫程式的經驗,而且學習目的是為了找工作,那我建議你學習 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 寫的。

要如何學習 Ktor? 有那些學習資源?

第一步是先掌握 Kotlin 語法及特性,熟悉 Lambda & DSL 風格的程式碼,再來學 Ktor。在這裡推薦三本 Kotlin 書籍

目前網路上有關 Ktor 的文章很少,而且不夠詳細或已過時,建議直接看官方文件就好。要注意 Ktor 分為 server 端的 web 框架及 client 端的 http client library,我們要看的是 server 端部分。實作方面,可以使用 Project Generator 工具,勾選想要安裝的 Plugin 即可產生專案,而且產生的程式碼就是最好的學習範例。接下來就是根據你安裝的 Plugin,搭配對應的說明文件進行實作,最後完成一個小專案。

因為 Ktor 使用人數很少,所以學習過程中容易有孤獨感…XD,歡迎你加入 Kotlin 讀書會,與同伴一起學習。這裡除了有讀書會活動之外,還有強調動手實作的練功場可以參加喔。

我是使用 Spring Boot 開發的 Java 後端工程師,新專案想改用 Kotlin 開發,有必要換框架嗎? 例如 Ktor

如果你已習慣 Spring 框架的開發方式,那就完全不需要換框架,因為從 Spring 5 開始對 Kotlin 的支援度已經很好了。如果想知道如何使用 Kotlin 搭配 Spring 框架開發,我推薦可以看看 Vincent Huang 今年鐵人賽 Spring Framework X Kotlin 的影片教學。

如果你跟我一樣,想學習與 Java & Spring 不同風格的程式語言及框架 (雖然 Java 新版本一直加入現代新語言的特性…XD),但又不想跳太遠離開 JVM 平台,那我覺得可以學一下 Kotlin & Ktor,讓自己對於後端 Web 框架有另一種思維去解決同一個問題。

我想從非 Java/JVM 生態系轉往 Kotlin,Ktor 適合我嗎?

如果你喜歡 Ktor 的架構設計,或是原本就習慣 DSL 的開發風格,而且又不需要 Spring 完整的生態系,那麼可以先實作一個小專案玩玩看,再決定是否要繼續使用 Ktor。

Side Project Roadmap

今年主要是學習 Kotlin 語言及研究使用 Ktor 開發的 Best Practice,並且已完成以下項目

  • 在 Multi-Project 架構下進行開發、建置、部署,減少未來從單體式架構遷移至微服務架構的工作
  • 實作 Ktor Plugin 整合第三方框架及函式庫,包括 DI, ORM, Redis Client...等
  • 實作 Ktor 缺少的功能來強化 Ktor,包括 「i18n」, 「OpenAPI Generator」, 「API Role-Based Authorization」...等
  • 實作系統處理「Logging」及「Async Task」的機制
  • 實作後端常見的基本功能,包括「使用者登入驗證」、「訊息通知」

預計接下來進行以下項目

  • Migrate to Ktor 2.0
    • 10月底馬上就要發佈 ktor 2.0 了,預期會有許多新功能及 API Breaking Change,所以需要花一些時間調整或改寫。此外,Ktor 已經把 Feature 改名為 Plugin,這次順便掃瞄所有程式碼進行替換
  • 登入驗證支援 OAuth
    • 目前只有實作密碼驗證,然而現在 OAuth 算是必備功能了
  • 訊息通知支援 LineNotify
    • 台灣用 Line 人數最多,而且 LineNotify 免費
  • 整合 RabbitMQ
    • Redis 與 Message Queue 是後端架構必備的二大利器,所以預計還會再整合 RabbitMQ,先應用在訊息通知功能上面
  • 整合 Exposed 與 R2DBC (目前已實驗性整合成功)
    • 想使用 jasync-sql (R2DBC driver wrapper written in Kotlin) 非同步操作資料庫。目前 jasync-sql 的 API 屬於 low-level 操作,所以我想在上層利用 Exposed 的 Query DSL API 產生 sql,再傳入下層的 jasync-sql 執行查詢,jasync-sql 查詢後再把結果轉換回Exposed 的 ResultRow 物件,或是自定義的 DTO 物件。Query API 實作上是在 Exposed 的 Query, Table 類別加上許多 extension function,例如 Query.toFuture(): CompletableFuture<QueryResult> 所以開發時只要操作 Exposed API 就好,儘量隱藏 jasync-sql API 在下層
  • 部署至 GCP 或 Heroku
    • 現在我是部署至 AWS,有需要才啟動,未來想搬家到比較便宜的 GCP 或 Heroku。不過在搬家之前,我要先把 AWS SES 及 Kinesis Data Firehose 的實作拔掉。

學習心得與感謝

這一年來從學習 Kotlin & Ktor 的基本知識開始,一路上不斷地思考如何解決實作上遇到的問題,到現在完成了一個網站後端的系統雛形。 過程中我學習到

  • 如何擬定及調整 side project 的主題、範圍及目標。題目太小太簡單就學不到什麼,反而不想去做,但搞太大太複雜又會撐不下去而放棄,所以自己找到能長時間投入的方式是很重要的。例如卡關或累了那就休息一陣子,過一段時間回來,可能會想到新的問題或解決方式,就又有新的動力可以繼續下去了
  • 透過學習使用不同的程式語言及 Web 框架開發,讓我有不同的思維,以不同的方式去實作過去曾做過的功能
  • 透過手刻自幹框架套件功能,學習到許多技術背後的實作細節,不再只是拿網路上的範例來修改使用而已
  • 對某個新技術進行深入學習,因為學習資源少,所以遇到問題要靠自己摸索解決,但是這樣反而能逼迫自己去思考找出解決方法
  • 工作多年第一次參與社群,認識了許多學習伙伴,因為每個人的學習歷程都不相同,所以可以擴展自己的知識廣度

未來我希望能有更多人加入學習 Ktor 的行列,但我知道 Spring 框架生態系實在太強大,很難找到跟我一樣是因為興趣而學習 Ktor 的人,所以我認為推廣 Ktor 最快最有效的方式就是動手實作一個具有一定規模的專案範例,證明 Ktor 是可以做到後端服務常見的功能,而且在 Github 還有開放原始碼可以參考學習。不僅如此,我還希望這個範例不只是範例,是可以讓別人在我改造後的 Ktor 框架上面進行開發,不必從原始的 Ktor 框架開始,縮短開發時間及幫大家先踩雷,這樣才能提高採用 Ktor 的意願。

最後我要感謝 Kotlin 愛台灣 2021 鐵人賽團隊的隊友們,如果我沒有參加團隊,我可能無法堅持到最後完賽。還有要感謝各位讀者,因為我很少寫技術文章,而且內容包含許多實作細節,所以我也不確定大家是否都看得懂我在寫什麼,如果有不清楚的地方,歡迎在下方留言發問。


上一篇
[Day 29] 建立子專案來監控管理系統
系列文
基於 Kotlin Ktor 建構支援模組化開發的 Web 框架30

尚未有邦友留言

立即登入留言