App下載

帶你認(rèn)識(shí)一下Micronaut框架以及簡(jiǎn)單使用

退役魔法少女 2021-08-13 15:08:13 瀏覽數(shù) (6588)
反饋

什么是Micronaut

Micronaut是一個(gè)基于JVM的框架,用于構(gòu)建輕量級(jí)、模塊化的應(yīng)用程序。Micronaut是由創(chuàng)建Grails的同一家公司OCI開(kāi)發(fā)的最新框架,旨在使創(chuàng)建微服務(wù)變得快速和簡(jiǎn)單。

雖然Micronaut包含一些類(lèi)似于Spring等現(xiàn)有框架的特性,但它也有一些新特性使它與眾不同。通過(guò)對(duì)Java、Groovy和Kotlin的支持,它提供了多種創(chuàng)建應(yīng)用程序的方法。

主要特點(diǎn)

Micronaut最令人興奮的特性之一是它的編譯時(shí)依賴(lài)注入機(jī)制。大多數(shù)框架使用反射和代理在運(yùn)行時(shí)執(zhí)行依賴(lài)注入。然而,Micronaut在編譯時(shí)構(gòu)建其依賴(lài)注入數(shù)據(jù)。結(jié)果是更快的應(yīng)用程序啟動(dòng)和更小的內(nèi)存占用。

另一個(gè)特性是它對(duì)客戶端和服務(wù)器的反應(yīng)式編程的一流支持。由于RxJava和projectreactor都受支持,所以特定的反應(yīng)式實(shí)現(xiàn)的選擇權(quán)留給了開(kāi)發(fā)人員。

Micronaut還具有一些特性,使其成為開(kāi)發(fā)云本地應(yīng)用程序的優(yōu)秀框架。它支持多種服務(wù)發(fā)現(xiàn)工具,如Eureka和consur,還可以與不同的分布式跟蹤系統(tǒng)(如Zipkin和Jaeger)一起使用。

它還提供了對(duì)創(chuàng)建AWS lambda函數(shù)的支持,使得創(chuàng)建Serverless無(wú)服務(wù)器應(yīng)用程序變得容易。

入門(mén)

最簡(jiǎn)單的入門(mén)方法是使用SDKMAN:

> sdk install micronaut 1.0.0.RC2

這將安裝我們構(gòu)建、測(cè)試和部署Micronaut應(yīng)用程序所需的所有二進(jìn)制文件。它還提供Micronaut CLI工具,使我們能夠輕松地啟動(dòng)新項(xiàng)目。

在下面的部分中,我們將介紹框架的一些特性。

依賴(lài)注入

如前所述,Micronaut在編譯時(shí)處理依賴(lài)注入,這與大多數(shù)IoC容器不同。

但是,它仍然完全支持JSR-330注釋?zhuān)虼耸褂胋ean與其他IoC框架類(lèi)似。

為了將bean自動(dòng)連接到我們的代碼中,我們使用@Inject:

@Inject
private EmployeeService service;

@Inject注釋的工作方式與@Autowired類(lèi)似,可以用于字段、方法、構(gòu)造函數(shù)和參數(shù)。

默認(rèn)情況下,所有bean的作用域都是一個(gè)原型。我們可以使用@singleton快速創(chuàng)建單例bean。如果多個(gè)類(lèi)實(shí)現(xiàn)相同的bean接口,@Primary可以用來(lái)消除它們之間的沖突:

@Primary
@Singleton
public class BlueCar implements Car {}

當(dāng)bean是可選的時(shí),可以使用@Requires注釋?zhuān)蛘邇H當(dāng)滿足某些條件時(shí)才執(zhí)行自動(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 {}

構(gòu)建HTTP服務(wù)器

現(xiàn)在讓我們看看如何創(chuàng)建一個(gè)簡(jiǎn)單的HTTP服務(wù)器應(yīng)用程序。首先,我們將使用SDKMAN創(chuàng)建一個(gè)項(xiàng)目:

> mn create-app hello-world-server -build maven

這將在名為helloworld server的目錄中使用Maven創(chuàng)建一個(gè)新的Java項(xiàng)目。在這個(gè)目錄中,我們將找到主要的應(yīng)用程序源代碼、Maven POM文件和項(xiàng)目的其他支持文件。

默認(rèn)應(yīng)用程序非常簡(jiǎn)單:

public class ServerApplication {
    public static void main(String[] args) {
        Micronaut.run(ServerApplication.class);
    }
}

阻塞HTTP

就其本身而言,這個(gè)應(yīng)用程序不會(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;
    }
}

反應(yīng)式IO

