Kotless ย่อมาจาก Kotlin Serverless Framework
โฟกัสอยู่ที่การลดการสร้างการปรับใช้แบบไร้เซิร์ฟเวอร์โดยการสร้างมันโดยตรงจากรหัสของแอปพลิเคชันเอง
ดังนั้นเพียงแค่พูด Kotless ให้ปุ่ม Magic หนึ่งปุ่มเพื่อปรับใช้เว็บแอปพลิเคชันของคุณเป็นแอปพลิเคชันที่ไม่มีเซิร์ฟเวอร์บน AWS และ Azure!
Kotless ประกอบด้วยสองส่วนหลัก:
หนึ่งในคุณสมบัติที่สำคัญของ Kotless คือความสามารถในการฝังลงในแอปพลิเคชันที่มีอยู่ Kotless ทำให้การปรับใช้แอพพลิเคชั่น Spring และ KTOR ที่มีอยู่เป็นเรื่องง่ายเป็นพิเศษกับ AWS และ Microsoft Azure Serverless Platforms
Kotless ใช้ Gradle เพื่อล้อมรอบกระบวนการอาคารที่มีอยู่และแทรกการปรับใช้ลงในนั้น
พิจารณาใช้หนึ่งใน Gradle รุ่นล่าสุดโดยเริ่มจากรุ่น 7.2
โดยทั่วไปถ้าคุณใช้ Gradle อยู่แล้วคุณจะต้องทำสองสิ่งเท่านั้น
ประการแรกตั้งค่าปลั๊กอิน Kotless Gradle
คุณจะต้องบอก Gradle ว่าจะหาปลั๊กอินได้ที่ไหนโดยแก้ไข settings.gradle.kts :
pluginManagement {
resolutionStrategy {
this .eachPlugin {
if (requested.id.id == " io.kotless " ) {
useModule( " io.kotless:gradle: ${ this .requested.version} " )
}
}
}
repositories {
maven(url = uri( " https://packages.jetbrains.team/maven/p/ktls/maven " ))
gradlePluginPortal()
mavenCentral()
}
}และใช้ปลั๊กอิน:
// Imports are necessary, for this example
import io.kotless.plugin.gradle.dsl.Webapp.Route53
import io.kotless.plugin.gradle.dsl.kotless
// Group may be used by Kotless DSL to reduce the number of introspected classes by package
// So, don't forget to set it
group = " org.example "
version = " 0.1.0 "
plugins {
// Version of Kotlin should be 1.3.72+
kotlin( " jvm " ) version " 1.5.31 " apply true
id( " io.kotless " ) version " 0.2.0 " apply true
}ประการที่สองเพิ่ม Kotless DSL (หรือ KTOR หรือ Spring Boot) เป็นไลบรารีลงในแอปพลิเคชันของคุณ:
repositories {
mavenCentral()
// Kotless repository
maven(url = uri( " https://packages.jetbrains.team/maven/p/ktls/maven " ))
}
dependencies {
implementation( " io.kotless " , " kotless-lang " , " 0.2.0 " )
implementation( " io.kotless " , " kotless-lang-aws " , " 0.2.0 " )
// if you want to deploy to Microsoft Azure, just replace -aws with -azure
// implementation("io.kotless", "ktor-lang-azure", "0.2.0")
// or for Ktor (Note, that `ktor-lang` depends on Ktor version 1.5.0)
// implementation("io.kotless", "ktor-lang", "0.2.0")
// implementation("io.kotless", "ktor-lang-aws", "0.2.0")
// implementation("io.kotless", "ktor-lang-azure", "0.2.0")
// or for Spring Boot (Note, that `spring-boot-lang` depends on Spring Boot version 2.3.0.RELEASE)
// implementation("io.kotless", "spring-boot-lang", "0.2.0")
// implementation("io.kotless", "spring-boot-lang-aws", "0.2.0")
// implementation("io.kotless", "spring-boot-lang-azure", "0.2.0")
} โปรดทราบว่าหากคุณใช้ KTOR หรือ Spring Boot คุณจะต้องแทนที่ที่มีอยู่ในการพึ่งพาโครงการของคุณด้วยการพึ่งพา kotless *-lang พิเศษ นอกจากนี้หลังจากนั้นคุณจะต้องจัดแนวไลบรารีที่ขึ้นอยู่กับเวอร์ชัน (เช่น Spring Security) กับเวอร์ชันที่รวมอยู่ใน *-lang (ดูย่อหน้านี้)
สิ่งนี้จะช่วยให้คุณสามารถเข้าถึงอินเทอร์เฟซ DSL ในรหัสของคุณและตั้งค่าตัวแจกจ่ายแลมบ์ดาภายในแอปพลิเคชันของคุณ
ขึ้นอยู่กับกรณีการใช้งานคุณอาจต้องการปรับใช้แอปพลิเคชันทั้งใน AWS หรือ Microsoft Azure
โปรดทราบว่าหากคุณไม่มีบัญชีคลาวด์คุณยังสามารถใช้ kotless ในพื้นที่เพื่อเรียกใช้และดีบักแอปพลิเคชันของคุณ - เพียงใช้งาน Gradle local
หากคุณไม่มีบัญชี AWS คุณสามารถสร้างมันตามคำแนะนำง่ายๆโดย Hadi Hariri
หากคุณมีบัญชี AWS และต้องการดำเนินการปรับใช้จริง - มาตั้งค่าทุกอย่างไว้! มันค่อนข้างง่าย:
kotless {
config {
aws {
storage {
bucket = " kotless.s3.example.com "
}
profile = " example "
region = " eu-west-1 "
}
}
webapp {
dns( " kotless " , " example.com " )
}
}ที่นี่เราตั้งค่าการกำหนดค่าของ kotless ตัวเอง:
จากนั้นเราตั้งค่าแอปพลิเคชันเฉพาะเพื่อปรับใช้:
และนั่นคือการตั้งค่าทั้งหมด!
การปรับใช้กับ Microsoft Azure นั้นค่อนข้างตรงไปตรงมาและเรียบง่าย:
kotless {
config {
azure {
storage {
storageAccount = " your-storage-account "
container = " container-which-kotless-would-use "
}
terraform {
backend {
resourceGroup = " your-resource-group "
}
}
}
}
webapp {
dns( " kotless " , " example.com " )
}
}
ที่นี่เราตั้งค่าการกำหนดค่าของ kotless ตัวเอง:
จากนั้นเราตั้งค่าแอปพลิเคชันเฉพาะเพื่อปรับใช้:
และนั่นคือการตั้งค่าทั้งหมด!
ตอนนี้คุณสามารถสร้างแอปพลิเคชั่น Serverless แรกของคุณด้วย kotless DSL:
@Get( " / " )
fun main () = " Hello world! "หรือกับ ktor:
class Server : Kotless () {
override fun prepare ( app : Application ) {
app.routing {
get( " / " ) {
call.respondText { " Hello World! " }
}
}
}
}หรือด้วยการบูตฤดูใบไม้ผลิ:
@SpringBootApplication
open class Application : Kotless () {
override val bootKlass : KClass < * > = this :: class
}
@RestController
object Pages {
@GetMapping( " / " )
fun main () = " Hello World! "
}แอปพลิเคชันที่ใช้ Kotless สามารถเริ่มต้นเป็นเซิร์ฟเวอร์ HTTP ฟังก์ชั่นนี้ได้รับการสนับสนุนโดย DSL ทั้งหมด
ยิ่งไปกว่านั้นการเริ่มต้นในท้องถิ่นของ Kotless อาจทำให้เกิดการจำลอง AWS (ต้องการนักเทียบท่า) เพียงแค่สร้างอินสแตนซ์ไคลเอนต์ AWS Service ของคุณโดยใช้การแทนที่สำหรับ Kotless Local Starts:
val client = AmazonDynamoDBClientBuilder .standard().withKotlessLocal( AwsResource . DynamoDB ).build()และเปิดใช้งานใน Gradle:
kotless {
// <...>
extensions {
local {
// enables AWS emulation (disabled by default)
useAWSEmulation = true
}
}
}ในระหว่างการดำเนินการในท้องถิ่น LocalStack จะเริ่มต้นและลูกค้าทั้งหมดจะถูกชี้ไปที่จุดสิ้นสุดโดยอัตโนมัติ
ฟังก์ชั่นการเริ่มต้นในพื้นที่ไม่จำเป็นต้องมีการเข้าถึงผู้ให้บริการคลาวด์ดังนั้นคุณสามารถตรวจสอบว่าแอปพลิเคชันของคุณทำงานอย่างไรโดยไม่มีบัญชี AWS นอกจากนี้ยังช่วยให้คุณมีความเป็นไปได้ในการดีบักแอปพลิเคชันของคุณในพื้นที่จาก IDE ของคุณ
Kotless สามารถปรับใช้แอปพลิเคชัน Spring Boot หรือ KTOR ที่มีอยู่ไปยังแพลตฟอร์ม AWS Serverless ในการทำเช่นนั้นคุณจะต้องตั้งค่าปลั๊กอินและแทนที่การพึ่งพาที่มีอยู่ด้วย DSL Kotless ที่เหมาะสม
สำหรับ KTOR คุณควรแทนที่เอ็นจิ้นที่มีอยู่ (เช่น implementation("io.ktor", "ktor-server-netty", "1.5.0") ) ด้วย implementation("io.kotless", "ktor-lang", "0.1.6") โปรดทราบว่าการรวมกลุ่ม KTOR ของรุ่น 1.5.0 ดังนั้นคุณอาจต้องอัพเกรดไลบรารี KTOR อื่น ๆ (เช่น ktor-html-builder ) เป็นเวอร์ชันนี้
สำหรับ สปริงบูต คุณควรเปลี่ยนสตาร์ทเตอร์ที่คุณใช้ (เช่น implementation("org.springframework.boot", "spring-boot-starter-web", "2.3.0.RELASE) 2.4.2 ด้วย implementation("io.kotless", "spring-boot-lang", "0.1.6") เวอร์ชันนี้
เมื่อเสร็จแล้วคุณอาจเข้าใช้งาน deploy และทำให้แอปพลิเคชันของคุณไม่มีเซิร์ฟเวอร์ โปรดทราบว่าคุณจะยังคงสามารถเรียกใช้แอปพลิเคชันท้องถิ่นผ่านงาน Gradle local
ในขณะที่ Kotless สามารถใช้เป็นกรอบสำหรับการสร้างแอพพลิเคชั่นที่ไม่มีเซิร์ฟเวอร์อย่างรวดเร็ว แต่ก็มีคุณสมบัติอื่น ๆ อีกมากมายที่ครอบคลุมพื้นที่ต่าง ๆ ของแอปพลิเคชัน
รวมถึง แต่ไม่ จำกัด เพียง:
@Scheduled Jobs ตามกำหนดเวลาKotless อยู่ในระหว่างการพัฒนาที่ใช้งานอยู่ดังนั้นเราจึงกำลังทำงานเพื่อขยายรายการนี้ด้วยคุณสมบัติเช่น:
คำอธิบายใด ๆ จะดีขึ้นมากด้วยตัวอย่างที่เหมาะสม
ในโฟลเดอร์ examples ของที่เก็บคุณสามารถค้นหาตัวอย่างโครงการที่สร้างด้วย kotless DSL:
kotless/site - เว็บไซต์เกี่ยวกับ Kotless เขียนด้วย kotless dsl (site.kotless.io) ตัวอย่างนี้แสดงให้เห็นถึงการใช้งาน @StaticGet และ @Get (เส้นทางคงที่และแบบไดนามิก) รวมถึงลิงก์ APIkotless/shortener - ตัวย่อ URL ง่าย ๆ ที่เขียนด้วย kotless DSL (short.kotless.io) ตัวอย่างนี้แสดงให้เห็นถึง @Get (เส้นทางไดนามิก), @Scheduled (Lambdas ที่กำหนดเวลา), Permissions API (สำหรับการเข้าถึง DynamoDB) และส่วนขยาย Terraformมีตัวอย่างที่คล้ายกันสำหรับ KTOR:
ktor/site - เว็บไซต์เกี่ยวกับ kotless เขียนด้วย ktor (ktor.site.kotless.io) ตัวอย่างนี้แสดงให้เห็นถึง static {...} และ routing {...} การใช้งานktor/shortener - ตัวย่อ URL ที่เรียบง่ายเขียนด้วย KTOR (ktor.short.kotless.io) ตัวอย่างนี้แสดงให้เห็นถึง routing { ... } (เส้นทางไดนามิก), การอนุญาต API (สำหรับการเข้าถึง DynamoDB) และส่วนขยาย Terraformและสำหรับการบูตฤดูใบไม้ผลิ:
spring/site - เว็บไซต์เกี่ยวกับ Kotless เขียนด้วย Spring Boot (Spring.site.kotless.io) ตัวอย่างนี้แสดงให้เห็นถึงการใช้สถิติและ @RestControllerspring/shortener - ตัวย่อ URL แบบง่ายที่เขียนด้วย Spring Boot (Spring.Short.kotless.io) ตัวอย่างนี้แสดงให้เห็นถึงการใช้งานของ @RestController (เส้นทางไดนามิก), Permissions API (สำหรับการเข้าถึง DynamoDB) และส่วนขยาย Terraform คุณอาจดูวิกิที่เอกสารของลูกค้าใน Kotless ตั้งอยู่
นอกเหนือจากนั้นรหัส Kotless นั้นได้รับการบันทึกไว้อย่างกว้างขวางและคุณสามารถดูอินเทอร์เฟซเพื่อทำความรู้จักกับ Kotless ได้ดีขึ้น
คุณอาจถามคำถามและมีส่วนร่วมในการอภิปรายใน #kotless Channel ใน Kotlinlang Slack
ขอขอบคุณเป็นพิเศษ: