发布于 2026-01-06 0 阅读
0

发布服务器端 Kotlin 应用程序:Ktor on Heroku

发布服务器端 Kotlin 应用程序:Ktor on Heroku

将应用交付给首批用户是最棒的感觉。看到他们第一次试用应用,并收集他们的反馈以改进未来的应用,对我来说总是很有成就感。对于服务器端应用来说,这通常意味着将应用部署到某个地方——发布到网络上。

今天我想分享一种将使用 Ktor 构建的 Kotlin 应用程序快速部署到 Web 上的方法:使用Heroku

作为PaaS(平台即服务),Heroku负责大部分管理任务,让我们无需操心。例如,保持平台更新和安全,管理网络堆栈等等。

我个人很喜欢 Heroku,因为他们的免费套餐意味着我可以零成本发布应用。而且,我的应用从一开始就运行在云端,这真是太棒了!😉🌩

如果您也想学习如何直接从本地 Git 存储库部署 Kotlin 应用程序,请花10 分钟时间,让我指导您完成在 Heroku 上部署您的第一个 Kotlin 应用程序的步骤!

注册 Heroku 并设置 Heroku CLI 🛠

在创建 Kotlin 演示应用之前,最好先搭建好环境——首先是注册一个 Heroku 账号。只需访问 http://signup.heroku.com/ 即可完成注册。Heroku默认提供的免费套餐(即使有一些限制)也完全满足我们的需求,因此无需添加任何支付信息。

Heroku 注册页面

创建帐户后,我们接下来安装Heroku 命令行界面 (CLI),这将允许我们创建和管理 Heroku 应用程序。

Heroku CLI 的安装说明在不同操作系统上略有不同,因此最好按照Heroku 网站上的官方最新说明进行设置。

为了验证我们的安装是否成功,并使用我们前面创建的帐户对 CLI 进行身份验证,我们heroku在终端上运行一次该命令,并按照屏幕上的说明进行操作。

完成这一一次性设置步骤后,我们就可以准备申请材料了!

Heroku CLI

正在创建我们的 Ktor 应用 ✨

让我们创建一个简单的示例应用程序,之后我们会对其进行配置以便部署。如果您已经有了自己的 Ktor 项目并希望将其部署到 Heroku,可以直接跳到下一节。

使用 Ktor 创建新的 Kotlin 项目有多种简便方法。例如,我们可以使用在线的Ktor 项目生成器,或者Ktor IntelliJ IDEA 插件——实际上,这两个工具甚至提供了相同的配置选项。在本示例中,我们将通过Ktor IntelliJ IDEA 插件配置项目,安装后,可以通过“文件”|“新建…”|“项目”访问该插件。

要跟随代码片段进行操作,请为项目启用“Gradle Kotlin DSL”选项,并添加“路由”功能。

Ktor 项目向导

在接下来的页面中,我们输入我们选择的项目名称和工件 ID。

Gradle 导入完成后,我们实际上已经拥有了一个由 Ktor 驱动的、可直接运行的“Hello World”项目。我们可以通过导航到目录Application.kt中的文件来查看其源代码src,其中应该会看到类似这样的内容:

fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
    routing {
        get("/") {
            call.respondText("HELLO WORLD!", contentType = ContentType.Text.Plain)
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

正如我们所见,这个简单的 Ktor 程序定义了一条路由,它用单词/响应 HTTP请求GETHELLO WORLD!

按下 ,然后按下主函数旁边边栏中的“运行”按钮,并导航到http://localhost:8080/,我们就可以在本地试用该应用程序了:

你好世界

现在,是时候配置我们的小应用程序,使其在 Heroku 云上运行了!

正在配置 Ktor 应用程序以部署到 Heroku ⚙️

要将我们的应用程序部署到 Heroku,我们的应用程序需要完成三件事:

  • 它应该遵循PORT环境变量:启动我们的应用程序时,Heroku会为我们的应用程序分配一个端口来监听传入的请求,然后Heroku 的路由器会负责将 HTTP 流量通过该端口传输到我们的应用程序。
  • 它应该提供一个stage任务:当我们部署应用程序时,Heroku 会运行名为 Gradle 的任务,stage将我们的程序转换为可执行文件。
  • 它应该提供一个Procfile:当 Heroku 启动我们的应用程序来处理传入的请求时,此文件指定将要运行的命令——在我们的例子中,是启动已编译的应用程序。

PORT 环境变量

我们很幸运——Ktor 向导生成的应用程序已经配置好,可以遵循PORT环境变量。我们可以在项目目录中看到这一点。这个application.confHOCON文件负责应用程序的基本行为。正如我们所见,它将应用程序的默认端口设置为 8080,并可在环境变量存在时选择性地使用环境变量的内容覆盖默认端口:resourcesPORT

ktor {
   deployment {
       port = 8080
       port = ${?PORT}
   }
   application {
       modules = [ io.sebi.ApplicationKt.module ]
   }
}
Enter fullscreen mode Exit fullscreen mode

这正是我们想要的:在本地开发时,我们的应用程序总是被分配相同的端口(8080),而当部署到设置了环境变量的系统PORT(如 Heroku)时,平台设置会得到尊重。

Gradlestage任务

在将任何类型的应用程序部署到 Heroku 时,该平台都会运行一个所谓的构建包(buildpack) ——一个将项目源代码转换为最终在 Heroku 平台上运行的可执行文件的工具。对于Gradle应用程序,Heroku 的构建包会寻找一个stage任务来从我们的代码创建可执行工件。幸运的是,预配置的 Gradle应用程序插件已经包含了一个名为 `buildpack` 的任务installDist,它正是执行此操作的。

我们只需要为该installDist任务创建一个名为 `<alias_name>` 的别名stage。如果您已按照教程前面的建议选择了 Gradle Kotlin DSL,则只需将以下代码片段添加到项目build.gradle.kts文件的末尾即可:

tasks.create("stage") {
   dependsOn("installDist")
}
Enter fullscreen mode Exit fullscreen mode

程序简介

Heroku 的Procfile 机制告诉平台在我们的应用程序启动时应该执行哪个应用程序。

本质上,我们希望将此文件指向stage任务生成的输出,该任务是我们上一步中设置的。当 Procfile 被调用时,我们的stage任务将构建应用程序并在其中创建一个启动脚本build/install/projectName/bin/projectName。我们只需指向此脚本即可运行应用程序。

在项目根目录下,创建一个名为 `.py` 的文件,并向Procfile其中添加以下内容(将projectName`<project_name>` 替换为我们的项目名称):

web: ./build/install/projectName/bin/projectName
Enter fullscreen mode Exit fullscreen mode

(如果您不记得项目的具体名称,可以查看一下settings.gradle.kts,或者运行stage一次任务,然后查看其中的文件夹结构build/install。)

我们的应用程序现在已经设置好,可以部署到 Heroku 上了!目前,我们距离应用程序正式发布只差实际的部署过程了。

实际部署我们的应用程序📦

设置本地 Git 仓库

将应用程序源代码部署到 Heroku 的主要方法是通过 Git。最简单的方法是使用本地 Git 仓库。然后,我们可以利用 Heroku CLI 将其链接到指定的heroku远程仓库,这将触发云端的构建和部署流程。

为了将所有内容连接起来,我们首先需要为项目创建一个本地仓库,这可以直接在 IntelliJ IDEA 中使用命令 `VCS | Enable Version Control Integration...` 完成。

启用 VCS 集成

接下来,我们将项目提交到本地。在 IntelliJ IDEA 中,导航到左侧的“提交”工具窗口,然后提交所有未版本化的文件。(无需手动排除 `<path>`/build或 ` /idea<folder>` 文件夹——Ktor 项目向导已经自动.gitignore为我们生成了一个文件来处理它们。)

IntelliJ IDEA提交窗口

创建 Heroku 应用并部署!🚀

快完成了!剩下的就是创建一个Heroku 应用,我们的新应用将托管在其中。我们使用 IntelliJ IDEA 内置终端(或者您选择的其他终端)中的 Heroku CLI 来设置应用,只需在项目根目录下执行以下命令:

heroku create myprojectname
Enter fullscreen mode Exit fullscreen mode

几秒钟后,终端命令应该退出,并确认我们的项目已成功创建——包括项目将在几分钟后显示的 URL 预览。

Creating ⬢ myprojectname... done
https://myprojectname.herokuapp.com/ | https://git.heroku.com/myprojectname.git
Enter fullscreen mode Exit fullscreen mode

该命令在后台执行了两项我们应该关注的操作:

现在,我们可以开始部署了:我们将上一节中提交的代码推送到新添加的herokuGit 远程仓库。在 IntelliJ IDEA 中,我们可以通过 VCS | Git | Push… 来完成此操作。

在 IntelliJ IDEA 中推送窗口

确认推送后,我们就可以坐等应用程序上线了!

这次推送操作可能会比您以往经历的要慢一些,因为 Heroku 会在推送的同时远程构建我们的应用程序。如果您想了解进度,可以打开 IntelliJ IDEA 底部的“Git”工具窗口,查看后台运行情况。

如果一切按计划进行,您将在日志中看到确认消息:

remote:        BUILD SUCCESSFUL in 1m 34s        
remote:        6 actionable tasks: 6 executed        
remote: -----> Discovering process types        
remote:        Procfile declares types -> web        
remote: 
remote: -----> Compressing...        
remote:        Done: 64.3M        
remote: -----> Launching...        
remote:        Released v3        
remote:        https://myprojectname.herokuapp.com/ deployed to Heroku        
remote: 
remote: Verifying deploy... done.  
Enter fullscreen mode Exit fullscreen mode

我们可以在此日志中看到项目的 URL。点击此链接,即可看到我们的应用程序在云端完美运行。快叫上你的朋友,在手机上打开链接,并告诉远在全国各地的亲戚朋友点击链接——你已经成功将 Kotlin 应用程序部署到万维网上了!

你好,Heroku!

接下来会发生什么?

现在我们已经完成了在 Heroku 上部署 Ktor 应用程序的设置,接下来我们将使用一个简单的流程将新的更改发布到 Web 上:

  • 做出改变
  • 做出改变
  • 推动变革heroku master

……只需一两分钟,我们的更改就会发布。

如果我们计划与他人协作,可能需要将项目分享到 GitHub 上。在这种情况下,我们可以简单地在 GitHub 上创建一个空仓库,将其添加为远程仓库,然后像往常一样推送更改。

如果我们想更进一步,可以使用Heroku 的 GitHub 集成,这样每次我们向 GitHub 推送代码时,Kotlin 应用程序的部署都会自动完成。有了这个功能,我们就拥有了一种便捷的持续交付 (CD)方式。

当然,Heroku 平台和我们的服务器端 Kotlin 应用还有很多值得探索的地方。Heroku 的“插件”页面允许我们为应用添加各种不同的服务,这些服务可以在代码中使用。虽然其中许多是付费插件,但许多热门服务也提供免费的“开发者”层级,因此您可以尽情尝试。如果您想更精细地控制平台上的 JVM 执行环境,可以探索与 JDK 和 JVM 相关的调整,例如提供一个system.properties文件来指定运行应用的不同 Java 版本。

感谢阅读!

感谢您坚持看到最后!希望这篇教程对您有所帮助。如果您有任何问题或想听我讲解接下来的内容,请告诉我!

文章来源:https://dev.to/kotlin/publishing-server-side-kotlin-applications-ktor-on-heroku-2ce4