Micronaut的SpringBoot开发指导指南分享!

2021-09-03 10:32:38 浏览数 (2742)

这是针对想要开始使用 Micronaut 的 Spring 应用程序开发人员的指南。通过本指南,您将获得足够的信息来使用 Micronaut 框架。

介绍

Micronaut 是一个框架,它以更快的启动时间而得名,通常是使用 AWS Lambda 的解决方案的首选。它使用提前 (AOT) 编译来确定应用程序需要什么。这样做的结果是应用程序具有更小的内存占用、快速的启动时间和无反射。

该框架提供了依赖注入、控制反转(IOC)和面向切面编程(AOP),这与 Spring 提供的类似。使用 Micronaut,您可以创建命令行应用程序、HTTP 服务器应用程序,甚至是事件驱动的应用程序。

有了这个介绍,让我们看看如何使用 Micronaut 创建一个应用程序。

创建项目

要创建项目,您可以直接转到Micronaut 的启动来创建您的项目。这类似于 spring 如何提供一种使用https://start.spring.io创建项目的方法

您也可以使用 SDKMan 安装命令行实用程序。命令行实用程序与启动站点的作用相同。有关此的更多详细信息,请参见此处

在创建项目时,添加Hibernate-JPA功能,因为我们将创建一个具有 CRUD 功能的项目。生成项目后,我们将查看作为 Spring 开发人员通常会做的各种事情。 

创建一个 Bean

通常情况下,在春天,你会使用创建一个bean @bean,@Restcontroller,@service,@repository,等。Micronaut,我们有一些注释,则类似的。让我们来看看它们。

  • @controller — 为您的休息端点定义您的控制器类。
  • @repository — 定义您的存储库 bean。 
  • @singleton — 定义一个具有单例作用域的 bean。 
  • @prototype — 定义一个具有原型作用域的 bean 
  • @requestscope — 定义具有请求范围的 bean。 

没有@serviceor@component注释,但您可以使用上述注释来创建服务或组件。

除此之外,我们还@infrastructure必须定义一个对应用程序运行至关重要的 bean,它不应被覆盖,并定义@threadlocal每个线程的 bean 范围的注解。

为了注入特定的 bean,Micronaut 支持基于构造函数、基于 setter、基于名称的相同注入机制,这类似于 spring 提供的。在 的情况下@autowire,您现在将使用@inject注释。

您还可以拥有 bean 生命周期方法、条件 bean、bean 限定符等,它们类似于 spring 提供的那些。您可以随时在此处的Micronaut 文档中阅读有关它的更多信息。

依赖关系

现在,我正在创建一个与 MySQL 通信的 CRUD 应用程序。我需要的来自 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驱动程序才能与 MySQL 通信。

JPA 配置

要创建实体,您可以使用通常的javax.persistence注释来创建实体、定义 id、列等。 

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

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

您的数据源和休眠配置也几乎保持不变:

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

为了查询您的数据库,我们从 Micronaut 获取您通过扩展 CRUDRepository 或 JPARepository 等接口创建的接口的实现。我们还使用@query注释提供 JPA 查询支持。这是带有示例查询方法的 JPA 存储库的代码。

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

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

休息控制器

休息控制器可以通过创建@controller注释,并提供您的GET,PUT,POST使用映射@get,@put,@post注释分别。所有这些注释都来自micronaut-http-client依赖项。

@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();
    }

表现

通过上述配置,应用程序在近2 秒内启动。 

__  __ _                                  _   
|  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_ 
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| |  | | | (__| | | (_) | | | | (_| | |_| | |_ 
|_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
  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

现在,这里有一个问题。

当应用程序启动时,bean 还没有连接好,这会延迟发生。当应用程序接收到第一个请求时,bean 连接发生,因此第一个被服务的请求会有一点延迟。随后的请求非常快。 

这是统计数据。

Micronaut 性能统计

现在为了真正提升启动性能,我们可以创建一个 Native 镜像。使用本机映像,您可以获得大约 90 毫秒的启动时间。 

是的,具有 JPA CRUD 功能的90 毫秒。更多的内容可以在GitHub进行了解。