App下載

Micronaut的SpringBoot開發(fā)指導(dǎo)指南分享!

饕餮少女 2021-09-03 10:32:38 瀏覽數(shù) (2489)
反饋

這是針對(duì)想要開始使用 Micronaut 的 Spring 應(yīng)用程序開發(fā)人員的指南。通過(guò)本指南,您將獲得足夠的信息來(lái)使用 Micronaut 框架。

介紹

Micronaut 是一個(gè)框架,它以更快的啟動(dòng)時(shí)間而得名,通常是使用 AWS Lambda 的解決方案的首選。它使用提前 (AOT) 編譯來(lái)確定應(yīng)用程序需要什么。這樣做的結(jié)果是應(yīng)用程序具有更小的內(nèi)存占用、快速的啟動(dòng)時(shí)間和無(wú)反射。

該框架提供了依賴注入、控制反轉(zhuǎn)(IOC)和面向切面編程(AOP),這與 Spring 提供的類似。使用 Micronaut,您可以創(chuàng)建命令行應(yīng)用程序、HTTP 服務(wù)器應(yīng)用程序,甚至是事件驅(qū)動(dòng)的應(yīng)用程序。

有了這個(gè)介紹,讓我們看看如何使用 Micronaut 創(chuàng)建一個(gè)應(yīng)用程序。

創(chuàng)建項(xiàng)目

要?jiǎng)?chuàng)建項(xiàng)目,您可以直接轉(zhuǎn)到Micronaut 的啟動(dòng)來(lái)創(chuàng)建您的項(xiàng)目。這類似于 spring 如何提供一種使用https://start.spring.io創(chuàng)建項(xiàng)目的方法

您也可以使用 SDKMan 安裝命令行實(shí)用程序。命令行實(shí)用程序與啟動(dòng)站點(diǎn)的作用相同。有關(guān)此的更多詳細(xì)信息,請(qǐng)參見此處

在創(chuàng)建項(xiàng)目時(shí),添加Hibernate-JPA功能,因?yàn)槲覀儗?chuàng)建一個(gè)具有 CRUD 功能的項(xiàng)目。生成項(xiàng)目后,我們將查看作為 Spring 開發(fā)人員通常會(huì)做的各種事情。 

創(chuàng)建一個(gè) Bean

通常情況下,在春天,你會(huì)使用創(chuàng)建一個(gè)bean @bean,@Restcontroller,@service,@repository,等。Micronaut,我們有一些注釋,則類似的。讓我們來(lái)看看它們。

  • @controller?— 為您的休息端點(diǎn)定義您的控制器類。
  • @repository?— 定義您的存儲(chǔ)庫(kù) bean。 
  • @singleton?— 定義一個(gè)具有單例作用域的 bean。 
  • @prototype?— 定義一個(gè)具有原型作用域的 bean 
  • @requestscope?— 定義具有請(qǐng)求范圍的 bean。 

沒(méi)有@serviceor@component注釋,但您可以使用上述注釋來(lái)創(chuàng)建服務(wù)或組件。

除此之外,我們還@infrastructure必須定義一個(gè)對(duì)應(yīng)用程序運(yùn)行至關(guān)重要的 bean,它不應(yīng)被覆蓋,并定義@threadlocal每個(gè)線程的 bean 范圍的注解。

為了注入特定的 bean,Micronaut 支持基于構(gòu)造函數(shù)、基于 setter、基于名稱的相同注入機(jī)制,這類似于 spring 提供的。在 的情況下@autowire,您現(xiàn)在將使用@inject注釋。

您還可以擁有 bean 生命周期方法、條件 bean、bean 限定符等,它們類似于 spring 提供的那些。您可以隨時(shí)在此處的Micronaut 文檔中閱讀有關(guān)它的更多信息。

依賴關(guān)系

現(xiàn)在,我正在創(chuàng)建一個(gè)與 MySQL 通信的 CRUD 應(yīng)用程序。我需要的來(lái)自 Micronaut 的最小依賴是:

