Micronaut框架的簡單使用介紹
什么是Micronaut
Micronaut是一個基于JVM的框架,用于構(gòu)建輕量級、模塊化的應(yīng)用程序。Micronaut是由創(chuàng)建Grails的同一家公司OCI開發(fā)的最新框架,旨在使創(chuàng)建微服務(wù)變得快速和簡單。
雖然Micronaut包含一些類似于Spring等現(xiàn)有框架的特性,但它也有一些新特性使它與眾不同。通過對Java、Groovy和Kotlin的支持,它提供了多種創(chuàng)建應(yīng)用程序的方法。
主要特點(diǎn)
Micronaut最令人興奮的特性之一是它的編譯時依賴注入機(jī)制。大多數(shù)框架使用反射和代理在運(yùn)行時執(zhí)行依賴注入。然而,Micronaut在編譯時構(gòu)建其依賴注入數(shù)據(jù)。結(jié)果是更快的應(yīng)用程序啟動和更小的內(nèi)存占用。
另一個特性是它對客戶端和服務(wù)器的反應(yīng)式編程的一流支持。由于RxJava和projectreactor都受支持,所以特定的反應(yīng)式實(shí)現(xiàn)的選擇權(quán)留給了開發(fā)人員。
Micronaut還具有一些特性,使其成為開發(fā)云本地應(yīng)用程序的優(yōu)秀框架。它支持多種服務(wù)發(fā)現(xiàn)工具,如Eureka和consur,還可以與不同的分布式跟蹤系統(tǒng)(如Zipkin和Jaeger)一起使用。
它還提供了對創(chuàng)建AWS lambda函數(shù)的支持,使得創(chuàng)建Serverless無服務(wù)器應(yīng)用程序變得容易。
入門
最簡單的入門方法是使用SDKMAN:
> sdk install micronaut 1.0.0.RC2
這將安裝我們構(gòu)建、測試和部署Micronaut應(yīng)用程序所需的所有二進(jìn)制文件。它還提供Micronaut CLI工具,使我們能夠輕松地啟動新項目。
在下面的部分中,我們將介紹框架的一些特性。
依賴注入
如前所述,Micronaut在編譯時處理依賴注入,這與大多數(shù)IoC容器不同。
但是,它仍然完全支持JSR-330注釋,因此使用bean與其他IoC框架類似。
為了將bean自動連接到我們的代碼中,我們使用@Inject:
@Inject private EmployeeService service;
@Inject注釋的工作方式與@Autowired類似,可以用于字段、方法、構(gòu)造函數(shù)和參數(shù)。
默認(rèn)情況下,所有bean的作用域都是一個原型。我們可以使用@singleton快速創(chuàng)建單例bean。如果多個類實(shí)現(xiàn)相同的bean接口,@Primary可以用來消除它們之間的沖突:
@Primary @Singleton public class BlueCar implements Car {}
當(dāng)bean是可選的時,可以使用@Requires注釋,或者僅當(dāng)滿足某些條件時才執(zhí)行自動連接。
在這方面,它的行為非常類似于Spring Boot@Conditional注解:
@Singleton @Requires(beans = DataSource.class) @Requires(property = "enabled") @Requires(missingBeans = EmployeeService) @Requires(sdk = Sdk.JAVA, value = "1.8") public class JdbcEmployeeService implements EmployeeService {}
構(gòu)建HTTP服務(wù)器
現(xiàn)在讓我們看看如何創(chuàng)建一個簡單的HTTP服務(wù)器應(yīng)用程序。首先,我們將使用SDKMAN創(chuàng)建一個項目:
> mn create-app hello-world-server -build maven
這將在名為helloworld server的目錄中使用Maven創(chuàng)建一個新的Java項目。在這個目錄中,我們將找到主要的應(yīng)用程序源代碼、Maven POM文件和項目的其他支持文件。
默認(rèn)應(yīng)用程序非常簡單:
public class ServerApplication { public static void main(String[] args) { Micronaut.run(ServerApplication.class); } }
阻塞HTTP
就其本身而言,這個應(yīng)用程序不會有太大的作用。讓我們添加一個具有兩個端點(diǎn)的控制器。兩者都將返回問候語,但其中一個將使用GET HTTP動詞,另一個將使用POST:
@Controller("/greet") public class GreetController { @Inject private GreetingService greetingService; @Get("/{name}") public String greet(String name) { return greetingService.getGreeting() + name; } @Post(value = "/{name}", consumes = MediaType.TEXT_PLAIN) public String setGreeting(@Body String name) { return greetingService.getGreeting() + name; } }
反應(yīng)式IO
默認(rèn)情況下,Micronaut將使用傳統(tǒng)的阻塞I/O實(shí)現(xiàn)這些端點(diǎn)。但是,我們可以通過將返回類型更改為任何反應(yīng)性非阻塞類型來快速實(shí)現(xiàn)非阻塞端點(diǎn)。
例如,對于RxJava,我們可以使用Observable。同樣,在使用Reactor時,我們可以返回Mono或Flux數(shù)據(jù)類型:
@Get("/{name}") public Mono<String> greet(String name) { return Mono.just(greetingService.getGreeting() + name); }
對于阻塞和非阻塞端點(diǎn),Netty都是用于處理HTTP請求的底層服務(wù)器。
通常,請求在啟動時創(chuàng)建的主I/O線程池中處理,使它們阻塞。
但是,當(dāng)從控制器端點(diǎn)返回非阻塞數(shù)據(jù)類型時,Micronaut使用Netty事件循環(huán)線程,使整個請求成為非阻塞的。
構(gòu)建HTTP客戶端
現(xiàn)在讓我們構(gòu)建一個客戶機(jī)來使用剛剛創(chuàng)建的端點(diǎn)。Micronaut提供兩種創(chuàng)建HTTP客戶端的方法:
- 聲明性HTTP客戶端
- 可編程的HTTP客戶機(jī)
聲明性HTTP客戶端
第一種也是最快的創(chuàng)建方法是使用聲明性方法:
@Client("/greet") public interface GreetingClient { @Get("/{name}") String greet(String name); }
注意我們沒有實(shí)現(xiàn)任何代碼來調(diào)用我們的服務(wù)。相反,Micronaut理解如何從我們提供的方法簽名和注釋調(diào)用服務(wù)。
為了測試這個客戶機(jī),我們可以創(chuàng)建一個JUnit測試,它使用嵌入式服務(wù)器API來運(yùn)行我們服務(wù)器的嵌入式實(shí)例:
public class GreetingClientTest { private EmbeddedServer server; private GreetingClient client; @Before public void setup() { server = ApplicationContext.run(EmbeddedServer.class); client = server.getApplicationContext().getBean(GreetingClient.class); } @After public void cleanup() { server.stop(); } @Test public void testGreeting() { assertEquals(client.greet("Mike"), "Hello Mike"); } }
編程HTTP客戶端
如果我們需要對其行為和實(shí)現(xiàn)進(jìn)行更多的控制,我們還可以選擇編寫更傳統(tǒng)的客戶端:
@Singleton public class ConcreteGreetingClient { private RxHttpClient httpClient; public ConcreteGreetingClient(@Client("/") RxHttpClient httpClient) { this.httpClient = httpClient; } public String greet(String name) { HttpRequest<String> req = HttpRequest.GET("/greet/" + name); return httpClient.retrieve(req).blockingFirst(); } public Single<String> greetAsync(String name) { HttpRequest<String> req = HttpRequest.GET("/async/greet/" + name); return httpClient.retrieve(req).first("An error as occurred"); } }
默認(rèn)的HTTP客戶機(jī)使用RxJava,因此可以輕松地處理阻塞或非阻塞調(diào)用。
Micronaut客戶端
當(dāng)我們使用Micronaut CLI工具創(chuàng)建示例項目時,我們已經(jīng)看到了它的實(shí)際應(yīng)用。
在我們的例子中,我們創(chuàng)建了一個獨(dú)立的應(yīng)用程序,但它還有其他一些功能。
聯(lián)合項目
在Micronaut中,聯(lián)合只是一組位于同一目錄下的獨(dú)立應(yīng)用程序。通過使用聯(lián)邦,我們可以輕松地將它們管理在一起,并確保它們獲得相同的默認(rèn)值和設(shè)置。
當(dāng)我們使用CLI工具生成聯(lián)合體時,它采用與create app命令相同的參數(shù)。它將創(chuàng)建一個頂級的項目結(jié)構(gòu),每個獨(dú)立的應(yīng)用程序?qū)⒃谄渥幽夸浿袆?chuàng)建。
特征
創(chuàng)建獨(dú)立應(yīng)用程序或聯(lián)合時,我們可以決定應(yīng)用程序需要哪些功能。這有助于確保項目中包含最小的依賴項集。
我們使用-features參數(shù)指定特性,并提供以逗號分隔的特性名稱列表。
我們可以通過運(yùn)行以下命令找到可用功能的列表:
> mn profile-info service Provided Features: -------------------- * annotation-api - Adds Java annotation API * config-consul - Adds support for Distributed Configuration with Consul * discovery-consul - Adds support for Service Discovery with Consul * discovery-eureka - Adds support for Service Discovery with Eureka * groovy - Creates a Groovy application [...] More features available
現(xiàn)有項目
我們還可以使用CLI工具來修改現(xiàn)有的項目。使我們能夠創(chuàng)建bean、客戶機(jī)、控制器等等。當(dāng)我們在現(xiàn)有項目中運(yùn)行mn命令時,將有一組新的命令可用:
> mn help | Command Name Command Description ----------------------------------------------- create-bean Creates a singleton bean create-client Creates a client interface create-controller Creates a controller and associated test create-job Creates a job with scheduled method
小結(jié)
在對Micronaut的簡要介紹中,我們看到了構(gòu)建阻塞和非阻塞HTTP服務(wù)器和客戶端是多么容易。此外,我們還探討了它的CLI的一些特性。
但這只是它提供的功能的一小部分。它還完全支持serverless功能、服務(wù)發(fā)現(xiàn)、分布式跟蹤、監(jiān)視和度量、分布式配置等等。
盡管它的許多特性都是從Grails和Spring等現(xiàn)有框架中派生出來的,但它也有許多獨(dú)特的特性幫助它脫穎而出。
一如既往,我們可以在GitHub repo中找到上面的示例代碼:https://github.com/eugenp/tutorials/tree/master/micronaut
以上就是Micronaut框架的簡單使用介紹的詳細(xì)內(nèi)容,更多關(guān)于Micronaut框架的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)
- java 非常好用的反射框架Reflections介紹
- Java高并發(fā)測試框架JCStress詳解
- Java中JFinal框架動態(tài)切換數(shù)據(jù)庫的方法
- 分享我的第一次java Selenium自動化測試框架開發(fā)過程
- 手把手教你從零設(shè)計一個java日志框架
- java mybatis框架配置詳解
- 使用JAVA+Maven+TestNG框架實(shí)現(xiàn)超詳細(xì)Appium測試安卓真機(jī)教程
- java swing框架實(shí)現(xiàn)貪吃蛇游戲
- Java爬蟲框架之WebMagic實(shí)戰(zhàn)
相關(guān)文章
基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實(shí)踐
這篇文章主要介紹了基于Java和GeoTools的Shapefile矢量數(shù)據(jù)縮略圖生成實(shí)踐,需要的朋友可以參考下2024-08-08Spring Boot集成mongodb數(shù)據(jù)庫過程解析
這篇文章主要介紹了Spring Boot集成mongodb數(shù)據(jù)庫過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡單實(shí)現(xiàn)(小結(jié))
這篇文章主要介紹了談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡單實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04SpringBoot Actuator監(jiān)控的項目實(shí)踐
本文主要結(jié)合 Spring Boot Actuator,跟大家一起分享微服務(wù)Spring Boot Actuator 的常見用法,方便我們在日常中對我們的微服務(wù)進(jìn)行監(jiān)控治理,感興趣的可以了解一下2024-01-01