使用 Kotlin 進行後端開發:快速概覽

已發表: 2022-03-11

我不必向原生 Android 開發者介紹 Kotlin,因為 2017 年 5 月,Google 宣布它將成為 Android 開發的官方語言。 從那時起,它作為開發新的、閃亮的 Android 應用程序的主要語言選擇而獲得了很大的關注。 它解決了 Java 的很多痛點,所以新的應用程序大多是用它編寫的,舊的應用程序正在用它重寫。

毫無疑問,它在應用程序的前端非常棒,當你第一次提到 Kotlin 時,大多數人都會將它與 Android OS 聯繫起來。 但是,在本文中,我將討論 Kotlin 作為一種後端語言,並且我想分享我為我的 Android 愛好項目創建一個快速、可靠和異步的 Kotlin 後端的故事。 我不會討論這個項目是關於什麼的,因為它超出了本文的範圍; 相反,我將重點解釋為什麼我選擇了 Kotlin,以及為什麼我認為它是編寫服務器端應用程序或 REST API 的好語言。

為什麼選擇 Kotlin?

讓我回到我旅程的起點。 我一直有創業的抱負,我認為這條道路上的第一步就是自己創造一些東西。 沒有什麼大不了的,沒有什麼能改變世界的,只有我和我的家人和朋友可以使用的小東西。 在有了一個合理的想法後,我直接跳進去並開始實施它。 在任何項目開始時,您要做的第一件事就是選擇您的工具。 畢竟,從長遠來看,正確的工具集可以為您節省大量時間和金錢。 所以這就是我所做的。

我主要是一名 Java 開發人員。 我已經使用 Java 和 Spring 編寫了幾個後端系統和 REST API,我確實認為這兩個是做這些事情的好工具。 Java 本身就是一門綜合性語言,但結合 Spring,沒有什麼是你不能實現的。

然而,湯裡只有一根細毛。 冗長。 儘管 Spring 和最新版本的 Java 對此有很大幫助,但您仍然必須處理大量樣板代碼。 正如一位偉人曾經告訴我的那樣——最安全、最可靠和無錯誤的代碼就是沒有寫下來的代碼。 以這個簡單的 Java 類為例:

 public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }

在我看來,這是很多簡單地說“我想要一個有兩個只讀字段的類”的代碼。 最糟糕的是構造函數和方法是自動生成的。 儘管如此,當你審查一個拉取請求時,你總是會通過它們,因為,你永遠不知道它們是否是你需要的。 當然,這可以通過 Lombok 等第三方庫來縮短,但如果我們可以開箱即用,那不是很好嗎? 讓我們在 Kotlin 中查看同樣的類:

 class Person( val name: String, val age: Int )

它肯定更短更簡單。 當我們使用val關鍵字時,變量是最終的; 構造函數和 getter 是在編譯時生成的。 如果我們不希望有一個不可變的 person 對象,我們可以簡單地將val更改為var ,瞧,我們有一個可變的 person,我們所要做的只是更改一個字母。

在一個簡單的 Java POJO 類中,我第二喜歡的部分是被覆蓋的equals()hashCode() 。 大多數情況下這些都是自動生成的,但你總是必須檢查它們,以確保它們。 好消息是 Kotlin 也可以處理這個問題。 只需將您的class更改為data class ,您就可以立即獲得equals()hashCode()

 data class Person( val name: String, val age: Int )

簡而言之,即使我喜歡 Java,我也想在短時間內為我的項目創建一個最小可行的產品。 而在軟件開發的情況下,實現這一點的最簡單方法是編寫更少的代碼。 因此,我繼續尋找更好的後端開發語言。 帶著這個想法,我首先轉向了 Node.js。 它有一些顯著的優勢——只需幾行代碼,您的 Express 服務器就已啟動並運行,偵聽端口 8080,並以Hello World 響應! 每次發送獲取請求時。

 let express = require('express') let app = express(); app.get('/', (req, res) => res.send('Hello World!')); app.listen(8080);

簡單、簡單、快速。 正是您對最流行的編程語言之一的期望。 我確實喜歡使用 JavaScript,並且有那麼一小會兒,我以為我找到了正確的工具,但後來我被 JavaScript 是動態類型的事實所困擾。 不要誤會我的意思,我確實認為動態類型在前端非常有用,但根據我的經驗,擁有靜態類型的後端只會讓您更加確信您的服務器不太可能因為類型不匹配而在運行時崩潰. 老實說,當您的後端為數十萬用戶提供服務時,您真的不希望這種情況發生。 然而,Node.js 提供了一個我想保留的很棒的特性,那就是能夠輕鬆編寫異步代碼和服務。

考慮到這些要求,我選擇了也在 Kotlin 中編寫我的 Kotlin Android 後端。

Kotlin:快速概述

對於那些以前從未聽說過的人來說,Kotlin 是一種開源的、靜態類型的編程語言,它同時支持面向對象和函數式編程。 它提供與 C#、Java 或 Scala 類似的語法和概念,主要針對 JVM,但也有針對 JavaScript 或本機代碼的變體。 Kotlin/JVM 編譯成 Java 字節碼與 Java 非常相似,所以對於那些有 JVM 背景的後端工程師來說,Kotlin 會很容易掌握。

