1.什么是Micronaut
Micronaut是用于构建轻量级模块化应用程序的JVM框架。 它是由OCI(Grails给我们的公司)开发的。 Micronaut是一个现代框架,旨在使创建快速便捷的微服务应用程序变得容易。
Micronaut包含类似于Spring等现有框架的功能,但同时它实现了一些新的想法,这是它的标志。 连同对Java,Groovy和Kotlin的支持,它提供了许多创建应用程序的方法。
2.主要特点
Micronaut最令人兴奋的功能之一是在编译时进行依赖项注入(DI)。 大多数框架使用反射和代理对象在运行时注入依赖项。 Micronaut还在收集阶段收集数据以进行依赖项注入。 结果是更快的应用程序启动时间和更少的内存消耗。
他的下一个机会是对客户端和服务器的反应式编程提供一流的支持。 解决方案开发人员可以选择是否采用反应性方法的特定实现,并且开箱即用地支持RxJava和Project Reactor。
另外,Micronaut具有一些功能,使其成为一个出色的云原生开发框架。 它支持许多服务发现机制,例如Eureka和Consul,还可以与各种分布式跟踪系统(例如Zipkin和Jaeger)一起使用。
此外,它提供了对创建lambda AWS函数的支持,从而使创建无服务器应用程序变得容易。
3.开始
最简单的入门方法是使用SDKMAN:
> sdk install micronaut 1.0.0.M2
SDKMAN将安装构建,测试和部署Micronaut应用程序所需的所有二进制文件。 此外,您还将收到一个控制台应用程序Micronaut CLI,可让您轻松启动新项目。
在Sonatype和Github上也可以使用二进制工件。
在以下各节中,我们将介绍Micronaut的一些功能。
4.依赖注入(DI)
如前所述,Micronaut在编译时处理依赖项注入,这使其与大多数IoC容器区分开。
但是,它完全支持JSR-330批注,因此Bean处理类似于其他IoC框架。
要在我们的代码中插入bin,我们使用
@Inject
:
@Inject private EmployeeService service;
@Inject
工作方式与
@Autowired
一样,可以与字段,方法,构造函数和参数一起使用。
默认情况下,所有bean都有一个作用域-原型。 我们可以使用
@Singleton
批注快速创建
@Singleton
。 如果多个bean实现相同的接口,则可以使用
@Primary
批注解决冲突:
@Primary @Singleton public class BlueCar implements Car {}
当bean是可选的时,可以使用
@Requires
,或者在满足某些条件时执行注入。
在这方面,它的行为与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 {}
5.创建一个HTTP服务器
现在,让我们尝试创建一个简单的HTTP服务器应用程序。 首先,我们将使用SDKMAN:
> mn create-app hello-world-server -build maven
因此,我们将使用Maven在名为hello-world-server的目录中创建一个新的Java项目。 在此目录中,我们将找到主要的应用程序代码,Maven POM文件和其他项目文件。
最简单的应用程序如下所示:
public class ServerApplication { public static void main(String[] args) { Micronaut.run(ServerApplication.class); } }
5.1阻止HttpRequest
应用程序本身几乎不执行任何操作。 让我们添加一个带有两个处理程序的控制器。 两者都将返回问候语,但是一个将响应GET请求,而另一个将响应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; } }
从翻译者那里来:您谦虚的仆人去了,做了本文所述的一切。 如果此时您将要启动该应用程序并查看其是否有效,那么请不要忘记在Eclipse / IntelliJ IDEA中启用注释处理。5.2反应式IO
默认情况下,Micronaut将这些处理程序实现为传统的阻塞I / O。 但是,我们可以通过简单地将返回类型更改为任何反应性非阻塞类型来快速实现非阻塞处理程序。
例如,使用RxJava,我们可以使用
Observable
。 同样,使用Reactor,我们可以返回
Mono
或
Flux
类型:
@Get("/{name}") public Mono<String> greet(String name) { return Mono.just(greetingService.getGreeting() + name); }
从翻译器:对于此示例,您将需要Maven依赖项中的Project Reactor: <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> <version>3.1.8.RELEASE</version> </dependency>
阻塞处理程序和非阻塞处理程序都使用Netty HTTP服务器。
通常,请求是在启动时创建的主I / O线程池中处理的,这使它们被阻止。
但是,如果处理程序返回非阻塞数据类型,则Micronaut将使用Netty事件循环,从而使整个请求成为非阻塞。
6.创建一个HTTP客户端
现在,让我们为刚刚创建的处理程序创建一个客户端应用程序。 Micronaut提供了两种创建HTTP客户端的方法:
-陈述式
-软件
6.1声明式创建HTTP客户端
创建的第一个也是最简单的方法是使用声明性方法:
@Client("/greet") public interface GreetingClient { @Get("/{name}") String greet(String name); }
请注意,我们没有实现一行代码来调用该服务。 相反,Micronaut理解如何从方法签名和注释中调用服务。
为了测试该客户端,我们可以创建一个使用服务器API来运行嵌入式服务器的JUnit测试:
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"); } }
从翻译者那里:对于懒惰的好奇读者,Github上有一个现成的项目: github.com/jreznot/micronaut-introduction6.2以编程方式创建HTTP客户端
如果需要对传统HTTP客户端的行为和实现进行更多控制,则可以选择创建传统HTTP客户端:
@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"); } }
客户端默认使用RxJava,因此您可以轻松使用阻塞和非阻塞调用。
7. Micronaut CLI
在创建应用程序时,我们已经看到Micronaut CLI实用程序的工作方式。
在我们的情况下,它是一个单独的应用程序,但是该实用程序支持其他几个功能。
7.1来自多个应用程序的项目(联合会)
在Micronaut中,联盟只是在单个项目中开发的一组独立应用程序。 使用联合身份验证,我们可以轻松地将它们全部一起管理,并确保它们使用相同的设置。
当我们使用CLI生成联合身份验证时,该实用程序采用与create-app命令相同的参数。 她将创建项目的主目录,并将每个应用程序放在一个子目录中。
7.2功能
创建应用程序或联盟时,我们可以选择应用程序需要的功能。 这使您可以在项目中使用最少的依赖项集。
我们在saw
-features
参数中指出了可能性,并用逗号将它们分开。
您可以使用以下命令列出可用功能:
> 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
来自翻译者:好吧,这里不要感到惊讶,团队必须在项目目录之外运行。 项目目录不起作用,也许在.M3版本中,他们已将其修复。 她已经走了。7.3现有项目
我们可以使用CLI修改现有项目。 这使我们可以创建垃圾箱,客户端,控制器等。 当我们在项目目录中运行“ mn”命令时,以下命令将可用:
> mn help | Command Name Command Description
8.结论
在对Micronaut的简短介绍中,我们了解了创建阻塞和非阻塞HTTP服务器和客户端的难易程度。 我们还研究了几个CLI功能。
这只是Micronaut提供的一小块蛋糕。 在幕后,它支持无服务器功能,服务发现,分布式跟踪,监视和指标,分布式配置等。
但是,由于Micronaut的许多功能是从现有框架(例如Grails和Spring)中借用的,因此它提供的独特功能使其与众不同。