領先一步
VMware 提供培訓和認證,以加速您的進度。
了解更多嗨,Spring 的粉絲們!大家好嗎?我剛從與家人在加州洛杉磯度過的愉快假期回來。今天晚些時候,我和女兒們將開車回家到加州舊金山。我很享受在洛杉磯與人們的拜訪,特別是因為這是疫情之前我們第一次實際拜訪洛杉磯。
現在,(你能相信嗎?),我們正凝視著新的一年。和往常一樣,我將做年度今年在 Spring 的總結,所以請繼續關注下面的內容,在我們每週的總結之後。事不宜遲,這是 2021 年最後一次本週在 Spring 的回顧。
現在,讓我們看看 2021 年的一些最重要事件,以我的觀點來看。
您可能已經厭倦我談論 Spring Native,但我忍不住:它太棒了! GraalVM 是 OpenJDK 的直接替換,其中包括一個名為 native-image
的額外工具,您可以在安裝 GraalVM 發行版後添加該工具。 native-image
工具是一個提前 (AOT) 編譯器,它將您的 .class
檔案轉換為特定於架構的機器碼。這是一個原生映像。這意味著您失去了可移植性的優勢。這不太好。但是,有一個很大的但是:產生的二進位檔案是獨立的,在運行時佔用最少的 RAM,並且啟動速度是同等 JRE 綁定應用程式的 10 倍或更多。一個獨立的二進位檔案是一件好事,因為這意味著您可以將它打包成一個微小的作業系統佔用空間,非常適合在 Docker 映像中分發。它佔用最少的 RAM(或更具體地說,RSS),在運行時只需要很少的記憶體。這也非常適合在 Docker 映像和像 Kubernetes 這樣的容器協調器中分發,因為這意味著您可以使用與在 JRE 上運行應用程式所需的相同資源來部署更多倍的應用程式實例。而且,最後,它的啟動非常快。非常快。我的 Spring Boot 應用程式通常在 20-75 毫秒之間啟動,具體取決於應用程式的功能。例如,您可以想像這在無伺服器上下文中會有多有用。使用 GraalVM 還有一些其他好處。您是否知道您可以使用 GraalVM 將您的應用程式轉換為連結庫? 就像 .dll
、.dylib
或 .so
一樣? 這意味著您可以將其他應用程式連結到您的 Spring Boot 程式碼提供的功能。查看我最近的Spring Tips (@SpringTipsLive) 影片,我介紹了 Spring Native 0.11.x。您現在就可以開始,前往 Spring Initializr (start.spring.io) 並選擇 Spring Native
。
2012 年,Facebook 試圖弄清楚在構建其客戶端時如何走微服務之路。那裡存在一種自然的緊張關係:客戶端想要一次獲得所有相關資料,而服務則希望獨立和模組化。那麼,雙方如何才能各取所需?他們創建了 GraphQL,以提供一種查詢 API 的方式,並獲得所需的盡可能多或盡可能少的資料。您可以根據服務圖來構建 API,但客戶端無需知道這一點。他們不必關心解析給定形狀的有效負載請求所需的網路呼叫。所有這些都隱藏在 API 後面。 Facebook 在 2015 年開源了 GraphQL,並且這項工作在各種社群中變得非常流行,尤其是在 Java 社群中。社群需要一個適用於 Spring 使用者的流暢整合,因此我們 - Spring 團隊 - 聯繫了 GraphQL Java 專案,看看我們是否可以合作進行整合。 GraphQL Java 是 Spring GraphQL 專案的基礎。它是 GraphQL 的快速整合,現在為 Twitter.com 等網站提供支援。它快速且經過實戰測試。 Spring GraphQL 以此堅實的基礎為基礎,為 Spring 開發人員提供了一種對話式元件模型,對於使用 Spring 支援構建 MVC、REST、RSocket 和基於 WebSocket 的控制器的開發人員來說,這種模型會感到很自然。
我做了一個 Spring Tips 影片,在此介紹了 Spring GraphQL。
今年,Oracle 和 Java 社群發布了 Java 17,這是 Java 的下一個長期支援版本。它非常棒。它也是 Java 的最新長期支援版本,這意味著如果您比較保守並且希望堅持使用 Java 的穩定、良好支援版本,那麼這就是適合您的版本。如果您想要最新最好的版本,這也是適合您的版本(直到 Java 18 到來)。我喜歡Java 17。而且,既然 GraalVM 支援 Java 17,無論您以哪個 OpenJDK 發行版為目標,都沒有理由不將其作為您的主要版本。 Java 8 是一個不可原諒的舊且無關緊要的 Java 版本。除了您可能想要研究古代文物之外,今天沒有任何理由使用它。基於版本號,Java 17 比 Java 8 好兩倍以上。
這是自 Java 8 以來我最喜歡的功能列表。
records
是一種描述類型的絕佳方式,這些類型只是那些類型中的狀態。這些類似於 Scala 中的 case
類別和 Kotlin 中的 data
類別。它們可以將大量的樣板程式碼簡化為單行。var
和自動類型推斷。String
(萬歲!我不敢相信這終於在 Java 中了!)所以您可以讓過去繁瑣的 String
連接休息一下。private
方法。 這建立在 Java 8 中引入的對 default
方法的支援之上NullPointerException
時,您可以獲得直觀的錯誤。開箱即用的 OpenJDK Java 17 發行版附帶一個與 ARM 和 Apple M1 相容的埠,該埠速度非常快。 它在各方面都是更好的發行版。 感謝 Oracle 和社群!
這個由 Spring 團隊和 Microsoft 共同開發的平台即服務產品正在像雜草一樣生長,不斷改進和強化,以儘可能輕鬆地將 Spring Boot 應用程式交付到生產環境。 2021 年也不例外。 今年推出了受管理的虛擬網路和自動縮放整合、改進的監控、簡單的部署、Dynatrace 整合、出站公共 IP、Visual Studio Code 整合和完整的 APM 功能等等。 當然,還有大量的參考資料。
Spring 提供了無與倫比的協議來補充想要與服務進行通訊的客戶端開發人員,支援諸如 WebSockets、HTTP、REST、OAuth、RSocket 和 GraphQL 之類的東西。 但是整合的機會每天都在變得更好。 例如,我喜歡 Dr. Dave Syer 最近發布的這篇文章,其中介紹了整合的一些可能性。 在此部落格中,這位優秀的博士研究了諸如 Webjars、HTMX、Hotwired 等。
Buildpacks(建構套件) 每天都在變得更好!Buildpacks 是一個 CNCF 規範,提供了一種採用應用程式並將它們容器化的方法。不想編寫 Dockerfile
?我也不想!90% 的時間,它們都是重複的,並且除了浪費資源的冗餘之外,沒有為世界帶來任何東西。這並不是說以前沒有人弄清楚如何容器化 Java 應用程式!因此,Buildpacks 讓您可以取得應用程式工件,無論是 .jar
、.war
、.NET 組件、Ruby on Rails 應用程式或 Node.js 應用程式,或是...任何東西!...並將其轉換為 Docker 映像檔,然後您可以 docker tag
和 docker push
到您選擇的容器註冊表。(我可以推薦 VMware Harbor 嗎?)Buildpacks 使用建構器 (builder) 來完成此操作,您可以從整個生態系統中選擇。 Paketo 專案 提供了大量的現成建構器。Buildpacks 本身就很棒,但我喜歡您可以用不同的形式與 Buildpacks API 互動。Spring Boot 透過其 Maven 和 Gradle 外掛程式提供對 Buildpacks 的現成支援:mvn spring-boot:build-image
,然後您就可以開始容器化的競賽了!如果您不想為每個建置管線設置所有這些,請考慮使用 KPack,它是一個在叢集中運行的 Kubernetes 運算子,並在它感知到更新時將建構器應用於工件。您無需將叢集的安全憑證洩漏到您的 CI 管線中,也無需為每個新模組重新建構該容器發布管線。生活變得更美好!還有一個 Buildpack 可以建構 Spring Native 支援的 GraalVM 映像檔!只需前往 Spring Initializr (start.spring.io) 並使用 Spring Native
作為依賴項建構一個新專案。它會自動重新調整對原生映像檔的 Buildpacks 支援。