iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0

我們花了不少時間講 Spring Boot 這個框架,今天我們來聊聊另一個框架:Quarkus

Quarkus

Quarkus 一樣是後端開發的框架,是由 RedHat 開源的雲原生框架,主打快速 (Supersonic),小巧 (Subatomic) 的 java框架,並且很適合在雲端的環境應用。

Quarkus強調自己有以下特點:

  • 雲原生設計:專為 Kubernetes 和雲端環境打造,支援容器化應用。
  • 快速啟動與低記憶體:相較於傳統 Java 框架,能快速啟動並極大降低記憶體消耗,非常適合 Serverless 架構。
  • GraalVM 整合:支援使用 GraalVM 建立本機映像,進一步提升效能。
  • 統一的編程模型:提供反應式(Reactive)和命令式(Imperative)的編程模型,滿足不同的應用需求。
  • 多樣的程式語言支援:除了 Java,還支援 Kotlin、Scala 和 Groovy 等多種語言。
  • 豐富的擴充套件:整合了 Spring Boot、Hibernate、Kafka 等常用套件,豐富開發者的工具箱。
  • 快速迭代:開發速度快,幾乎每兩週就有新版本發布,確保框架能跟上雲原生技術的快速發展。

安裝

首先,我們可以使用 SDKMAN 安裝 quarkus 工具

sdk install quarkus

安裝好之後,我們可以使用指令工具建立專案 quarkusDemo2025

quarkus create app --gradle-kotlin-dsl quarkus2025

建立好之後,我們進去專案

cd quarkus2025

如果想跑看看專案,可以執行運作指令

quarkus dev

運行成功之後,我們進入 http://localhost:8080/ 就可以看到 Quarkus 的畫面了。

我們來看看 src/main/kotlin/org/acme/GreetingResource.kt 的程式碼

package org.acme

import jakarta.ws.rs.GET
import jakarta.ws.rs.Path
import jakarta.ws.rs.Produces
import jakarta.ws.rs.core.MediaType

@Path("/hello")
class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    fun hello() = "Hello from Quarkus REST"
}

語法和 Spring Boot 類似,都是使用 annotation class 標記路由。

ORM

quarkus 沒有自己的 ORM,所以在開發時,要搭配其他的 ORM 框架。不過 quarkus 有自己對 Hibernate ORM 的包裝套件 Panache。

安裝方式如下,加入

    implementation 'io.quarkus:quarkus-hibernate-orm-panache-kotlin'
    implementation 'io.quarkus:quarkus-jdbc-h2'

安裝好之後,就可以在 quarkus 內使用 ORM 了

跟前面的範例一樣,我們使用多對多關係的語法進行比較

import io.quarkus.hibernate.orm.panache.kotlin.PanacheEntity
import jakarta.persistence.*
import java.util.*

@Entity
class Student : PanacheEntity() {
    var name: String? = null

    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = [JoinColumn(name = "student_id")],
        inverseJoinColumns = [JoinColumn(name = "course_id")]
    )
    var courses: MutableSet<Course> = HashSet()
}

@Entity
class Course : PanacheEntity() {
    var title: String? = null

    @ManyToMany(mappedBy = "courses")
    var students: MutableSet<Student> = HashSet()
}

定義好之後,使用的方式如下

val math = Course().apply { title = "Math" }
val english = Course().apply { title = "English" }

val alice = Student().apply { 
    name = "Alice"
    courses.add(math)
    courses.add(english)
}

val bob = Student().apply {
    name = "Bob"
    courses.add(math)
}


math.persist()
english.persist()
alice.persist()
bob.persist()


val aliceFromDb = Student.find("name", "Alice").firstResult()
println("Alice's courses:")
aliceFromDb?.courses?.forEach { println(it.title) }

val mathFromDb = Course.find("title", "Math").firstResult()
println("Students in Math:")
mathFromDb?.students?.forEach { println(it.name) }

各位可以看到,利用 Panache 簡化過後的語法,和其他 Java Base 的 ORM 相比,確實比較簡單一些。

不過 ORM 這點並不是 Quarkus 最主要的特性,而是和 K8s 以及容器化服務的高度整合。

明天我們再來聊聊 quarkus 的這些特點!


上一篇
Day 17:Spring boot 和 Ktor 的非同步存取 API 寫法
下一篇
Day 19:quarkus 和雲端的整合
系列文
每天一點 Ktor 3.0:一個月學會 Kotlin 後端開發20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言