如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

全栈 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

2018-10-23 05:313019
用户头像

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

关注

评论 2 条评论

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

技术探索系列 - 轻松带你掌握 JMM(1)

码界西柚

Java JVM JMM 并发 5月日更

如何在 GitHub 上面为你的项目选择开源许可证

HoneyMoose

从零搭建一款PC页面编辑器PC-Dooring

徐小夕

大前端 可视化 lowcode 代码编辑器

【人间碎片】关于努力这件事

南吕

人生修炼 人生故事

BPF 之巅:洞悉 Linux 系统和应用性能

博文视点Broadview

Excel用户如何学习数据分析语言DAX?

博文视点Broadview

Redis-技术专区-知识问题总结大全(上篇)

码界西柚

redis 5月日更 问题分析

fastadmin+xunsearch题库系统搭建教程

一颗小树

php thinkphp fastadmin xunsearch 题库系统

InfoQ & 声网Agora 技术开放日邀请函

Jessie

音视频 声网

2021年十大突破性技术

石云升

读书笔记 5月日更

如何选择开源许可证

HoneyMoose

复杂Gremlin查询的调试方法

Tom(⊙o⊙)

gremlin调试

当代软件IT大学生的技术学习之路

Nydia

签约计划

鹅厂疯子整理了万字Java笔记!小白:硬核资源基础知识已入门

牛哄哄的java大师

Java Object

你的烂代码终于有了解决方案

博文视点Broadview

外行在谈论流派,大师在讨论颜料

顿晓

极限编程 5月日更 门道

当你觉得老板的决策是错的,你会怎么做?

石云升

职场经验 5月日更

OAuth 2.0 了解了,OAuth 2.1 呢?

Zhang

OAuth 2.0 认证授权 OAuth 2.1

了解代理服务器

进击的梦清

nginx Linux 运维 代理原理

A “word-wrap” functionality(一个字符串包裹函数)

HoneyMoose

将本地文件/文章上传到 GitHub 的流程

彭宏豪95

git GitHub 效率 编程

SwiftUI @ Netflix:推动新技术落地是怎样一种体验?

故胤道长

swift 移动开发 iOS Developer SwiftUI

手机屏幕投屏到桌面的离线方案

黄敏

限时白嫖!腾讯内部员工培训Java资料,网友:大厂就是不一样

牛哄哄的java大师

Java

本文标题不能描述本文内容

小天同学

读书 哲学 读后感 4月日更

北美亚特兰大一金融服务公司面试总结

HoneyMoose

书单 | 月度畅销好书,助你技能满格,摆脱低效,走向财富人生

博文视点Broadview

网络攻防学习笔记Day1

穿过生命散发芬芳

5月日更 网络攻防

【LeetCode】员工的重要性Java题解

Albert

算法 LeetCode 5月日更

名可名

顿晓

5月日更 命名

超硬核!阿里技术大牛肝了2晚整理的Java知识,这也太强了!

飞飞JAva

Java Java泛型

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