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目前還是一個很輕量級的框架,使用簡單且啟動超快,希望后續版本演進能夠持續保持足夠的輕量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM