Python和JavaScript是雲原生微服務的最佳語言?Quarkus來了! – Javier Ramos

banq發表於2019-03-24

Java和JVM仍然是最流行的程式語言,但對於無伺服器雲原生微服務,Java使用率正在下降,原因是傳統Java應用記憶體佔用大,而且在容器中啟動時間慢; 但由於Quarkus的出現,現在即將改變。

介紹
隨著我越來越多地進入DevOps,Containers和Serverless; 我發現自己使用Python或JavaScript 在輕量級容器或FaaS中 編寫容器化程式碼。Python和JavaScript是雲原生微服務的最佳語言,Java在啟動時無法在無伺服器框架中使用,而且對於微服務來說,JavaScript或Python具有比Java更快的啟動時間和更小的容器大小,從而使它們更高效。

Java已經有20多年的歷史了,世界背後的Java與現在大不相同。JVM解決了一個巨大的問題,並允許我們編寫一次程式碼並在多個平臺和作業系統中執行它。透過Docker之類的容器,我們現在可以將我們的應用程式、庫和作業系統資源打包到一個可以在任何地方執行的容器中,因此今天JVM本身的可移植性不太重要了。在當天,額外的開銷是我們願意支付便攜性的費用,但現在不再支付。現在我們需要始終可用的快速,低延遲和反應式應用程式。容器和容器編排工具(如Kubernetes)提供獨立於程式語言的功能。

隨著公司遷移到微服務,他們採用Spring Java服務,將它們捆綁到一個Jar中,新增JDK並在基於Linux的容器中執行它。這個解決方案有效,但你必須管理500MB大小的重量級容器,需要10到30秒才能使用; 這是一個問題。遷移後的許多公司,他們慢慢轉向Python或Java作為後端服務; 並最終遷移到FaaS。無伺服器和FaaS現在非常受歡迎,因為我們可以專注於編寫函式而無需擔心基礎架構。它們仍在容器內執行,但云提供商管理其生命週期。巧妙的是,在一定時間之後,雲提供商將完全殺死容器並在下次呼叫時再次啟動它,因此您只需支付使用費用。對函式的第一次呼叫可能需要更長的時間,這就是著名的冷啟動。發生這種情況是因為容器需要啟動。使用Python或JavaScript時這不是一個大問題,但對於Java來說,這可能是10-15秒,這是一個交易破壞和Java下降的原因。現在我們需要能夠執行,完成其工作然後停止的程式碼。我們不需要多個執行緒或長時間執行的程式,我們需要可以快速啟動的短期程式。

介紹Quarkus
如果您閱讀科技部落格或關注新聞,您可能會認為無伺服器正在蠶食這個世界,每個人都對它感到非常興奮。創業企業現在可以使用JavaScript將函式編寫為雲中的服務,並將其擴充套件為支援數百萬使用者,而無需管理任何基礎架構。然而如你在矽谷之外的話:比如金融機構,政府,零售和許多其他擁有數百萬行程式碼的行業,他們無法承受重寫,所以他們有點接受這樣一個事實,即他們需要使用重量級容器。

GraalVM,特別是 Substrate VM正在為Java語言的光明未來開啟大門。GraalVM是一個通用虛擬機器,用於執行用JavaScript,Python,Ruby,R,基於JVM的語言(如Java,Scala或Kotlin)編寫的應用程式。很酷的是, GraalVM允許您提前將程式(AOT)編譯為本機可執行檔案。這意味著,您可以將Java程式碼直接編譯為特定於機器的程式碼。生成的程式不在Java HotSpot VM上執行,而是使用必要的元件,如記憶體管理,來自虛擬機器的不同實現的執行緒排程,稱為 Substrate VM。

Substrate VM是用Java編寫的,並編譯成本機可執行檔案。與Java VM相比,生成的程式具有更快的啟動時間和更低的執行時記憶體開銷。這很好,但你可能會想,AOT?這違反了擁有JVM的整個想法,這是我無法在任何地方執行的Java程式碼!這太瘋狂了!。但想想看,我們現在有容器,我們不需要JVM。

基於容器 的常見Spring啟動應用程式具有額外的抽象級別,這在Kubernetes世界中是完全沒有必要的。你有一個在容器內的JVM上執行的Java應用程式,這個容器永遠不會改變,因為現在的交付容器不是應用程式的容器,你打包容器而不是WAR。所以,所有在容器內的JVM中執行應用程式的開銷是無用的,因此如果要將應用程式打包到容器中,AOT就非常有意義。

但是,Java的動態特性受到AOT編譯(執行時類載入,反射,代理等)的嚴重限制。實際上,這意味著90%的Java生態系統在沒有變動的情況下就無法執行。所以Java生態系統必須適應。好訊息是我們可以在構建時間做大部分工作!

這是Quarkus的力量。它使用GraalVM並提供在構建時支援AOT的生態系統,因此您可以使用Java建立本機二進位制檔案。Quarkus使GraalVM可用於Java開發人員!

Quarkus入門
如上所述,Quarkus提前為Java應用程式編譯,建立了一個超小型的Subatomic Java生態系統,它具有極小的體積和超快的啟動時間,使Java重新進入遊戲以進行雲原生開發。多年來我從未對新技術感到興奮,而且我不是唯一一個

嘗試使用入門指南,親自檢視。按照3個指南來檢視Quarkus的力量並確定啟動時間。仍然有成千上萬的公司在容器內使用Java + JPA,這可能需要15秒才能啟動,在Quarkus 0.005中!

