写点什么

全栈 JVM 框架 Micronaut 通向 1.0 版本之路

  • 2018-10-23
  • 本文字数:5217 字

    阅读完需:约 17 分钟

经过一年的发展,随着 Object Computing (OCI)发布候选版本 RC1 RC2 RC3 Micronaut 1.0 在过去三周内加速了。Micronaut 是一个基于 JVM 的全栈框架,用于创建可以用 Java、Groovy 和 Kotlin 编写的基于微服务的应用程序。

在今年早些时候的 Greach 大会上,OCI 首席软件工程师 Graeme Rocher 和 Grails&Micronaut 产品主管介绍了Microaut。随后,在5 月底,Micronaut 开放了源代码。

三个候选版本包括以下新特性: GraalVM 本地镜像支持、 Swagger (OpenAPI)编译时支持、编译时验证以及编译时映射注解。Micronaut 的测试框架 Micronaut Test 1.0 RC1 也是在 RC3 中发布的。

Micronaut 使用了依赖注入和预编译(AOT)。以下是来自其网站的介绍:

基于反射的 IoC 框架为代码中的每个字段、方法和构造函数加载和缓存反射数据,而使用 Micronaut,应用程序的启动时间和内存消耗将不受代码库大小的限制。

Netty 为基础,Micronaut 提供了他们自己的非阻塞 Web 服务器。为了减少内存消耗,Micronaut 反应式客户端可以用声明的方式构建,并在编译时实现。

“配置文件(Profiles)”

Micronaut 内置了几个配置文件,用于生成可以运行的应用程序框架,作为开发Web 或命令行应用程序的构建块。每个配置文件由一个模板和特定于该配置文件的附加命令组成。例如, create-app启动服务的配置文件,其中包含用于构建控制器(create-controller)和客户端(create-client)类的附加命令,这些命令在其他配置文件中可能不可用。

入门

下载并安装Micronaut 之后,可以通过命令行或Microaut shell 创建应用程序。受到 Grails 中人们熟知的命令行接口的启发,Micronaut 遵循了同样的应用程序创建概念。考虑以下命令:

复制代码
$ mn create-app org.redlich.demo

如下所示,这将创建一个 Java 应用程序和 Gradle 项目,根文件夹为demo,包名为org.redlich



注意,其中包含了测试目录结构、Dockerfile 和 YAML 配置文件。文件micronaut-cli.yml提供了关于项目的具体信息:

复制代码
profile: service
defaultPackage: org.redlich
---
testFramework: junit
sourceLanguage: java

生成的 Java 源代码文件Application.java启动了一个 Micronaut 服务器:

复制代码
package org.redlich;
import io.micronaut.runtime.Micronaut;
public class Application {
public static void main(String[] args) {
Micronaut.run(Application.class);
}
}

构建并运行这个初步应用:

复制代码
$ ./gradlew run

向上面的项目中添加一个控制器:

复制代码
$ mn create-controller HelloController

如下所示,文件HelloController.javaHelloControllerTest.java被添加到项目。



在生成的HelloController.java文件中,注意下@Controller注解中的端点如何根据HelloController控制器的名称命名为“/hello”:

复制代码
package org.redlich;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.HttpStatus;
@Controller("/hello")
public class HelloController {
@Get("/")
public HttpStatus index() {
return HttpStatus.OK;
}
}

Java 和 Gradle 是默认的语言和构建工具。要生成 Groovy 和 Kotlin 应用程序,请执行下面的命令:

复制代码
$ mn create-app org.redlich.demo --lang groovy
$ mn create-app org.redlich.demo --lang kotlin

也支持生成 Maven 项目:

复制代码
$ mn create-app org.redlich.service --build maven
$ ./mvnw compile exec:exec

Micronaut 教程第一部分中,OCI 软件工程师 Sergio del Amo Caballero 演示了如何使用 Java、Groovy 和 Kotlin 三种语言创建三个微服务。Rocher 向 InfoQ 介绍了这个最新版本。

InfoQ:是什么促使 OCI 开发了这个新的微服务框架?

