在Micronaut 1.0.1小版本發佈的同時,Object Computing, Inc.(OCI)還發布了Micronaut for Spring 1.0 M1。在發佈說明中這樣寫到:
Micronaut for Spring添加了對Spring基於註解的編程模型的支持,這種模型已經有很長時間的歷史了,這樣所構建的Micronaut應用和庫能夠與Micronaut和Spring協作。
Micronaut for Spring採用預先編譯的方式,能夠實現如下功能:將Spring組件集成到Micronaut應用中;將Spring應用運行爲Micronaut應用;將Micronaut bean暴露給Spring應用。
Jonathan Giles是微軟的軟件工程師,最近討論了開發人員爲何應該考慮遷移至Micronaut:
在Spring Boot和MicroProfile中開發人員認爲理所應當的事情,Micronaut卻採用了一種與衆不同的方式來實現。Micronaut沒有像Spring Boot和MicroProfile那樣進行運行時的註解處理,而是使用了編譯時的註解處理器,除了你自己的代碼以外,這些處理器會編譯生成額外的類。這意味着啓動時間會大幅減低,因爲它減少了掃描項目classpath所需要的開銷。實際上,Micronaut會儘可能避免使用反射,只有在絕對必要的時候纔會使用。
Micronaut之前被稱爲Particle項目,它是一個全棧的基於JVM的框架,用於創建基於微服務的、雲原生的、serverless應用,可以使用Java、Groovy和Kotlin編寫。Graeme Rocher是OCI的首席軟件工程師、Grails和Micronaut產品的負責人,他在2018年3月的Greach會議上首次介紹了Micronaut。在實現1.0版本的過程中,Micronaut經歷了三個候選版本,這些版本之間的間隔時間都不超過三週,在此之後的2018年10月底,1.0的正式版本發佈。
樣例應用
Micronaut for Spring 倉庫中包含了一個樣例應用,該樣例闡述瞭如何使用Micronaut for Spring,同時包含了將應用轉換爲GraalVM原生鏡像的工具。
Application.java文件如下所示,在源碼層面它來源於一個Spring Boot應用,但是可以作爲Micronaut應用運行:
@SpringBootApplication public class Application { public static void main(String... args) { Micronaut.run(Application.class); // SpringApplication.run(Application.class); }
Spring Boot應用和Micronaut應用的唯一差異在第5行。第6行在這裏註釋掉了,只是用來進行對比,如果是Spring Boot應用的話,就會使用這一行的代碼了。
命令:
./gradlew bootRun
將會構建和初始Micronaut服務器,如果執行下面的命令:
curl -X GET http://localhost:8080/greeting?name=Mike
將會返回:
{"id":1,"content":"Hola, Mike!"}
GraalVM
現在,我們可以在GraalVM上運行Spring應用,它已經完全兼容Spring基於註解的編程模型。通過Micronaut for Spring,樣例應用可以轉換爲GraalVM原生鏡像。
如下的兩條命令會開始這樣的轉換過程:
./gradlew assemblejava -cp build/libs/greeting-service-all.jar io.micronaut.graal.reflect.GraalClassLoadingAnalyzer
Micronaut的GraalClassLoadingAnalyzer類會用來分析Micronaut應用的類加載需求。
GraalVM Java分發版本包括了native-image工具,它能夠構建應用的原生鏡像。在調用native-image的時候,有很多可配置參數,如下面的列表所示:
native-image --no-server \ --allow-incomplete-classpath \ --class-path build/libs/greeting-service-all.jar \ -H:ReflectionConfigurationFiles=build/reflect.json \ -H:EnableURLProtocols=http \ -H:Name=greeting-service \ -H:Class=greeting.example.Application \
在樣例應用中,包含了一個便利的shell腳本build-native-image.sh,藉助該腳本,能夠自動化這個過程。生成的原生鏡像可執行文件greeting-service可以通過如下的方式進行調用以啓動服務器:
./greeting-service
原生鏡像應用就是爲了快速啓動而設計的,它的初始化時間只有42毫秒:
相關資源:
- Jonathan Giles撰寫的使用GraalVM原生編譯Micronaut微服務實現超快啓動(2018-10-3)
- InfoQ上的全棧 JVM 框架 Micronaut 通向 1.0 版本之路(2018-10-23)
- Graeme Rocher編寫的Micronaut 1.0 GA版本發佈(2018-10-23)
查看英文原文:[Micronaut for Spring Allows Spring Boot Apps to Run as Micronaut Apps](