您可以使用與Spring Boot世界中相同的IDE和工具。您使用Maven或Gradle來構建專案。您可以直接在IDE中執行它,最重要的是,您可以熱重新載入任何更改,無需重新啟動應用程式。Quarkus不是Spring,所以如果你使用Spring Boot,你將需要遷移Spring特定的程式碼,幸運的是,Quarkus附帶了一個Spring DI相容層,這使得這很容易。Quarkus框架基於標準,這意味著程式碼將是可移植的並且易於維護。

Quarkus開發流程
Quarkus可以在開發模式下執行,類似於Spring Boot,您也可以將專案打包到Jar中。這非常適合測試程式碼和除錯,因為它支援實時過載; 但是為了提前編譯,需要編譯。

  • 首先你在你喜歡的IDE中構建你的應用程式,你可以使用以下方式在開發模式下執行:“ mvnw compile quarkus:dev ”就像一個Spring Boot應用程式,你也可以打包成一個胖罐。
  • 一旦你原意,你就可以建立一個Java二進位制檔案!只需執行:“ mvnw package -Pnative ”,這需要一些時間,因為提前編譯建立本機程式碼!一旦完成,你將有一個二進位制,超小而快,但只能在您的平臺/作業系統上執行,因此它不可移植!但這沒關係,因為我們可以把它放在一個容器內,然後就可以移植了!使用:./mvnw package -Pnative -Dnative-image.docker-build=true從Docker容器內部生成可執行檔案,這意味著我們在容器內部進行本機構建並建立二進位制檔案,如果您沒有與指定的int目標容器相同的平臺,則可能無法在您的膝上型電腦中執行他在專案建立過程中由Quarkus生成的DockerFile。
  • 然後,一旦我們有二進位制檔案,我們只需要從docker檔案建立影像。 docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/quickstart .
  • 最後,您可以在Docker或Kubernetes中執行它: docker run -i --rm -p 8080:8080 quarkus-quickstart/quickstart


Quarkus特點
Quarkus有更多隻有原生Java程式碼才有的功能。

  • 統一命令性和反應性:在開發應用程式時結合熟悉的命令式程式碼和非阻塞式反應式,因此您可以使用反應式程式設計或經典命令。
  • 開發人員Joy:統一配置,零配置,眨眼間實時重新載入,80%常見用法的簡化程式碼,20%靈活,無麻煩的本機可執行程式碼,實時編碼。
  • 驚人的快速啟動時間,令人難以置信的低RSS記憶體(不僅僅是堆大小!),在Kubernetes等容器編排平臺中提供近乎即時的擴充套件和高密度記憶體利用率。瞭解更多
  • Quarkus透過利用您喜愛的最佳庫以及在標準主幹上使用有線庫,帶來了一個有凝聚力,有趣的使用全棧框架。瞭解更多
  • 它支援Hibernate,JPA,REST,JWT等庫。
  • 支援KubernetesOpenShift部署
  • 使用Jaeger開啟跟蹤
  • Kotlin支援
  • 使用Kafka,Camel 訊息...
  • 還有更多,請檢視副檔名列表!

簡而言之,現在您可以在任何環境,雲或本地的超快速輕量級容器中執行傳統的JPA / JTA事務服務。

Quarkus案例
在本節中,我們將簡化入門指南,以瞭解Quarkus的強大功能。
建立新Quarkus專案的最簡單方法是開啟終端並執行以下命令:

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


它生成一個帶有GreetingResuce公開/ hello終點的Maven專案。它還為native和jvm(胖jar傳統映象)docker生成Dockerfile映象。程式碼非常簡潔:

@Path("/hello")
public class GreetingResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
}


執行我們的應用程式。使用: ./mvnw compile quarkus:dev
該應用程式使用打包  ./mvnw package。它產生2個jar檔案:
  • getting-started-1.0-SNAPSHOT.jar - 只包含專案的類和資源,它是Maven構建產生的常規工件;
  • getting-started-1.0-SNAPSHOT-runner.jar- 是一個可執行的jar。請注意,它不是über-jar,因為依賴項被複制到target/lib目錄中。

您可以使用以下命令執行該應用 java -jar target/getting-started-1.0-SNAPSHOT-runner.jar
然後,您需要下載並安裝GraalVM並設定GRAALVM_HOME環境變數。
現在,您可以使用建立本機可執行檔案:  ./mvnw package -Pnative -Dnative-image.docker-build=true。
建立Docker映象: docker build -f src/main/docker/Dockerfile.native -t quarkus-quickstart/quickstart .
現在您可以在任何容器orchectration引擎中執行它,以防您使用minishift

kubectl run quarkus-quickstart --image=quarkus-quickstart/quickstart:latest --port=8080 --image-pull-policy=IfNotPresent
kubectl expose deployment quarkus-quickstart --type=NodePort


就是這樣!你有一個帶有Java REST服務的容器,啟動時間為0.004秒!

結論
我對Red Hat支援的Quarkus感到非常興奮,並且自一週前釋出以來引起了很多關注。我相信它會改變Java的格局,並使正常企業真正遷移到cloid。
Kubernetes + Knative + Quarkus是雲原生開發的遊戲規則改變者,也是任何Java開發人員的樂事。
透過大量示例檢視GITHub原始碼!

相關文章