<dependency>
      <groupId>io.micronaut</groupId>
      <artifactId>micronaut-inject</artifactId>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.micronaut</groupId>
      <artifactId>micronaut-http-server-netty</artifactId>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.micronaut.data</groupId>
      <artifactId>micronaut-data-hibernate-jpa</artifactId>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.micronaut.sql</groupId>
      <artifactId>micronaut-jdbc-hikari</artifactId>
      <scope>compile</scope>
    </dependency>

除此之外,我還必須添加mysql-connector-java驅(qū)動(dòng)程序才能與 MySQL 通信。

JPA 配置

要?jiǎng)?chuàng)建實(shí)體,您可以使用通常的javax.persistence注釋來(lái)創(chuàng)建實(shí)體、定義 id、列等。 

@Entity
@Table(name = "Orders")
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

您的數(shù)據(jù)源和休眠配置也幾乎保持不變:

datasources:
  default:
    url: jdbc:mysql://localhost:3306/ORDER
    username: root
    password: root
jpa:
  default:
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        show_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

為了查詢您的數(shù)據(jù)庫(kù),我們從 Micronaut 獲取您通過(guò)擴(kuò)展 CRUDRepository 或 JPARepository 等接口創(chuàng)建的接口的實(shí)現(xiàn)。我們還使用@query注釋提供 JPA 查詢支持。這是帶有示例查詢方法的 JPA 存儲(chǔ)庫(kù)的代碼。

@Repository
public interface OrderRepository extends CrudRepository<Order, Long> {

    @Query("select o from Order as o")
    List<Order> getAllOrders();
}

休息控制器

休息控制器可以通過(guò)創(chuàng)建@controller注釋,并提供您的GET,PUT,POST使用映射@get,@put,@post注釋分別。所有這些注釋都來(lái)自micronaut-http-client依賴項(xiàng)。

@Controller("/order")
public class WebController {

    private final OrderService orderService;

    public WebController(OrderService orderService) {
        this.orderService = orderService;
    }

    @Get("/{id}")
    public HttpResponse<OrderDTO> getOrder(@PathVariable("id") Long id) {

        Optional<OrderDTO> mayBeOrder = orderService.getOrder(id);
        if (mayBeOrder.isPresent()) {
            return HttpResponse.created(mayBeOrder.get());
        }
        return HttpResponse.notFound();
    }

表現(xiàn)

通過(guò)上述配置,應(yīng)用程序在近2 秒內(nèi)啟動(dòng)。 

__  __ _                                  _   
|  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_ 
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| |  | | | (__| | | (_) | | | | (_| | |_| | |_ 
|_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
  Micronaut (v2.5.8)

12:55:07.769 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
12:55:08.150 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
12:55:08.157 [main] INFO  org.hibernate.Version - HHH000412: Hibernate ORM core version [WORKING]
12:55:08.248 [main] INFO  o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
12:55:08.351 [main] INFO  org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.MySQL57Dialect
12:55:09.059 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 1928ms. Server Running: http://localhost:8080

現(xiàn)在,這里有一個(gè)問(wèn)題。

當(dāng)應(yīng)用程序啟動(dòng)時(shí),bean 還沒(méi)有連接好,這會(huì)延遲發(fā)生。當(dāng)應(yīng)用程序接收到第一個(gè)請(qǐng)求時(shí),bean 連接發(fā)生,因此第一個(gè)被服務(wù)的請(qǐng)求會(huì)有一點(diǎn)延遲。隨后的請(qǐng)求非???。 

這是統(tǒng)計(jì)數(shù)據(jù)。

Micronaut 性能統(tǒng)計(jì)

現(xiàn)在為了真正提升啟動(dòng)性能,我們可以創(chuàng)建一個(gè) Native 鏡像。使用本機(jī)映像,您可以獲得大約 90 毫秒的啟動(dòng)時(shí)間。 

是的,具有 JPA CRUD 功能的90 毫秒。更多的內(nèi)容可以在GitHub進(jìn)行了解。


0 人點(diǎn)贊