【使用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作为服务器端的案例,而且引入也非常简单,确实让人可以点头认同。