【使用Kotlin的服务器端】通过应用Spring Boot和使用Jib创建容器镜像

首先

为什么选择Server Side Kotlin?

    • 言語自体の先進性、生産性の高さ(シンプルな構文、Nullable)

 

    • Java開発環境(特にIntelliJ)があれば、ほとんど障壁なく導入可能

 

    • Javaの資産流用、相互運用が非常に簡単

Javaで使っていたフレームワークがそのまま使えるなどJavaのスキルスタックを活用可能

GoogleがAndoroidアプリの公式開発言語とすることを発表(2017年)

→Android アプリ開発とのスキルセット共通化

参考资料:

    Kotlin公式サイト

Jib是什么意思?

这是一个能将Google发布的Java应用程序进行容器化的工具。

作为专长,开发容器化方面的工作如Dockerfile的创建大幅减少。
构建镜像无需使用Docker。
创建符合最佳实践的容器镜像。

基于Google发布的用于生产的基础镜像distoless,构建image。

引用:

distrolessイメージを使って、ランタイムDockerイメージを作ってみる

昨年私がまとめた内容です。(この時から比べるとjavaとccのイメージが正式にプロダクション向けになりました)

Jib github page
Googleが公開しているJib紹介スライド

这篇文章所设想的环境

    • Mac OS

 

    • IntelliJ IDEA (2019.1)

Kotlin plugin (v1.3.31)

openjdk 1.8.0_201
Spring Boot 2.1.4
Jib gradle plugin 1.2.0
Docker (18.09.2)

由于我希望将本地的Docker镜像注册到远程容器仓库,请先安装Docker。但如果要将其注册到远程容器仓库,则应该是不必要的。

操作步骤

[前期准备] 1. 创建 Kotlin × Spring Boot 项目

使用Spring Boot创建一个Kotlin项目。

由于Spring Initialzr支持Kotlin,因此您可以非常轻松地获得模板项目。

请访问 https://start.spring.io/

    • Gradle

 

    • Kotlin

 

    Spring Boot 2.1.4

选择。

请键入每个人的组名和Artifact名。

本次我们选择了以下配置:
– 组织:com.example
– 项目:kotlindemo

点击「生成项目」后,将会下载一个压缩文件。解压并导入到IntelliJ中。

现在,Kotlin基础的Spring Boot应用程序项目已经完成了。

[前准备] 2. 添加控制器 2. qì

在当前的状态下,由于没有任何API存在,我们需要添加一个。

这次我们将添加一个返回示例响应的控制器。

首先,由于我想使用REST相关的注解,我会将spring-boot-starter-web添加到依赖库中。

--- a/build.gradle
+++ b/build.gradle
@@ -20,6 +20,7 @@ dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        implementation 'org.jetbrains.kotlin:kotlin-reflect'
        implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
+       implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
 }

因为添加了依存关系,所以先进行构建。(快捷键Command + F9)

然后,我们将添加一个控制器来返回样本的响应。

示例控制器.kt

package com.example.kotlindemo

import org.springframework.web.bind.annotation.RestController
import org.springframework.web.bind.annotation.GetMapping


@RestController
class SampleController {

    @GetMapping("sample")
    fun sample(): HashMap<String, String> {
        val sample = HashMap<String, String>()
        sample.put("name", "test_name")
        sample.put("id", "test")
        return sample
    }
}

使用的注解与在Java中实现时相同,对吗?

这样/sample的REST API应该已经完成了。

我会在IntelliJ中进行调试来确认一下。
在我的情况下,我把Artifact命名为kotlindemo,
所以有一个名为“KotlindemoApplication”的调试配置被注册了。

执行这个操作后,使用curl命令来检查/sample API。

curl localhost:8080/sample

执行结果:

{“name”:”测试名称”,”id”:”测试”}

这是一个REST API示例的完成。

3. 添加 Jib,并创建容器镜像

在 build.gradle 文件中添加 Jib 插件,并补充相关配置。

--- a/build.gradle
+++ b/build.gradle
@@ -4,6 +4,7 @@ plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE'
    id 'org.jetbrains.kotlin.jvm' version '1.2.71'
    id 'org.jetbrains.kotlin.plugin.spring' version '1.2.71'
+   id 'com.google.cloud.tools.jib' version '1.2.0'
 }

 apply plugin: 'io.spring.dependency-management'
@@ -12,6 +13,9 @@ group = 'com.example'
 version = '0.0.1-SNAPSHOT'
 sourceCompatibility = '1.8'

+// jib configuration
+jib.container.useCurrentTimestamp = true // jibで作成されるイメージの作成時間を現在時刻とする
+
 repositories {
    mavenCentral()
 }

构建项目,并安装Jib。(我应该把它设为自动构建。。)

使用以下命令,创建图像并将其注册为本地Docker图像。

./gradlew jibDockerBuild

如果你想要将远程仓库推送到https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin#quickstart,似乎需要按照这个链接上的指示进行设置。

接下来,我们将启动图像并进行确认。

docker run --rm -p 8080:8080 kotlindemo:0.0.1-SNAPSHOT

容器日志


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.4.RELEASE)

2019-05-15 02:26:04.665  INFO 1 --- [           main] c.e.kotlindemo.KotlindemoApplicationKt   : Starting KotlindemoApplicationKt on c6df41f5d4a3 with PID 1 (/app/classes started by root in /)
2019-05-15 02:26:04.671  INFO 1 --- [           main] c.e.kotlindemo.KotlindemoApplicationKt   : No active profile set, falling back to default profiles: default
2019-05-15 02:26:05.154  WARN 1 --- [kground-preinit] o.s.h.c.j.Jackson2ObjectMapperBuilder    : For Jackson Kotlin classes support please add "com.fasterxml.jackson.module:jackson-module-kotlin" to the classpath
2019-05-15 02:26:06.928  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-05-15 02:26:06.998  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-05-15 02:26:06.998  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.17]
2019-05-15 02:26:07.244  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-05-15 02:26:07.244  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2494 ms
2019-05-15 02:26:08.528  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-05-15 02:26:08.965  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-05-15 02:26:08.973  INFO 1 --- [           main] c.e.kotlindemo.KotlindemoApplicationKt   : Started KotlindemoApplicationKt in 4.958 seconds (JVM running for 5.682)
2019-05-15 02:26:40.980  INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-05-15 02:26:40.980  INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-05-15 02:26:40.993  INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 13 ms

启动成功!curl也能够通行了。

结束

我将Spring Boot应用程序应用于Kotlin项目,并尝试使用Jib来将该应用程序容器化,以便创建REST API应用程序。

听说国内也有采用Kotlin作为服务器端的案例,而且引入也非常简单,确实让人可以点头认同。

广告
将在 10 秒后关闭
bannerAds