Micronaut框架的简单使用介绍

什么是Micronaut

Micronaut是一个基于JVM的框架,用于构建轻量级、模块化的应用程序。Micronaut是由创建Grails的同一家公司OCI开发的最新框架,旨在使创建微服务变得快速和简单。

虽然Micronaut包含一些类似于Spring等现有框架的特性,但它也有一些新特性使它与众不同。通过对Java、Groovy和Kotlin的支持,它提供了多种创建应用程序的方法。

主要特点

Micronaut最令人兴奋的特性之一是它的编译时依赖注入机制。大多数框架使用反射和代理在运行时执行依赖注入。然而,Micronaut在编译时构建其依赖注入数据。结果是更快的应用程序启动和更小的内存占用。

另一个特性是它对客户端和服务器的反应式编程的一流支持。由于RxJava和projectreactor都受支持,所以特定的反应式实现的选择权留给了开发人员。

Micronaut还具有一些特性,使其成为开发云本地应用程序的优秀框架。它支持多种服务发现工具,如Eureka和consur,还可以与不同的分布式跟踪系统(如Zipkin和Jaeger)一起使用。

它还提供了对创建AWS lambda函数的支持,使得创建Serverless无服务器应用程序变得容易。

入门

最简单的入门方法是使用SDKMAN:

> sdk install micronaut 1.0.0.RC2

这将安装我们构建、测试和部署Micronaut应用程序所需的所有二进制文件。它还提供Micronaut CLI工具,使我们能够轻松地启动新项目。

在下面的部分中,我们将介绍框架的一些特性。

依赖注入

如前所述,Micronaut在编译时处理依赖注入,这与大多数IoC容器不同。

但是,它仍然完全支持JSR-330注释,因此使用bean与其他IoC框架类似。

为了将bean自动连接到我们的代码中,我们使用@Inject:

@Inject
private EmployeeService service;

@Inject注释的工作方式与@Autowired类似,可以用于字段、方法、构造函数和参数。

默认情况下,所有bean的作用域都是一个原型。我们可以使用@singleton快速创建单例bean。如果多个类实现相同的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 {}

构建HTTP服务器

现在让我们看看如何创建一个简单的HTTP服务器应用程序。首先,我们将使用SDKMAN创建一个项目:

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

这将在名为helloworld server的目录中使用Maven创建一个新的Java项目。在这个目录中,我们将找到主要的应用程序源代码、Maven POM文件和项目的其他支持文件。

默认应用程序非常简单:

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

阻塞HTTP

就其本身而言,这个应用程序不会有太大的作用。让我们添加一个具有两个端点的控制器。两者都将返回问候语,但其中一个将使用GET HTTP动词,另一个将使用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;
    }
}

反应式IO

默认情况下,Micronaut将使用传统的阻塞I/O实现这些端点。但是,我们可以通过将返回类型更改为任何反应性非阻塞类型来快速实现非阻塞端点。

例如,对于RxJava,我们可以使用Observable。同样,在使用Reactor时,我们可以返回Mono或Flux数据类型:

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

对于阻塞和非阻塞端点,Netty都是用于处理HTTP请求的底层服务器。

通常,请求在启动时创建的主I/O线程池中处理,使它们阻塞。

但是,当从控制器端点返回非阻塞数据类型时,Micronaut使用Netty事件循环线程,使整个请求成为非阻塞的。

构建HTTP客户端

现在让我们构建一个客户机来使用刚刚创建的端点。Micronaut提供两种创建HTTP客户端的方法:

  • 声明性HTTP客户端
  • 可编程的HTTP客户机

声明性HTTP客户端

第一种也是最快的创建方法是使用声明性方法:

@Client("/greet")
public interface GreetingClient {
    @Get("/{name}")
    String greet(String name);
}

注意我们没有实现任何代码来调用我们的服务。相反,Micronaut理解如何从我们提供的方法签名和注释调用服务。

为了测试这个客户机,我们可以创建一个JUnit测试,它使用嵌入式服务器API来运行我们服务器的嵌入式实例:

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客户端

如果我们需要对其行为和实现进行更多的控制,我们还可以选择编写更传统的客户端:

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

默认的HTTP客户机使用RxJava,因此可以轻松地处理阻塞或非阻塞调用。

Micronaut客户端

当我们使用Micronaut CLI工具创建示例项目时,我们已经看到了它的实际应用。

在我们的例子中,我们创建了一个独立的应用程序,但它还有其他一些功能。

联合项目

在Micronaut中,联合只是一组位于同一目录下的独立应用程序。通过使用联邦,我们可以轻松地将它们管理在一起,并确保它们获得相同的默认值和设置。

当我们使用CLI工具生成联合体时,它采用与create app命令相同的参数。它将创建一个顶级的项目结构,每个独立的应用程序将在其子目录中创建。

特征

创建独立应用程序或联合时,我们可以决定应用程序需要哪些功能。这有助于确保项目中包含最小的依赖项集。

我们使用-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

现有项目

我们还可以使用CLI工具来修改现有的项目。使我们能够创建bean、客户机、控制器等等。当我们在现有项目中运行mn命令时,将有一组新的命令可用:

> 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

小结

在对Micronaut的简要介绍中,我们看到了构建阻塞和非阻塞HTTP服务器和客户端是多么容易。此外,我们还探讨了它的CLI的一些特性。

但这只是它提供的功能的一小部分。它还完全支持serverless功能、服务发现、分布式跟踪、监视和度量、分布式配置等等。