Graeme Rocher: 在过去的几年里,技术领域发生了巨大的变化,特别地,如果你看看类似 Docker、Kubernetes 这样的系统以及无服务器运动,你会发现,它们实际上都针对低内存微服务和低开销应用程序而进行了优化。其结果是,像 Go 和 Node 这样的语言在这些平台上体现出了比 Java 更显著的吸引力,因为它们具有出色的冷启动性能和内存消耗。有一个非常好的问题,可以问下自己,如果 Docker 和 Kubernetes 团队有各种技术选项,为什么要选择 Go 而不是 Java 来实现这些平台?在我看来,答案很简单:如果他们用 Java 编写了那些技术栈,并且有了今天这些技术选项,那么我们就都需要一台超级计算机才能让笔记本电脑在本地运行它们。

原因是多种多样的。一方面是语言层面的限制。JVM 是一项惊人的技术成果,但对于短时间运行的操作(如无服务器函数),它提供的优化往往就不存在了,但是,你仍然需要拖着整个 JVM 来运行你的应用程序。像 GraalVM 这样的项目有可能通过将 Java 应用程序编译成本地镜像来解决这些限制,但是,坦率地说,框架设计人员在提高 Java 应用程序的效率方面有很大的作用。

在框架层,传统的 JVM 框架(如 Spring 和 Java/Jakarta EE)已经有超过 10 年的历史了,那时,每个人都在部署单体应用程序,它们主要是围绕着反射和注解的运行时分析来构建。这种方法的问题在于,由于各种各样的问题,从类型擦除,到有限的注解 API,再到反射逻辑的相对缓慢,所以,几乎不可能构建一个 Java 框架,启动速度超快,而内存消耗超低。框架运行时的负担是巨大的。如果你观察一下 Spring 在运行时所做的工作,就会发现这有些不可思议,从用 ASM 解析字节代码来生成注解元数据,到积极缓存反射信息以避免不可避免的重复读取减慢速度。在缓存所有这些运行时生成的信息与实现快速启动和低内存消耗的目标之间存在着不可调和的冲突。

我们相信,Micronaut 是面向未来的框架的基础,通过消除所有反射的使用,以及在编译时通过一组注解处理器和执行预编译(AOT)的 AST 转换,生成所有注解元数据、代理和框架基础设施,消除这种矛盾。这使得 Micronaut 能够实现极快的启动速度、低内存消耗,并且实现与 GraalVM 本地镜像兼容性的重大改进。

当然,Java 生态系统有大量的项目是基于 Java 的,像 Spring、Kafka、Cassandra、Hadoop、Grails 等,它还有一个丰富的语言生态系统,包括 Groovy、Scala、Kotlin、Java、Clojure 等。因此,这也不全是和低内存占用的微服务与无服务器应用程序有关,有许许多多的工作负载仍然受益于 JVM 和 JIT。然而,即使对于这些工作负载,我们也相信,通过在启动时间和内存消耗方面比其他框架更高效,Micronaut 可以提供很多东西。

InfoQ:你们有计划在 Micronaut 中支持 JVM 语言 Scala 和 / 或 Clojure 吗?

Rocher::我们在构建 Micronaut 时已经考虑了多种语言,实际上,我们现在已经通过为每种语言创建一个公共的 AST 来支持 Java、Kotlin 和 Groovy。我们计划在某个时候通过 Scala 编译器插件(参见这里)添加Scala 支持,不过,如果Scala 社区有人希望帮助我们加速这个过程,我们很乐意听取他们的建议。Clojure 很有趣,关于如何实现Clojure 支持,我们当然需要Clojure 社区的输入。

InfoQ:既然 GraalVM 支持非 JVM 语言,是不是有一天可以使用 GraalVM 支持的语言构建 Micronaut 应用程序?

Rocher:我想可以肯定,它将促成“挎斗模式(sidecars)”,并且更容易与其他语言一起集成到一个 Micronaut 应用程序中。

InfoQ:您预计 Micronaut 正式版会在何时发布?

Rocher:Micronaut 1.0 正式版将于 10 月 23 日发布。

InfoQ:Micronaut 的路线图是什么样子,尤其是在正式版本发布之后?

Rocher:Micronaut 1.0 就是要建立一个稳定的基线。由于 Micronaut 使用 AOT 编译,所以预编译元数据格式需要一个稳定的 1.0 版本。一旦 1.0 发布,我们计划与更多的技术(如 RabbitMQ、Kubernetes、GRPC、GraphQL 等)进行集成。

