Quarkus框架入門之一:Quarkus框架介紹及簡單示例
開篇
最近幾年,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: [email protected]
* @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
,返回如下:
至此,一個簡單的基於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全家桶那麼龐大,估計啟動也快不了了~
示例原始碼
參考文章及網站
- The Twelve-Factor App
- Graalvm
-
相關推薦
Quarkus框架入門之一:Quarkus框架介紹及簡單示例
開篇 最近幾年,Spring全家桶橫掃其它Java框架,已然成為事實標準,單體應用使用Spring Framework+Sprin
SpringBoot | 第六章:常用註解介紹及簡單使用
前言 之前幾個章節,大部分都是算介紹springboot的一些外圍配置,比如日誌配置等。這章節開始,開始總結一些關於springboot的綜合開發的知識點。由於SpringBoot本身是基於Spring和SpringMvc等各類spring家族的一個解決方案,可快速進行
Docker(3):Dockerfile介紹及簡單示例
maintain cmd 方法 source mon onf 本地 bubuko author Dockerfile 概念 Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。它們簡化了從頭到尾的流程並極大的簡化了部署工作。
.net持續整合cake篇之cake介紹及簡單示例
cake介紹 Cake 是.net平臺下的一款自動化構建工具,可以完成對.net專案的編譯,打包,執行單元測試,整合測試甚至釋出專案等等.如果有些特徵Cake沒有實現,我們還可以很容易地通過擴充套件Cake來實現我們想要的功能. Cake有以下特點 1) 使用c#語言編寫,可以在Cake腳本里使用C#語言來實
Asp.Net Ioc框架入門之一 Unity
輕量級 practice 松耦合 table protected mic ret sof asp 一、概述 IOC:英文全稱:Inversion of Control,中文名稱:控制反轉,它還有個名字叫依賴註入(Dependency Injection)。 作用:將
使用Spring框架入門一:基於XML配置的IOC/DI的使用
測試結果 plugins rac prepare lombok ray instance private mls 一、Spring框架 1、方法一:逐項導入基礎依賴包: spring-core、spring-beans、spring-context、s
使用Spring框架入門二:基於註解+XML配置的IOC/DI的使用
bsp hot sources hierarchy osi pan ioc clas operate 一、簡述 本文主要講使用註解+xml配合使用的幾種使用方式。基礎課程請看前一節。 二、步驟 1、為Pom.xml中引入依賴:本例中使用的是spring-context
web前端新手入門教程:Web 框架的架構模式探討
在寫乾貨之前,我想先探(qiang)討(diao)兩個問題,模式的侷限性?模式有什麼用? 最近看到一篇文章對我啟發很大,許來西在知乎的回答《哲學和科學有什麼關聯?》,全篇較長,這裡摘錄我要引出的一點: 科學作為一種經驗主義的認識論,有著經驗主義的巨大缺陷:它永遠不能產生絕對
今天我們學習了三大框架之一:Flask框架。
Flask框架 是一個輕量級框架,誕生於2010年,由Armin ronacher用python語言做成。 首先我們今天先是用上的新的軟體 叫:Visual Studio Code。 在接觸新的軟體的時候,我是百臉的懵逼狀態,因為不知道這是幹啥的,一切跟著老師的腳步,慢慢熟悉到了這個軟體。
mybatis框架入門程式:演示通過mybatis實現資料庫的模糊查詢操作
1. mybatis的基本準備操作見我的上一篇博文:https://www.cnblogs.com/wyhluckdog/p/10149480.html 2. 根據使用者名稱查詢使用者資訊: (1)對映檔案: 在User.xml中新增: <!-- 模糊查詢 返回結果可能
【微框架】之一:從零開始,輕鬆搞定SpringCloud微框架系列--開山篇
一、SpringCloud專案簡介 Spring Cloud: 微服務工具包,為開發者提供了在分散式系統的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排等開發工具包。 Spring Boot: 旨在簡化建立產品級的 Spring
【微框架】之一:從零開始,輕鬆搞定SpringCloud微服務系列--開山篇(spring boot 小demo)
Spring頂級框架有眾多,那麼接下的篇幅,我將重點講解SpringCloud微框架的實現 Spring 頂級專案,包含眾多,我們重點學習一下,SpringCloud專案以及SpringBoot專案 ————————————————————main———————————————————— 一
Struts2.3.24框架入門之一環境配置及入門例項HelloWorld
Struts框架簡單例項——HelloWorld step1:環境搭建 到Struts官網下載最新版本:http://struts.apache.org/download.cgi 匯入必備jar
TensorFlow入門之一:第一個機器學習Demo
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/geyunfei_/article/details/78782804 本文主要通過一個簡單的 Demo 介紹 TensorFlow 初級 API 的使用方法,因為自己也是初學者,因此本文的目
雜湊學習演算法之一:ANN背景介紹
一、由ANN進入Hash NN,即最近鄰(nearest neighbor),定義在一個數據集X中,查詢點q的最近鄰是NN(q)=argmin dist(q,x) 其中x∈X。直接的表示,即為KNN查詢,也就是需要找到K個最近鄰。一個點x和查詢點q的距離取決於具體的查詢問題。例如:d維空
OCR系列之一:開坑介紹
開坑背景 近期即將進行一個新的工作,對儀表類示器數字進行識別。 樣圖如下: 這樣的: 當然還有很多類,這裡就不一一貼圖了,觀察發現,這是來自不同類的顯示器(儀表),那麼想要識別出上面的數字,想要一統天下的識別,這還是相當有
SpringBoot 入門之一:Configuration 和 Properties
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2
物聯網安全研究之一:IoT架構介紹
最近,很多人都向我諮詢物聯網(IoT)安全研究如何入門的問題,以此,我打算寫一些物聯網相關的安全加固、滲透測試和漏洞利用的文章,以供大家參考借鑑,希望能幫大家解疑釋惑。 前言 對於安全研究者來說,知曉一項新式複雜技術的研究入門和攻擊知識至關重要。當然對於這種普遍問題來說,
數獨高階技巧入門之一:鏈及其簡單應用
存在 format unit https img nbsp clas 保留 most 鏈(Chain)是數獨高階技巧的核心,所有數獨盤勢都可以通過各種或簡單或復雜的鏈來解出答案。鏈的本質是命題之間的關系,在解數獨時,每個填數的步驟都可表現為在『A格中填入1』、『B格中填
SpringCloud學習系列之一:基礎概念介紹
引言 本系列博文主要為SpringCloud學習的博文系列。 到底什麼是微服務 SpringCloud元件介紹 一、到底什麼是微服務 1、微服務的定義 "Microservice" 即微服務,在Martin Fowler的博文中介紹了微服務的具體概念。它是一