尽管它的许多特性都是从Grails和Spring等现有框架中派生出来的,但它也有许多独特的特性帮助它脱颖而出。

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

以上就是Micronaut框架的简单使用介绍的详细内容,更多关于Micronaut框架的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java中JFinal框架动态切换数据库的方法

    需求:需要根据企业ID切换对应的数据库,同时,后期可动态增加数据库配置 JFinal框架中对于对于多数据源配置有两种方式: 1.通过配置文件配置,有多少数据库就要配置多少,服务启动时加载所有数据库,缺点:不能动态增加数据库 2.只配置一个主数据库信息就可以了,其他数据库信息保存在表中,通过读取表数据加载数据库连接,优点:在数据表中增加数据库配置即可动态增加数据库连接. 本次主要介绍第2种方法: 一.新建数据表:保存数据库连接信息 配置表对应的实体类 public class DbDto { /*

  • Java安全框架——Shiro的使用详解(附springboot整合Shiro的demo)

    Shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理 三个核心组件:Subject, SecurityManager 和 Realms Subject代表了当前用户的安全操作 SecurityManager管理所有用户的安全操作,是Shiro框架的核心,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务. Realm充当了Shiro与应用安全数据间的"桥梁"或者"连接器&q

  • Java高并发测试框架JCStress详解

    前言 如果要研究高并发,一般会借助高并发工具来进行测试.JCStress(Java Concurrency Stress)它是OpenJDK中的一个高并发测试工具,它可以帮助我们研究在高并发场景下JVM,类库以及硬件等状况. JCStress学起来很简单,而且官方也提供了许多高并发场景下的测试用例,只要引入一个jar包,即可运行研究. 如何使用JCStress 此演示用maven工程,首先需要引入jar包,核心包是必须要的,样例包非必须要,此是为了演示其中的例子. <dependencies>

  • java 非常好用的反射框架Reflections介绍

    Reflections通过扫描classpath,索引元数据,并且允许在运行时查询这些元数据. 使用Reflections可以很轻松的获取以下元数据信息: 1)获取某个类型的所有子类:比如,有一个父类是TestInterface,可以获取到TestInterface的所有子类. 2)获取某个注解的所有类型/字段变量,支持注解参数匹配. 3)使用正则表达式获取所有匹配的资源文件 4)获取特定签名方法. 通常的用法有: 引入依赖jar <dependency> <groupId>org

  • Java爬虫框架之WebMagic实战

    一.介绍 WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 二.如何学习 1.查看官网 官网地址为:http://webmagic.io/ 官网详细文档:http://webmagic.io/docs/zh/ 2.跑通hello world示例(具体可以参考官网,也可以参考博客) 我下面写的单元测试案例,可作为Hello World示例. 注意需要导入Maven依赖: <dependency> <groupId>us.

  • 手把手教你从零设计一个java日志框架

    输出内容 - LoggingEvent 提到日志框架,最容易想到的核心功能,那就是输出日志了.那么对于一行日志内容来说,应该至少包含以下几个信息: 日志时间戳 线程信息 日志名称(一般是全类名) 日志级别 日志主体(需要输出的内容,比如info(str)) 为了方便的管理输出内容,现在需要创建一个输出内容的类来封装这些信息: public class LoggingEvent { public long timestamp;//日志时间戳 private int level;//日志级别 pri

  • 使用JAVA+Maven+TestNG框架实现超详细Appium测试安卓真机教程

    前言:前段时间做了selenium的学习和实践,有点意犹未尽,所以自己就又学了下Appium的使用,因为这一套东西在16年已经停止维护了,不管实现还是设计上都不是很容易,也踩了很多坑,现在在此记录下大概过程.后续有时间再完善手册. 一.准备 安装SDK,配置环境变量 链接: https://pan.baidu.com/s/1g2QaWjdfg6Txa0gZf9kk3A 提取码: 8aaz windows配置环境SDK变量 我的电脑右键->属性 点击高级系统设置 点击环境变量 点击新建按钮,变量名

  • 分享我的第一次java Selenium自动化测试框架开发过程

    由于公司的开发团队偏向于使用Java技术,而且公司倡导学习开源技术,所以我选择用Java语言来进行Selenium WebDriver的自动化框架开发.由于本人没有Java开发经验,以前虽然学过QTP但从没有接触过Selenium,正好通过这个机会能学习一下自动化测试,同时也学习一下基本的Java开发过程. 一.首先是搭建框架开发环境 按照网上的方法部署eclipse,建立TestAction工程,并Import引用JDK和Selenium-2.44完整包 二.继续引用和安装相关jar包 1.首

  • java mybatis框架配置详解

    一个框架的使用,必然离不开其中的组件支持.我们在下载完mybatis框架后,因为大部分的内部结构还没有启动,就要手动的对其进行配置.在之前有提到,mybatis框架的作用就有数据库方面的,所以本篇文章带来了数据库和sql方面的配置方法,大家一起往下面看看具体操作. 1.配置数据库 创建mybatis的配置文件,配置数据库的信息.数据库我们可以配置多个,但是默认的只能用一个. <?xml version="1.0" encoding="UTF-8"?> &

  • java swing框架实现贪吃蛇游戏

    本文实例为大家分享了java swing实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.编写main方法 package game; import java.awt.Graphics; import javax.swing.*; public class snakeMain extends JFrame { public snakeMain() { snakeWin win = new snakeWin(); add(win); setTitle("̰贪吃蛇v1.0"); se

随机推荐