文档章节

Quarkus框架入门之一:Quarkus框架介绍及简单示例

centychen
 centychen
发布于 05/15 12:22
字数 1456
阅读 285
收藏 6

开篇

最近几年,Spring全家桶横扫其它Java框架,已然成为事实标准,单体应用使用Spring Framework+Spring Boot,服务治理Spring Cloud,生态完善,各种组件层出不穷。曾经还玩过JFinal和Nutz等国内的开发框架,但是仅仅是私下玩玩,实际工作过程中,还是Spring的天下,很少会选择其它小众的框架(谁知道会不会有填不完的大坑)。 最近在社区闲逛的时候,发现一个Red Hat开源的Java框架Quarkus,定位为GraalVM和OpenJDK HotSpot量身定制的一个Kurbernetes Native Java框架。虽然开源时间较短,但是生态方面也已经达到可用的状态,自身包含扩展框架,已经支持像Netty、Undertow、Hibernate、JWT等框架,足以用于开发企业级应用,用户也可以基于扩展框架自行扩展。

术语简介

  • **Cloud Native Application:**即云原生应用,是由 Pivotal 的Matt Stine在2013年提出的,个人认为所谓云原生应用也是SAAS服务的一种,针对近年来云计算平台的发展,SAAS服务进一步发展的产物。
  • **Graalvm:**Oracle在2018年开源的一个通用型虚拟机,可以用来构建多语言应用,也可以简单地用来编译和构建Java应用,甚至可以将Java应用构建成Native Image,以提高应用的启动速度以及降低应用的内存占用,目前还是一个实验性产品。
  • 12-Factor::全称为“The Twelve-Factor App”,可以认为是SAAS服务的参考标准,对SAAS服务开发的各个方面都提出了明确的参考标准,但是就像Restful API一样,这是一个建议标准,每个开发人员理解都可能有偏差。

构建一个Quarkus应用

创建项目

  • 开发环境 除了一般的Java开发环境外,你还需要额外安装Graalvm,用于构建Native应用。 Graalvm安装参考:Install GraalVM

  • 创建项目 你可以使用Maven命令快速创建一个Quarkus应用,也可以自行搭建。 **方式一:**快速创建命令如下(来源于官网):

mvn io.quarkus:quarkus-maven-plugin:0.15.0:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.quickstart.GreetingResource" \
    -Dpath="/hello"

**方式二:**自行搭建,首先创建一个Maven项目,添加Quarkus的依赖和plugin,参考如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.centychen</groupId>
    <artifactId>quarkus-simple-example</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <surefire-plugin.version>3.0.0-M3</surefire-plugin.version>
        <quarkus.version>0.14.0</quarkus.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- 管理Quarkus依赖包版本 -->
            <dependency>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-bom</artifactId>
                <version>${quarkus.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- 使用Resteasy框架 -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-resteasy</artifactId>
        </dependency>

        <!-- Junit -->
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Rest接口测试 -->
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!-- quarkus maven插件 -->
            <plugin>
                <groupId>io.quarkus</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- 用于单元测试 -->
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${surefire-plugin.version}</version>
                <configuration>
                    <systemProperties>
                        <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                    </systemProperties>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

编写Resource

编写Resource类,实际就是Restful接口,按照Restful思想,接口即资源,所以叫Resource挺贴切的。该类中实现一个/hello/{name}接口,参考如下:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

/**
 * @author: cent
 * @email: chenzhao@viomi.com.cn
 * @date: 2019/5/4.
 * @description:
 */
@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/{name}")
    public CompletionStage<String> hello(@PathParam("name") String name) {
        //使用异步响应
        return CompletableFuture.supplyAsync(() -> String.format("Hello,%s!", name));
    }
}

启动测试

你会发现,上面没有像Spring Boot框架一样编写main方法,也没有部署到Web容器(如Tomcat、Undertow等)中,那么应该如何启动测试呢?很简单,命令行进入项目根目录,通过以下命令启动开发测试:

mvn compile quarkus:dev

访问http://localhost:8080/hello/cent,返回如下: image.png

至此,一个简单的基于Quarkus框架的Restful服务已经搭建好了,好像跟Spring Boot比较,除了启动方式,其它没太大差别哦?下面才是差异的地方。

构建Native Image

