译者|陈军校对|人气不断。其中,Micronaut是一个令人耳目一新的选择。它是由构建Grails的同一个团队为现代架构设计和开发的。本文首先介绍Micronaut的基本特性,然后从一个简单的基于RESTfulAPI的应用入手,将其重构为反应式非阻塞IO(reactivenon-blockingIO,NIO),并介绍Micronaut如何支持基于微服务和非阻止服务器架构的云原生开发。Micronaut的特性Micronaut提供了很多继承自Spring和Grails等传统框架的优点,其中之一被称为“nativelycloudnative”,即:为云环境从头构建。其云原生能力包括:环境检测、服务发现和分布式追踪。同时,Micronaut提供了一个新的控制反转(IoC)容器。容器可以使用提前(AoT)编译来加速启动。这里的AoT是指启动时间不会随着代码库的增加而增加。这对于无服务器和基于容器的部署尤为重要。毕竟,在这些部署中,节点经常会根据需要关闭和启动。作为一个多语言的JVM框架,Micronaut目前支持Java、Groovy和Kotlin,并将很快支持Scala。此外,Micronaut还支持响应式编程。开发人员可以在框架内使用ReactiveX或Reactor。事实上,从2021年7月发布的Micronaut3开始,就已经推荐了Reactor。值得注意的是,新版本不包括反应库作为传递依赖。1.开始使用Micronaut我们可以通过SDKMan在任何基于Unix的系统包括Linux和macOS上轻松安装Micronaut。如果您使用的是Windows,请下载Micronaut二进制文件并将其添加到适当的路径。安装完成后可以在命令行看到mn工具的提示。也就是说,通过打开shell并导航到适当的位置,您可以键入:mncreate-appmicronaut-idg--buildmaven。Micronaut通过包装器支持Gradle和Maven。这为您省去了自己安装和构建工具的麻烦。注意,如果你更喜欢使用Gradle,请不要在上面的命令中使用--buildmaven。如果您使用mvnwmn:run运行服务器并在浏览器中输入http://localhost:8080/,您可能会看到默认为“未找到”的JSON响应。为此,让我们检查示例项目的布局。这是一个标准的Maven项目。它的主要类位于src/main/java/micronaut/idg/Application.java。请注意,主类作为嵌入式服务器运行。当您更改代码时,Micronaut开发服务器会自动更新正在运行的应用程序。2.添加一个Micronaut控制器就像在Spring的MVC中一样,您可以添加各种控制器类(controllerclass)来将URL映射到代码处理程序(handler)。例如,您可以在src/main/java/micronaut/idg/controller/SimpleController中添加一个类。如下面的清单1所示,我们使用这个控制器来创建一个文本响应。清单1.使用Micronaut控制器包micronaut.idg.controller;导入io.micronaut.http.MediaType;导入io.micronaut.http.annotation.Controller;导入io.micronaut.http.annotation.Get;@Controller("/simple")publicclassSimpleController{@Get(produces=MediaType.TEXT_PLAIN)publicStringindex(){return"ASimpleEndpoint";如下面的清单2所示,它可以轻松地返回JSON格式的响应。清单2.JSON格式的响应包micronaut.idg.controller;导入io.micronaut.http.MediaType;导入io.micronaut.http.annotation.Controller;导入io.micronaut.http.annotation.Get;导入java.util。地图;导入java.util.HashMap;@Controller("/simple")publicclassSimpleController{@Get(produces=MediaType.APPLICATION_JSON)publicMapindex(){Mapmsg=newHashMap();msg.put("message","一条简单的消息");returnmsg;}}清单2演示了Micronaut对@Get注解的produces参数的智能处理。本例中,它发送的是我们设置好的JSON格式的响应。3.添加Micronaut服务层因为可以预运行,Micronaut的IoC实现在底层是独一无二的。当然,它仍然属于CDI(ContextsandDependencyInjection,上下文和依赖注入)规范的完整实现。这意味着您可以使用您从Spring中了解到的所有类似DI的注释(如@Inject)。在下面的清单3中,我们连接了一个服务层bean来提供消息。在实际应用程序中,此类可以通过数据访问bean调用数据存储或其他远程API。例如,我们可以创建一个src/main/java/micronaut/idg/service文件夹并添加两个文件,如清单3所示——一个接口(Simple)及其实现(SimpleService)。清单3.创建一个简单的服务层bean//Simple.javapackagemicronaut.idg.service;公共接口简单{publicStringgetMessage();}//SimpleService.java包micronaut.idg.service;导入jakarta.inject。单例;@SingletonpublicclassSimpleServiceimplementsSimple{publicStringgetMessage(){return"一个简单的服务消息";现在您可以通过将服务注入清单1中创建的SimpleController服务来使用您的新服务层。下面的清单4显示了构造函数注入。清单4.将服务bean注入控制器@Controller("/simple")publicclassSimpleController{@InjectprivatefinalSimplesimpleService;publicSimpleController(@Named("simpleService")Simplesimple){//(1)thi.simpleService=simple;}@Get(produces=MediaType.APPLICATION_JSON)publicMapindex(){Mapmsg=newHashMap();msg.put("message",simpleService.getMessage());returnmsg;}}关键任务完成于注1,这里的servicebean是通过名称连接的。此时,如果你访问http://localhost:8080/simple,你可以看到服务层的响应:{"message":"Asimpleservicemessage}.4.ReactiveNIOusingMicronaut接下来,我们来讨论一下Micronaut和Reactor的结合。在这种情况下,我们将重构当前应用程序以使用Reactor和非阻塞IO。应用程序仍然执行相同的任务,但背后scenes使用的是非阻塞栈——Reactor和Netty,前面提到Micronaut3默认不包含响应式库,因此如下面的清单5所示,我们首先需要在Maven的POM中添加Reactor核心。清单5.在pom.xml中添加Reactor