正如其官方頁面所述,Kotlin 的目標不是獨一無二,而是從數十年的語言發展中汲取靈感和最佳實踐。 它可以與任何 Java IDE 或命令行一起使用,但我個人更喜歡並建議將它與 IntelliJ 一起使用。 它由 JetBrains 團隊積極維護和升級,不用擔心購買付費版本——如果您剛開始使用 Kotlin,IntelliJ 的社區版本將滿足您的所有需求。 我想指出 Kotlin 的三個最重要的方面是:a) 簡潔(它大大減少了樣板代碼),b) 安全(一方面,它是為避免空指針異常而構建的),以及 c ) 可互操作(您可以利用 JVM、Android 或瀏覽器的現有庫)。

Kotlin 協程

每個人都希望擁有能夠快速為用戶服務的服務。 要達到服務器的最大容量,您可以做的第一件事是擁有一個多線程應用程序。 Java對此非常麻煩。 當你學習 Java 時,你首先會知道如果你想要一個多線程的應用程序,你應該要么擴展 Thread 類,要么實現 Runnable 接口。 初學者永遠不會真正理解有什麼區別(如果有的話),但更令人困惑的是,他們還被告知始終使用 run 方法啟動線程,永遠不要使用 start 方法。 或者等等,是不是反過來? 畢竟沒關係,反正不要手動啟動線程,太貴了,還是用線程池吧。 很簡單,但事實並非如此。

幸運的是,Kotlin 有一個更簡單的解決方案,稱為協程。 簡而言之,協程使得以非常流暢的方式編寫異步、非阻塞代碼成為可能。 核心思想是具有可以暫停的功能; 換句話說,計算可以在某個時候暫停並稍後恢復。 最好的部分是在編寫非阻塞代碼時,編程模型並沒有真正改變,因此編寫非阻塞代碼本質上與編寫阻塞代碼相同。 讓我們看兩個例子:

 fun sendRequest(): Int { /* do some heavy work */ return 1; }

這個例子展示了一個阻塞函數。 在函數返回之前,執行此代碼片段的線程不會執行任何其他工作,如果是 API 或數據庫調用,這可能需要幾秒鐘。 我們真的不想在等待另一個服務時阻塞我們的線程,所以讓我們把這個函數變成一個非阻塞函數。

 suspend fun sendRequest(): Int { /* do some heavy work */ return 1; }

這個例子展示了我們如何將我們的方法變成一個可以被掛起的非阻塞函數。 這意味著,為簡單起見,如果繁重的工作是一個10秒的簡單delay()函數調用,則執行線程將在這段時間內繼續處理其他任務,並在 10 秒過去後繼續執行該函數。 用一個關鍵字實現的漂亮的非阻塞代碼。

使用 Ktor 的異步服務

在編寫 REST API 時,必須採取一些額外的步驟,例如啟動嵌入式服務器或解析請求,當然,沒有人願意手動完成。 Java 有 Spring Boot,這讓事情變得非常簡單,幸運的是,Kotlin 有一個名為 Ktor 的框架。 Ktor 是一個用於構建異步服務器的 Web 框架。 正如其網站所述,Ktor “易於使用、有趣且異步”。 現在,樂趣是主觀的,所以我不想證明這一點,但是,讓我們看一個證明易於使用和異步的片段。

 fun main() { embeddedServer(Tomcat, 8080) { routing { get { call.respond("Hello world!") } } }.start(wait = true) }

上面的例子展示了一個功能齊全的 Kotlin Ktor 服務器,它運行在一個嵌入式 Tomcat 服務器上,監聽 8080 端口,並以“Hello world!”異步響應。 獲取請求。 所有這些都在不到 10 行代碼中完成。

Ktor 顯然可以做的遠不止這些。 介紹 Ktor 的所有功能需要它自己的文章,但在許多方面,它使登錄和身份驗證變得容易。 在此處閱讀有關 Ktor 可以在服務器端做什麼以及如何配置它的更多信息。

Kotlin 在後端的其他好處

我想指出的第一個好處是你可以在 Kotlin 中使用 Java 庫,相信我,有很多很棒的 Java 第三方庫可以讓你的生活更輕鬆。 當有一個開源的、即用型的庫可以完美地完成這項工作時,為什麼還要編寫自己的實現呢? 將這些與 Kotlin 一起使用可以完美地工作。

Kotlin 和 Ktor 的另一個主要優勢是您可以使用的廣泛的測試庫和框架。 Junit 框架就像 Kotlin 的魅力一樣,Ktor 在此基礎上添加了自己的測試庫,允許您立即編寫端到端測試和集成測試。 您可以使用自定義測試引擎來運行您的整個應用程序,並且可以像實時應用程序一樣處理請求。

結論

正如我之前提到的,我主要是一名 Java 後端開發人員,身後有幾個服務器端應用程序和 REST API。 雖然我喜歡用 Java 編程,但我認為沒有一種最好的語言或框架可以完美地完成任何工作並且可以解決任何問題。 我的方法是盡可能多地熟悉工具,當出現問題時,選擇能夠完美解決特定問題的最佳工具。

正如 Kotlin 網站所述,Kotlin 的目標不是獨一無二; 相反,它從數十年的語言開發中汲取靈感和最佳實踐,我確實相信,在後端開發方面,Kotlin、Coroutines 和 Ktor 組成了一個了不起的三人組來完成這項工作。 您可以在此處閱讀有關 Kotlin 及其作為編程語言的實用性的更多信息。