什么是Micronaut
Micronaut是一個基于JVM的框架,用于構建輕量級、模塊化的應用程序。Micronaut是由創建Grails的同一家公司OCI開發的最新框架,旨在使創建微服務變得快速和簡單。
雖然Micronaut包含一些類似于Spring等現有框架的特性,但它也有一些新特性使它與眾不同。通過對Java、Groovy和Kotlin的支持,它提供了多種創建應用程序的方法。
主要特點
Micronaut最令人興奮的特性之一是它的編譯時依賴注入機制。大多數框架使用反射和代理在運行時執行依賴注入。然而,Micronaut在編譯時構建其依賴注入數據。結果是更快的應用程序啟動和更小的內存占用。
另一個特性是它對客戶端和服務器的反應式編程的一流支持。由于RxJava和projectreactor都受支持,所以特定的反應式實現的選擇權留給了開發人員。
Micronaut還具有一些特性,使其成為開發云本地應用程序的優秀框架。它支持多種服務發現工具,如Eureka和consur,還可以與不同的分布式跟蹤系統(如Zipkin和Jaeger)一起使用。
它還提供了對創建AWS lambda函數的支持,使得創建Serverless無服務器應用程序變得容易。
入門
最簡單的入門方法是使用SDKMAN:
1
|
> sdk install micronaut 1.0 . 0 .RC2 |
這將安裝我們構建、測試和部署Micronaut應用程序所需的所有二進制文件。它還提供Micronaut CLI工具,使我們能夠輕松地啟動新項目。
在下面的部分中,我們將介紹框架的一些特性。
依賴注入
如前所述,Micronaut在編譯時處理依賴注入,這與大多數IoC容器不同。
但是,它仍然完全支持JSR-330注釋,因此使用bean與其他IoC框架類似。
為了將bean自動連接到我們的代碼中,我們使用@Inject:
1
2
|
@Inject private EmployeeService service; |
@Inject注釋的工作方式與@Autowired類似,可以用于字段、方法、構造函數和參數。
默認情況下,所有bean的作用域都是一個原型。我們可以使用@singleton快速創建單例bean。如果多個類實現相同的bean接口,@Primary可以用來消除它們之間的沖突:
1
2
3
|
@Primary @Singleton public class BlueCar implements Car {} |
當bean是可選的時,可以使用@Requires注釋,或者僅當滿足某些條件時才執行自動連接。
在這方面,它的行為非常類似于Spring Boot@Conditional注解:
1
2
3
4
5
6
|
@Singleton @Requires (beans = DataSource. class ) @Requires (property = "enabled" ) @Requires (missingBeans = EmployeeService) @Requires (sdk = Sdk.JAVA, value = "1.8" ) public class JdbcEmployeeService implements EmployeeService {} |
構建HTTP服務器
現在讓我們看看如何創建一個簡單的HTTP服務器應用程序。首先,我們將使用SDKMAN創建一個項目:
1
|
> mn create-app hello-world-server -build maven |
這將在名為helloworld server的目錄中使用Maven創建一個新的Java項目。在這個目錄中,我們將找到主要的應用程序源代碼、Maven POM文件和項目的其他支持文件。
默認應用程序非常簡單:
1
2
3
4
5
|
public class ServerApplication { public static void main(String[] args) { Micronaut.run(ServerApplication. class ); } } |
阻塞HTTP
就其本身而言,這個應用程序不會有太大的作用。讓我們添加一個具有兩個端點的控制器。兩者都將返回問候語,但其中一個將使用GET HTTP動詞,另一個將使用POST:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@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; } } |
反應式IO
默認情況下,Micronaut將使用傳統的阻塞I/O實現這些端點。但是,我們可以通過將返回類型更改為任何反應性非阻塞類型來快速實現非阻塞端點。
例如,對于RxJava,我們可以使用Observable。同樣,在使用Reactor時,我們可以返回Mono或Flux數據類型:
1
2
3
4
|
@Get ( "/{name}" ) public Mono<String> greet(String name) { return Mono.just(greetingService.getGreeting() + name); } |
對于阻塞和非阻塞端點,Netty都是用于處理HTTP請求的底層服務器。
通常,請求在啟動時創建的主I/O線程池中處理,使它們阻塞。
但是,當從控制器端點返回非阻塞數據類型時,Micronaut使用Netty事件循環線程,使整個請求成為非阻塞的。
構建HTTP客戶端
現在讓我們構建一個客戶機來使用剛剛創建的端點。Micronaut提供兩種創建HTTP客戶端的方法:
- 聲明性HTTP客戶端
- 可編程的HTTP客戶機
聲明性HTTP客戶端
第一種也是最快的創建方法是使用聲明性方法:
1
2
3
4
5
|
@Client ( "/greet" ) public interface GreetingClient { @Get ( "/{name}" ) String greet(String name); } |
注意我們沒有實現任何代碼來調用我們的服務。相反,Micronaut理解如何從我們提供的方法簽名和注釋調用服務。
為了測試這個客戶機,我們可以創建一個JUnit測試,它使用嵌入式服務器API來運行我們服務器的嵌入式實例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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客戶端
如果我們需要對其行為和實現進行更多的控制,我們還可以選擇編寫更傳統的客戶端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@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" ); } } |
默認的HTTP客戶機使用RxJava,因此可以輕松地處理阻塞或非阻塞調用。
Micronaut客戶端
當我們使用Micronaut CLI工具創建示例項目時,我們已經看到了它的實際應用。
在我們的例子中,我們創建了一個獨立的應用程序,但它還有其他一些功能。
聯合項目
在Micronaut中,聯合只是一組位于同一目錄下的獨立應用程序。通過使用聯邦,我們可以輕松地將它們管理在一起,并確保它們獲得相同的默認值和設置。
當我們使用CLI工具生成聯合體時,它采用與create app命令相同的參數。它將創建一個頂級的項目結構,每個獨立的應用程序將在其子目錄中創建。
特征
創建獨立應用程序或聯合時,我們可以決定應用程序需要哪些功能。這有助于確保項目中包含最小的依賴項集。
我們使用-features參數指定特性,并提供以逗號分隔的特性名稱列表。
我們可以通過運行以下命令找到可用功能的列表:
1
2
3
4
5
6
7
8
9
10
|
> 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 |
現有項目
我們還可以使用CLI工具來修改現有的項目。使我們能夠創建bean、客戶機、控制器等等。當我們在現有項目中運行mn命令時,將有一組新的命令可用:
1
2
3
4
5
6
7
|
> 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 |
小結
在對Micronaut的簡要介紹中,我們看到了構建阻塞和非阻塞HTTP服務器和客戶端是多么容易。此外,我們還探討了它的CLI的一些特性。
但這只是它提供的功能的一小部分。它還完全支持serverless功能、服務發現、分布式跟蹤、監視和度量、分布式配置等等。
盡管它的許多特性都是從Grails和Spring等現有框架中派生出來的,但它也有許多獨特的特性幫助它脫穎而出。
一如既往,我們可以在GitHub repo中找到上面的示例代碼:https://github.com/eugenp/tutorials/tree/master/micronaut
以上就是Micronaut框架的簡單使用介紹的詳細內容,更多關于Micronaut框架的資料請關注服務器之家其它相關文章!
原文鏈接:https://javakk.com/1840.html