相关资源

查看英文原文: The Road to Micronaut 1.0 - A JVM-Based Full-Stack Framework

公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2018-10-23 05:312069
用户头像

发布了 1008 篇内容, 共 373.8 次阅读, 收获喜欢 340 次。

关注

评论 2 条评论

发布
用户头像
和play有什么区别
2018-11-13 07:32
回复
没有更多了
发现更多内容

潦草手写体也能轻松识别,快速提取文字不用愁

HMS Core

HMS Core

前端面试指南之JS面试题总结

loveX001

JavaScript

2小时开发《点球射门游戏》,动画演示思路(上),代码已开源

非喵鱼

Java 开源 游戏 12 月 PK 榜 世界杯足球游戏

做了一份前端面试复习计划,保熟~

loveX001

JavaScript

ZBC登录iZUMi Finance双挖池APY高达189%,极致通缩的典范

西柚子

Git实战(四)| Git分支管理实操,搞定在线合并和本地合并

霍格沃兹测试开发学社

掌握 CORS 跨域请求,读这一篇文章就够了

范家鹏

HTTP CORS 跨域 异步请求 跨域资源共享

深入理解JS作用域链与执行上下文

loveX001

JavaScript

MYSQL-INNODB索引构成详解

京东科技开发者

MySQL innodb 索引 B+树 InnoDB存储引擎

我把Idea给改了,看看有没有你常用的功能,没有,你告诉我,我给你造了

非喵鱼

Java 开源 IDEA springboot 12 月 PK 榜

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

跨机房ES同步实战

京东科技开发者

迁移 迁移数据 异步多活 Elastic Search 数据库·

区块链“入局”证券市场,未来前景有多大?

旺链科技

区块链 产业区块链 证券行业 12 月 PK 榜

Idea居然还有比Navicat、Datagrid工具还好用、还快的插件,效率又可提升一倍了

非喵鱼

Java MySQL redis IDEA 12 月 PK 榜

Git实战(五)| 让工作更高效,搞定Git的分支管理

霍格沃兹测试开发学社

面试官:MySQL 中 varchar(n) 中 n 最大取值为多少?

架构师之道

MySQL 编程 计算机

2 小时开发《点球射门游戏》,动画演示思路(下),代码已开源

非喵鱼

Java 开源 游戏 12 月 PK 榜 世界杯足球游戏

损失高达3亿美元|如何保护源代码安全?

SEAL安全

12 月 PK 榜 源代码安全 最小权限管理 零信任模型

IoT高级设备检索——设备管理运维类

阿里云AIoT

数据库 监控 物联网 传感器 Cloud Native

CTPN+CRNN算法端到端实现文字识别的实战开发

华为云开发者联盟

人工智能 华为云 文字识别 12 月 PK 榜

IPQ8074 Qualcomm Embedded Board Offers MU-MIMO 802.11ax WiFI 6//industrial wifi6 moudle

wallysSK

IPQ8074 ip8072

前端工程师leetcode算法面试必备-二分搜索算法(上)

js2030code

JavaScript LeetCode

手把手教你构建数据安全体系,守住安全合规红线

王巍

数据安全

算法 KECP 被顶会 EMNLP 收录,极少训练数据就能实现机器阅读理解

阿里云大数据AI技术

自然语言处理 机器学习 12 月 PK 榜 机器阅读

KAFKA EAGLE 监控MRS kafka之操作实践

华为云开发者联盟

开发 华为云 12 月 PK 榜

借用FinClip把小程序游戏运行到自有App中

Onegun

小游戏 小游戏开发 微信小游戏

前端刷完这12道滑动窗口,就可以出山面试了

js2030code

JavaScript LeetCode

前端面试题(附答案)

loveX001

JavaScript

百度 Android 直播秒开体验优化

百度Geek说

android 百度app 12 月 PK 榜 直播优化

基于阿里云IoT平台OTA进行APP确认升级的方案——业务架构类

阿里云AIoT

物联网 UED 数据格式

软件测试 | 版本控制神器GitHub的基本使用与踩坑

测试人

GitHub 软件测试 自动化测试 测试开发

全栈JVM框架Micronaut通向1.0版本之路_Java_Michael Redlich_InfoQ精选文章