美文网首页JavaQuarkus框架入门springcloud学习,微服务
Quarkus框架入门之一:Quarkus框架介绍及简单示例

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

作者: centychen | 来源:发表于2019-05-15 12:13 被阅读0次

    开篇

    最近几年,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全家桶那么庞大,估计启动也快不了了~

    示例源码

    参考文章及网站

    相关文章

      网友评论

        本文标题:Quarkus框架入门之一:Quarkus框架介绍及简单示例

        本文链接:https://www.haomeiwen.com/subject/yarsaqtx.html