使用 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 及其作为编程语言的实用性的更多信息。