• Quarkus框架介绍


    前言
    Java技术栈作为企业级开发的利器已经发展很多年,大家基于Java技术栈开发了大量的应用。随着微服务的快速发展,spring全家桶已然成为了java框架的事实标准,包括单体应用使用的spring Framework和springboot,微服务间服务治理框架spring cloud,生态系统完善,各种组件层出不穷。期间还出现过jfinal之类的框架,不过实际工作过程中还是spring为主,很少有公司会选择这些小众的框架。一方面由于这些框架的生态不如spring繁荣,很多功能需要去自己实现,还有一方面原因也怕踩坑。
    近几年由于云原生技术的普及,越来越多的用户开始使用容器来运行微服务应用。微服务架构的引入,使我们的服务颗粒度变得越来越小,轻量且能快速启动的应用能够更好的适应容器化环境。 以我们目前常规的Spring Boot应用来说,一般Restful服务的jar包大概是30M左右,如果我们将JDK以及相关应用打包成docker镜像文件大概是140M左右。而常规的Go语言的可执行程序生成镜像包一般不会超过50M。如何让臃肿的Java应用瘦身使他易于容器化,成为Java应用云原生化需要解决的问题。
    Quakus简介
    红帽开源的Quarkus项目,借助开源社区的力量,通过对业界广泛使用的框架进行了适配,并结合云原生应用的特点,提供了一套端到端的Java云原生应用解决方案。虽然开源时间较短,但是生态方面也已经达到可用的状态,自身包含扩展框架,已经支持像Netty、Undertow、Hibernate、JWT等框架,足以用于开发企业级应用,用户也可以基于扩展框架自行扩展。
    Quarkus定位为GraalVM*和OpenJDK HotSpot量身定制的一个Kurbernetes Native Java框架。
    *GraalVM:JVM为了提升效率,借助JIT及时编译技术对解释执行的字节码进行局部优化,通过编译器生成本地执行代码提升应用执行效率。GraalVM是Oracle实验室开发的新一代的面向多种语言的JVM即时编译器,在性能以及多语言互操作性上有比较好的表现。与Java HotSpot VM相比,Graal借助内联,逃逸分析以及推出优化技术可以提升2至5倍的性能提升。
     
    本文将会介绍如何搭建以及运行一个Quarkus应用
    创建项目
     
    开发环境
    除了一般的Java开发环境外,你还需要额外安装Graalvm,用于构建Native应用。
    Graalvm安装参考:https://www.graalvm.org/docs/getting-started/macos
     
    新建项目
    首先创建一个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.test</groupId>
        <artifactId>quarkus-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>
            <!-- quarkus Restful框架 -->
            <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>
     
    编写代码
    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: lvgang
     * @date: 2020/5/24
     * @description:
     */
    @Path("/test")
    public class TestQuarkusRes {
     
        @GET
        @Produces(MediaType.APPLICATION_JSON)
        @Path("/{name}")
        public CompletionStage<String> TestRes(@PathParam("name") String name) {
            //使用异步响应
            return CompletableFuture.supplyAsync(() -> String.format("Hello,%s!", name));
        }
    }
    通过代码可以看到,quarkus没有像spring一样需要一个main方法,也没有部署到Web容器,那么怎么启动呢?
     
    启动测试
    只需要在命令行输入下面的命令就可以启动了
    mvn compile quarkus:dev
    访问http://localhost:8080/test/lvgang,返回如下:
    Hello,lvgang
     
    一个简单的基于Quarkus框架的Restful服务已经搭建好了,好像跟Spring Boot比较,除了启动方式,其它没太大差别。其实下面才是差异比较大的地方。
     
    构建Native Image
    Quarkus定位是一个拥抱云原生的Java框架,那么怎样将项目构建成原生应用呢?只需要两个步骤:
    在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-example-1.0-SNAPSHOT-runner
    2020-05-25 12:02:31,199 INFO  [io.quarkus] (main) Quarkus 0.14.0 started in 0.012s. Listening on: http://[::]:8080
    2020-05-25 12:02:31,201 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]
     
    总结
    上面仅仅是Quarkus的一个简单示例,搭建一个Restful服务并构建成Native Image。完成这一步之后,你还可以将Native Image构建成Docker镜像并使用Kubernetes进行部署。Quarkus目前还是一个很轻量级的框架,使用简单且启动超快,希望后续版本演进能够持续保持足够的轻量。
     
     
    转自:https://www.cnblogs.com/tatumu/p/13026160.html
  • 相关阅读:
    常用的SQL语句
    解决Pycharm中module 'pip' has no attribute 'main'的问题
    [转]如何使用Fiddler抓取指定浏览器的数据包
    Linux常用命令
    Android:JACK编译错误汇总及解决
    Linux学习:使用 procrank 测量系统内存使用情况
    Android:动态库(.so)调试技巧
    Android 显示系统:Vsync机制
    Android:cmake开发指南
    Android:高通平台性能调试
  • 原文地址:https://www.cnblogs.com/javalinux/p/15792495.html
Copyright © 2020-2023  润新知