默認(rèn)情況下,Micronaut將使用傳統(tǒng)的阻塞I/O實(shí)現(xiàn)這些端點(diǎn)。但是,我們可以通過(guò)將返回類(lèi)型更改為任何反應(yīng)性非阻塞類(lèi)型來(lái)快速實(shí)現(xiàn)非阻塞端點(diǎn)。

例如,對(duì)于RxJava,我們可以使用Observable。同樣,在使用Reactor時(shí),我們可以返回Mono或Flux數(shù)據(jù)類(lèi)型:

@Get("/{name}")
public Mono<String> greet(String name) {
    return Mono.just(greetingService.getGreeting() + name);
}

對(duì)于阻塞和非阻塞端點(diǎn),Netty都是用于處理HTTP請(qǐng)求的底層服務(wù)器。

通常,請(qǐng)求在啟動(dòng)時(shí)創(chuàng)建的主I/O線程池中處理,使它們阻塞。

但是,當(dāng)從控制器端點(diǎn)返回非阻塞數(shù)據(jù)類(lèi)型時(shí),Micronaut使用Netty事件循環(huán)線程,使整個(gè)請(qǐng)求成為非阻塞的。

構(gòu)建HTTP客戶端

現(xiàn)在讓我們構(gòu)建一個(gè)客戶機(jī)來(lái)使用剛剛創(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);
}

注意我們沒(méi)有實(shí)現(xiàn)任何代碼來(lái)調(diào)用我們的服務(wù)。相反,Micronaut理解如何從我們提供的方法簽名和注釋調(diào)用服務(wù)。

為了測(cè)試這個(gè)客戶機(jī),我們可以創(chuàng)建一個(gè)JUnit測(cè)試,它使用嵌入式服務(wù)器API來(lái)運(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客戶端

如果我們需要對(duì)其行為和實(shí)現(xiàn)進(jìn)行更多的控制,我們還可以選擇編寫(xiě)更傳統(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)建示例項(xiàng)目時(shí),我們已經(jīng)看到了它的實(shí)際應(yīng)用。

在我們的例子中,我們創(chuàng)建了一個(gè)獨(dú)立的應(yīng)用程序,但它還有其他一些功能。

聯(lián)合項(xiàng)目

在Micronaut中,聯(lián)合只是一組位于同一目錄下的獨(dú)立應(yīng)用程序。通過(guò)使用聯(lián)邦,我們可以輕松地將它們管理在一起,并確保它們獲得相同的默認(rèn)值和設(shè)置。

當(dāng)我們使用CLI工具生成聯(lián)合體時(shí),它采用與create app命令相同的參數(shù)。它將創(chuàng)建一個(gè)頂級(jí)的項(xiàng)目結(jié)構(gòu),每個(gè)獨(dú)立的應(yīng)用程序?qū)⒃谄渥幽夸浿袆?chuàng)建。

特征

創(chuàng)建獨(dú)立應(yīng)用程序或聯(lián)合時(shí),我們可以決定應(yīng)用程序需要哪些功能。這有助于確保項(xiàng)目中包含最小的依賴(lài)項(xiàng)集。

我們使用-features參數(shù)指定特性,并提供以逗號(hào)分隔的特性名稱(chēng)列表。

我們可以通過(guò)運(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)有項(xiàng)目

我們還可以使用CLI工具來(lái)修改現(xiàn)有的項(xiàng)目。使我們能夠創(chuàng)建bean、客戶機(jī)、控制器等等。當(dāng)我們?cè)诂F(xiàn)有項(xiàng)目中運(yùn)行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

小結(jié)

在對(duì)Micronaut的簡(jiǎn)要介紹中,我們看到了構(gòu)建阻塞和非阻塞HTTP服務(wù)器和客戶端是多么容易。此外,我們還探討了它的CLI的一些特性。

但這只是它提供的功能的一小部分。它還完全支持serverless功能、服務(wù)發(fā)現(xiàn)、分布式跟蹤、監(jiān)視和度量、分布式配置等等。

盡管它的許多特性都是從Grails和Spring等現(xiàn)有框架中派生出來(lái)的,但它也有許多獨(dú)特的特性幫助它脫穎而出。

一如既往,我們可以在GitHub repo中找到上面的示例代碼:https://github.com/eugenp/tutorials/tree/master/micronaut

到此本篇關(guān)于Java的Micronaut框架的介紹以及簡(jiǎn)單使用的內(nèi)容就介紹完了,想要了解更多Java框架內(nèi)容,請(qǐng)多多關(guān)注W3Cschool其他相關(guān)內(nèi)容的文章。


0 人點(diǎn)贊