- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Micronaut框架的簡(jiǎn)單使用介紹
Micronaut是一個(gè)基于JVM的框架,用于構建輕量級、模塊化的應用程序。Micronaut是由創(chuàng )建Grails的同一家公司OCI開(kāi)發(fā)的最新框架,旨在使創(chuàng )建微服務(wù)變得快速和簡(jiǎn)單。
雖然Micronaut包含一些類(lèi)似于Spring等現有框架的特性,但它也有一些新特性使它與眾不同。通過(guò)對Java、Groovy和Kotlin的支持,它提供了多種創(chuàng )建應用程序的方法。
Micronaut最令人興奮的特性之一是它的編譯時(shí)依賴(lài)注入機制。大多數框架使用反射和代理在運行時(shí)執行依賴(lài)注入。然而,Micronaut在編譯時(shí)構建其依賴(lài)注入數據。結果是更快的應用程序啟動(dòng)和更小的內存占用。
另一個(gè)特性是它對客戶(hù)端和服務(wù)器的反應式編程的一流支持。由于RxJava和projectreactor都受支持,所以特定的反應式實(shí)現的選擇權留給了開(kāi)發(fā)人員。
Micronaut還具有一些特性,使其成為開(kāi)發(fā)云本地應用程序的優(yōu)秀框架。它支持多種服務(wù)發(fā)現工具,如Eureka和consur,還可以與不同的分布式跟蹤系統(如Zipkin和Jaeger)一起使用。
它還提供了對創(chuàng )建AWS lambda函數的支持,使得創(chuàng )建Serverless無(wú)服務(wù)器應用程序變得容易。
最簡(jiǎn)單的入門(mén)方法是使用SDKMAN:
> sdk install micronaut 1.0.0.RC2
這將安裝我們構建、測試和部署Micronaut應用程序所需的所有二進(jìn)制文件。它還提供Micronaut CLI工具,使我們能夠輕松地啟動(dòng)新項目。
在下面的部分中,我們將介紹框架的一些特性。
如前所述,Micronaut在編譯時(shí)處理依賴(lài)注入,這與大多數IoC容器不同。
但是,它仍然完全支持JSR-330注釋?zhuān)虼耸褂胋ean與其他IoC框架類(lèi)似。
為了將bean自動(dòng)連接到我們的代碼中,我們使用@Inject:
@Inject private EmployeeService service;
@Inject注釋的工作方式與@Autowired類(lèi)似,可以用于字段、方法、構造函數和參數。
默認情況下,所有bean的作用域都是一個(gè)原型。我們可以使用@singleton快速創(chuàng )建單例bean。如果多個(gè)類(lèi)實(shí)現相同的bean接口,@Primary可以用來(lái)消除它們之間的沖突:
@Primary @Singleton public class BlueCar implements Car {}
當bean是可選的時(shí),可以使用@Requires注釋?zhuān)蛘邇H當滿(mǎn)足某些條件時(shí)才執行自動(dòng)連接。
在這方面,它的行為非常類(lèi)似于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 {}
現在讓我們看看如何創(chuàng )建一個(gè)簡(jiǎn)單的HTTP服務(wù)器應用程序。首先,我們將使用SDKMAN創(chuàng )建一個(gè)項目:
> mn create-app hello-world-server -build maven
這將在名為helloworld server的目錄中使用Maven創(chuàng )建一個(gè)新的Java項目。在這個(gè)目錄中,我們將找到主要的應用程序源代碼、Maven POM文件和項目的其他支持文件。
默認應用程序非常簡(jiǎn)單:
public class ServerApplication { public static void main(String[] args) { Micronaut.run(ServerApplication.class); } }
就其本身而言,這個(gè)應用程序不會(huì )有太大的作用。讓我們添加一個(gè)具有兩個(gè)端點(diǎn)的控制器。兩者都將返回問(wèn)候語(yǔ),但其中一個(gè)將使用GET HTTP動(dòng)詞,另一個(gè)將使用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; } }
默認情況下,Micronaut將使用傳統的阻塞I/O實(shí)現這些端點(diǎn)。但是,我們可以通過(guò)將返回類(lèi)型更改為任何反應性非阻塞類(lèi)型來(lái)快速實(shí)現非阻塞端點(diǎn)。
例如,對于RxJava,我們可以使用Observable。同樣,在使用Reactor時(shí),我們可以返回Mono或Flux數據類(lèi)型:
@Get("/{name}") public Mono<String> greet(String name) { return Mono.just(greetingService.getGreeting() + name); }
對于阻塞和非阻塞端點(diǎn),Netty都是用于處理HTTP請求的底層服務(wù)器。
通常,請求在啟動(dòng)時(shí)創(chuàng )建的主I/O線(xiàn)程池中處理,使它們阻塞。
但是,當從控制器端點(diǎn)返回非阻塞數據類(lèi)型時(shí),Micronaut使用Netty事件循環(huán)線(xiàn)程,使整個(gè)請求成為非阻塞的。
現在讓我們構建一個(gè)客戶(hù)機來(lái)使用剛剛創(chuàng )建的端點(diǎn)。Micronaut提供兩種創(chuàng )建HTTP客戶(hù)端的方法:
第一種也是最快的創(chuàng )建方法是使用聲明性方法:
@Client("/greet") public interface GreetingClient { @Get("/{name}") String greet(String name); }
注意我們沒(méi)有實(shí)現任何代碼來(lái)調用我們的服務(wù)。相反,Micronaut理解如何從我們提供的方法簽名和注釋調用服務(wù)。
為了測試這個(gè)客戶(hù)機,我們可以創(chuàng )建一個(gè)JUnit測試,它使用嵌入式服務(wù)器API來(lái)運行我們服務(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"); } }
如果我們需要對其行為和實(shí)現進(jìn)行更多的控制,我們還可以選擇編寫(xiě)更傳統的客戶(hù)端:
@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客戶(hù)機使用RxJava,因此可以輕松地處理阻塞或非阻塞調用。
當我們使用Micronaut CLI工具創(chuàng )建示例項目時(shí),我們已經(jīng)看到了它的實(shí)際應用。
在我們的例子中,我們創(chuàng )建了一個(gè)獨立的應用程序,但它還有其他一些功能。
在Micronaut中,聯(lián)合只是一組位于同一目錄下的獨立應用程序。通過(guò)使用聯(lián)邦,我們可以輕松地將它們管理在一起,并確保它們獲得相同的默認值和設置。
當我們使用CLI工具生成聯(lián)合體時(shí),它采用與create app命令相同的參數。它將創(chuàng )建一個(gè)頂級的項目結構,每個(gè)獨立的應用程序將在其子目錄中創(chuàng )建。
創(chuàng )建獨立應用程序或聯(lián)合時(shí),我們可以決定應用程序需要哪些功能。這有助于確保項目中包含最小的依賴(lài)項集。
我們使用-features參數指定特性,并提供以逗號分隔的特性名稱(chēng)列表。
我們可以通過(guò)運行以下命令找到可用功能的列表:
> 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工具來(lái)修改現有的項目。使我們能夠創(chuàng )建bean、客戶(hù)機、控制器等等。當我們在現有項目中運行mn命令時(shí),將有一組新的命令可用:
> 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的簡(jiǎn)要介紹中,我們看到了構建阻塞和非阻塞HTTP服務(wù)器和客戶(hù)端是多么容易。此外,我們還探討了它的CLI的一些特性。
但這只是它提供的功能的一小部分。它還完全支持serverless功能、服務(wù)發(fā)現、分布式跟蹤、監視和度量、分布式配置等等。
盡管它的許多特性都是從Grails和Spring等現有框架中派生出來(lái)的,但它也有許多獨特的特性幫助它脫穎而出。
一如既往,我們可以在GitHub repo中找到上面的示例代碼:
以上就是Micronaut框架的簡(jiǎn)單使用介紹的詳細內容,更多關(guān)于Micronaut框架的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站