全棧JVM框架Micronaut通向1.0版本之路
經過一年的發展,隨著ofollow,noindex" target="_blank">Object Computing (OCI)釋出候選版本RC1 、RC2 和RC3 ,Micronaut 1.0 在過去三週內加速了。Micronaut是一個基於JVM的全棧框架,用於建立可以用Java、Groovy和Kotlin編寫的基於微服務的應用程式。
在今年早些時候的Greach大會 上,OCI首席軟體工程師Graeme Rocher 和Grails&Micronaut產品主管介紹 了Microaut。隨後,在5月底,Micronaut 開放了原始碼。
三個候選版本包括以下新特性:GraalVM 本地映象支援、Swagger (OpenAPI)編譯時支援、編譯時驗證以及編譯時對映註解。Micronaut的測試框架Micronaut Test 1.0 RC1 也是在RC3中釋出的。
Micronaut使用了依賴注入和預編譯(AOT)。以下是來自其網站 的介紹:
基於反射的IoC框架為程式碼中的每個欄位、方法和建構函式載入和快取反射資料,而使用Micronaut,應用程式的啟動時間和記憶體消耗將不受程式碼庫大小的限制。
以Netty 為基礎,Micronaut提供了他們自己的非阻塞Web伺服器。為了減少記憶體消耗,Micronaut反應式客戶端可以用宣告的方式構建,並在編譯時實現。
“配置檔案(Profiles)”
Micronaut內建了幾個配置檔案 ,用於生成可以執行的應用程式框架,作為開發Web或命令列應用程式的構建塊。每個配置檔案由一個模板和特定於該配置檔案的附加命令組成。例如,create-app 啟動服務的配置檔案,其中包含用於構建控制器(create-controller )和客戶端(create-client )類的附加命令,這些命令在其他配置檔案中可能不可用。
入門
在下載並安裝Micronaut 之後,可以通過命令列或Microaut shell 建立應用程式。受到Grails 中人們熟知的命令列介面的啟發,Micronaut遵循了同樣的應用程式建立概念。考慮以下命令:
$ mn create-app org.redlich.demo
如下所示,這將建立一個Java應用程式和Gradle專案,根資料夾為demo ,包名為org.redlich 。
注意,其中包含了測試目錄結構、Dockerfile和YAML配置檔案。檔案micronaut-cli.yml 提供了關於專案的具體資訊:
profile: service
defaultPackage: org.redlich
---
testFramework: junit
sourceLanguage: java
生成的Java原始碼檔案Application.java 啟動了一個Micronaut伺服器:
package org.redlich;
import io.micronaut.runtime.Micronaut;
public class Application {
public static void main(String[] args) {
Micronaut.run(Application.class);
}
}
構建並執行這個初步應用:
$ ./gradlew run
向上面的專案中新增一個控制器:
$ mn create-controller HelloController
如下所示,檔案HelloController.java 和HelloControllerTest.java 被新增到專案。
在生成的HelloController.java 檔案中,注意下@Controller 註解中的端點如何根據HelloController 控制器的名稱命名為“/hello ”:
package org.redlich;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.HttpStatus;
@Controller("/hello")
public class HelloController {
@Get("/")
public HttpStatus index() {
return HttpStatus.OK;
}
}
Java和Gradle是預設的語言和構建工具。要生成Groovy和Kotlin應用程式,請執行下面的命令:
$ mn create-app org.redlich.demo --lang groovy
$ mn create-app org.redlich.demo --lang kotlin
也支援生成Maven專案:
$ mn create-app org.redlich.service --build maven
$ ./mvnw compile exec:exec
在Micronaut教程第一部分中,OCI軟體工程師Sergio del Amo Caballero 演示瞭如何使用Java、Groovy和Kotlin三種語言建立三個微服務。Rocher向InfoQ介紹了這個最新版本。
InfoQ:是什麼促使OCI開發了這個新的微服務框架?
Graeme Rocher: 在過去的幾年裡,技術領域發生了巨大的變化,特別地,如果你看看類似Docker、Kubernetes這樣的系統以及無伺服器運動,你會發現,它們實際上都針對低記憶體微服務和低開銷應用程式而進行了優化。其結果是,像Go和Node這樣的語言在這些平臺上體現出了比Java更顯著的吸引力,因為它們具有出色的冷啟動效能和記憶體消耗。有一個非常好的問題,可以問下自己,如果Docker和Kubernetes團隊有各種技術選項,為什麼要選擇Go而不是Java來實現這些平臺?在我看來,答案很簡單:如果他們用Java編寫了那些技術棧,並且有了今天這些技術選項,那麼我們就都需要一臺超級計算機才能讓筆記本電腦在本地執行它們。
原因是多種多樣的。一方面是語言層面的限制。JVM是一項驚人的技術成果,但對於短時間執行的操作(如無伺服器函式),它提供的優化往往就不存在了,但是,你仍然需要拖著整個JVM來執行你的應用程式。像GraalVM這樣的專案有可能通過將Java應用程式編譯成本地映象來解決這些限制,但是,坦率地說,框架設計人員在提高Java應用程式的效率方面有很大的作用。
在框架層,傳統的JVM框架(如Spring和Java/Jakarta EE)已經有超過10年的歷史了,那時,每個人都在部署單體應用程式,它們主要是圍繞著反射和註解的執行時分析來構建。這種方法的問題在於,由於各種各樣的問題,從型別擦除,到有限的註解API,再到反射邏輯的相對緩慢,所以,幾乎不可能構建一個Java框架,啟動速度超快,而記憶體消耗超低。框架執行時的負擔是巨大的。如果你觀察一下Spring在執行時所做的工作,就會發現這有些不可思議,從用ASM解析位元組程式碼來生成註解元資料,到積極快取反射資訊以避免不可避免的重複讀取減慢速度。在快取所有這些執行時生成的資訊與實現快速啟動和低記憶體消耗的目標之間存在著不可調和的衝突。
我們相信,Micronaut是面向未來的框架的基礎,通過消除所有反射的使用,以及在編譯時通過一組註解處理器和執行預編譯(AOT)的AST轉換,生成所有註解元資料、代理和框架基礎設施,消除這種矛盾。這使得Micronaut能夠實現極快的啟動速度、低記憶體消耗,並且實現與GraalVM本地映象相容性的重大改進。
當然,Java生態系統有大量的專案是基於Java的,像Spring、Kafka、Cassandra、Hadoop、Grails等,它還有一個豐富的語言生態系統,包括Groovy、Scala、Kotlin、Java、Clojure等。因此,這也不全是和低記憶體佔用的微服務與無伺服器應用程式有關,有許許多多的工作負載仍然受益於JVM和JIT。然而,即使對於這些工作負載,我們也相信,通過在啟動時間和記憶體消耗方面比其他框架更高效,Micronaut可以提供很多東西。
InfoQ:你們有計劃在Micronaut中支援JVM語言Scala和/或Clojure嗎?
Rocher::我們在構建Micronaut時已經考慮了多種語言,實際上,我們現在已經通過為每種語言建立一個公共的AST來支援Java、Kotlin和Groovy。我們計劃在某個時候通過Scala編譯器外掛(參見這裡 )新增Scala支援,不過,如果Scala社群有人希望幫助我們加速這個過程,我們很樂意聽取他們的建議。Clojure很有趣,關於如何實現Clojure支援,我們當然需要Clojure社群的輸入。
InfoQ:既然GraalVM支援非JVM語言,是不是有一天可以使用GraalVM支援的語言構建Micronaut應用程式?
Rocher:我想可以肯定,它將促成“挎鬥模式(sidecars)”,並且更容易與其他語言一起整合到一個Micronaut應用程式中。
InfoQ:您預計Micronaut正式版會在何時釋出?
Rocher:Micronaut 1.0正式版將於10月23日釋出。
InfoQ:Micronaut的路線圖是什麼樣子,尤其是在正式版本釋出之後?
Rocher:Micronaut 1.0就是要建立一個穩定的基線。由於Micronaut使用AOT編譯,所以預編譯元資料格式需要一個穩定的1.0版本。一旦1.0釋出,我們計劃與更多的技術(如RabbitMQ、Kubernetes、GRPC、GraphQL等)進行整合。