Quarkus定位是一个Native Java的框架,那么怎样将项目构建成Native应用呢?只需要两个步骤:

  • pom.xml中增加构建profile配置,如下:
    <profiles>
        <profile>
            <id>native</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>io.quarkus</groupId>
                        <artifactId>quarkus-maven-plugin</artifactId>
                        <version>${quarkus.version}</version>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>native-image</goal>
                                </goals>
                                <configuration>
                                    <enableHttpUrlHandler>true</enableHttpUrlHandler>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
  • 使用mvn package -Pnative命令构建Native Image,构建完成后,target目录下会存在一个名字为[project name]-runner的文件,这个就是应用的可执行文件,你可以拷贝到其它目录运行,运行如下:
./quarkus-simple-example-1.0-SNAPSHOT-runner 
2019-05-15 12:02:31,199 INFO  [io.quarkus] (main) Quarkus 0.14.0 started in 0.012s. Listening on: http://[::]:8080
2019-05-15 12:02:31,201 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]

总结

上面仅仅是Quarkus的一个简单示例,搭建一个Restful服务并构建成Native Image。完成这一步之后,你还可以将Native Image构建成Docker镜像并使用Kubernetes进行部署,后面的步骤与Spring Boot应用构建和发布没太大差异,在本文就不说了。 Quarkus目前还是一个很轻量级的框架,使用简单且启动超快,希望后续版本演进能够保持足够的轻量,如果变得像Spring全家桶那么庞大,估计启动也快不了了~

示例源码

参考文章及网站

© 著作权归作者所有

centychen
粉丝 38
博文 29
码字总数 26690
作品 0
广州
技术主管
私信 提问
加载中

评论(5)

朝夕_
朝夕_

引用来自“lingJTC”的评论

111

引用来自“lingJTC”的评论

2222

引用来自“lingJTC”的评论

000
3224324
gitOpen_1
gitOpen_1
没有颠覆性的东西是很难动摇spring的地位的,就像spring干掉j2ee成为事实标准,不就是spring的颠覆性吗
lingJTC
lingJTC

引用来自“lingJTC”的评论

111

引用来自“lingJTC”的评论

2222
000
lingJTC
lingJTC

引用来自“lingJTC”的评论

111
2222
lingJTC
lingJTC
111
Quarkus框架入门之二:依赖注入

前言 Spring框架最开始被我熟知就是AOP和IOC,其中IOC在开发过程中更是被广泛使用,如果切换到一个新的框架没有了依赖注入和控制反转,那么可以说一夜回到解放前了。那么,Quarkus框架中有没...

centychen
05/18
0
0
Quarkus框架入门之三:Quarkus与Spring Boot启动性能对比

开篇 为什么要从安逸的Spring全家桶切换到Quarkus框架呢?Quarkus有什么优势?除了能够编译成Native Application外,还有什么值得我们使用它的吗?Spring启动优化是个大难题,有专门出书写S...

centychen
05/19
0
0
Hibernate Search 6.0.0.Alpha3 发布,数据检索框架

Hibernate Search 6.0.0.Alpha3 已发布,这是仍处于开发中的 6.0 分支的第三个版本。该版本主要增加了对更多字段类型和谓词的支持,并带来更一致、更简洁的 API。 入门 Hibernate Search 6 如...

局长
03/24
0
0
Quarkus 0.12.0 发布,下一代 K8s 原生 Java 框架

Quarkus 0.12.0 发布了,Quarkus 是一个用于编写 Java 应用的云原生、容器优先框架。 此版本包含 213 个问题和 PR。 io.quarkus quarkus-bom 0.12.0 主要更新内容: [1579] 提供 Kafka 快速入...

h4cd
03/26
0
1
云原生、容器优先 Java 开发框架 - Quarkus

Quarkus 是一个用于编写 Java 应用的云原生、容器优先框架。 特性包括: 容器优先:最小的Java应用程序,最适合在容器中运行 云原生:在 Kubernetes 等环境中采用 12 要素原则。 统一命令式与...

匿名
03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

对集合的理解

开端 同事小G提了一点,Set都是无序的,但是我之前有看到过treeSet是有序的,就和他讨论了起来,还百度了一下,有序。然而他只是淡淡的说自己敲代码验证一下。 TreeSet 循环int类型 1~20,毫...

无极之岚
31分钟前
0
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
35分钟前
0
0
Ajax

定义 Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,用于创建动态网页 Ajax=Asynchronous Javascript And XML(异步的JavaScript和XML) 原理 XMLHttpRequest对象(异...

星闪海洋
昨天
2
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
3
0
Spring中如何使用设计模式

关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。 1. 策略模式 关于策略模式的使用方式,在S...

爱宝贝丶
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部