Python和JavaScript是雲原生微服務的最佳語言?Quarkus來了! – Javier Ramos
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等庫。
- 支援Kubernetes和OpenShift部署
- 使用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原始碼!
相關文章
- 聊聊雲原生和微服務架構微服務架構
- Quarkus和MongoDB微服務簡單案例原始碼MongoDB微服務原始碼
- 雲原生語境下,如何重新解讀微服務?微服務
- 從微服務到雲原生微服務
- 雲原生架構下的微服務選型和演進架構微服務
- 華為雲容器和微服務是什麼?微服務
- 雲原生 go-zero 微服務框架Go微服務框架
- 雲原生微服務的下一站,微服務引擎 MSE 重磅升級微服務
- [雲原生微服務架構](十)微服務架構的基礎知識微服務架構
- 雲原生時代高效能Java框架—Quarkus(一)Java框架
- 雲原生時代高效能Java框架—Quarkus(二)Java框架
- 雲原生微服務框架之go-zero微服務框架Go
- 跨語言微服務框架-Istio簡紹和概念微服務框架
- 資料中臺升級了?原來是擁抱了雲原生!
- Kubernetes,Istio和Java MicroProfile微服務雲原生案例 - heidloffJava微服務
- [雲原生微服務架構](九)入門HELM微服務架構
- 40% 的雲原生開發者專注於微服務領域微服務
- Go語言微服務系列文章Go微服務
- JavaScript 是真正的 OOP 語言嗎?JavaScriptOOP
- [雲原生微服務架構](十二) Kubernetes和docker都做了啥微服務架構Docker
- 容器和微服務是如何改變了安全性微服務
- 微服務思考(01):什麼是微服務?微服務的優勢和劣勢微服務
- Dapr和Rainbond整合,實現雲原生BaaS和模組化微服務開發AI微服務
- Solon 1.8.0 釋出,雲原生微服務開發框架微服務框架
- 用JavaScript、Java和Python程式語言的年薪都多少?JavaScriptPython
- python和c語言的區別是什麼PythonC語言
- 【大話雲原生】微服務篇-五星級酒店的服務方式微服務
- javascript是指令碼語言嗎JavaScript指令碼
- Python是什麼語言?Python底層語言是什麼?Python
- 雲原生時代,微服務到底應該怎麼玩兒?微服務
- 雲原生時代 PHP/Golang 專案如何實現微服務PHPGolang微服務
- ServiceMesh 1:大火的雲原生微服務網格,究竟好在哪裡?微服務
- 什麼是雲原生?為什麼是Portworx來解決雲原生儲存問題?
- 華為雲:微服務架構下的效能保障最佳實踐微服務架構
- 業內首款雲原生技術中臺產品雲原生 Stack 來了!
- Python和C語言區別是什麼?PythonC語言
- python 是開源語言嗎:Python 是一種開源語言嗎?Python
- 從建好到用好,阿里雲原生微服務生態的演進阿里微服務