【Quarkus技術系列】「雲原生架構體系」在雲原生時代下的Java“拯救者”是Quarkus,那雲原生是什麼呢?

語言: CN / TW / HK

theme: Chinese-red

小知識,大挑戰!本文正在參與「程式設計師必備小知識」創作活動

本文已參與 「掘力星計劃」 ,贏取創作大禮包,挑戰創作激勵金。

雲原生時代下的Java“拯救者”

在雲原生時代,其實Java程式是有很大的劣勢的,以最流行的spring boot/spring cloud微服務框架為例,啟動一個已經優化好,很多bean需要lazy load的application至少需要3-4秒時間,記憶體需要幾百M,業務邏輯稍微複雜一點點,沒有1G以上的記憶體是很難滿足業務的需要呢?

在討論夸克斯(Quarkus)之前,我們先了解一下什麼是雲原生。為什麼說下一代Java雲原生服務就是Quarkus?

雲原生架構簡介

Cloud Native(雲原生),這是一個既陌生又熟悉的名詞,它是Matt Stine提出的一個概念,它是一個思想的集合,包括:DevOps、持續交付(Continuous Delivery)、微服務(MicroServices)、敏捷基礎設施(Agile Infrastructure)、康威定律(Conways Law)等

Cloud Native(雲原生)準確來說也是一種文化,更是一種潮流,它是雲端計算的一個必然導向,意義在於讓雲成為雲化戰略成功的基石,而不是障礙。

Cloud Native(雲原生)的特點和方面:

  • 技術(微服務,敏捷基礎設施)
  • 管理(DevOps,持續交付,康威定律,重組等)

Cloud Native也可以說是一系列Cloud技術、企業管理方法的集合。

Cloud Native(雲原生)的定義和概念

Cloud Native(雲原生)是更好的工具、自我修復系統、和自動化系統的集合,可以讓應用和基礎設施的部署和故障修復更加快速和敏捷,極大的降低企業在雲端計算方面的部署成本。

目前業界公認的雲原生主要包括以下幾個層面的內容。

  • 容器,服務網格,微服務,不可變的基礎設施,公開的API都接近雲原生相關概念。

  • 雲原生技術可以讓系統松耦合,支援彈性伸縮、可管理的、清晰的。

隨著容器、kubernetes、Serverless、FaaS技術的演進,CNCF(Cloud Native Computing Foundation ,雲原生計算基金會)把雲原生的概念更廣泛地定義為“讓應用更有彈性、容錯性、觀測性的基礎技術,讓應用更容易部署、管理的基礎軟體、讓應用更容易編寫、編排的執行框架等”,希望能夠讓開發者最好的利用雲的資源、產品和交付能力。

雲原生的發展歷程

  • 2004 年 ~ 2007 年,Google 已在內部大規模地使用像 Cgroups 這樣的容器技術;
  • 2008 年,Google 將 Cgroups 合併進入了 Linux 核心主幹。
  • 2013 年,Docker 專案正式釋出。
  • 2014 年,Kubernetes 專案也正式釋出。
    • Kubernetes專案釋出的原因也非常容易理解,因為有了容器和 Docker 之後,就需要有一種方式去幫助大家方便、快速、優雅地管理這些容器,這就是 Kubernetes 專案的初衷。在 Google 和 Redhat 釋出了 Kubernetes 之後,這個專案的發展速度非常之快。
  • 2015 年,CNCF 成立。
    • 由 Google、Redhat 以及微軟等大型雲端計算廠商以及一些開源公司共同牽頭成立了 CNCF 雲原生基金會。CNCF 成立之初,就有 22 個創始會員,而且 Kubernetes 也成為了 CNCF 託管的第一個開源專案。
  • 2017 年,CNCF 達到 170 個成員和 14 個基金專案。
  • 2018 年,CNCF 成立三週年有了 195 個成員,19 個基金會專案和 11 個孵化專案,如此之快的發展速度在整個雲端計算領域都是非常罕見的。

雲原生技術生態現狀

因此,如今我們所討論的雲原生技術生態是一個龐大的技術集合。CNCF 有一張雲原生全景圖(https://github.com/cncf/landscape),在這個全景圖裡已經有 200 多個專案和產品了,這些專案和產品也都是和 CNCF 的觀點所契合的。所以如果以這張全景圖作為背景,加以思考就會發現,我們今天所討論的雲原生其實主要談論了以下幾點:

雲原生基金會 —— CNCF

CNCF是目前雲端計算領域最成功的開源基金會之一,是 Kubernetes、 etcd、Envoy 等知名開源專案的託管基金會。

雲原生技術社群

比如像 CNCF 目前正式託管的多個專案共同構成了現代雲端計算生態的基石,其中像 Kubernetes這樣的專案已經成為了世界首屈一指,非常活躍的開源專案;目前從 CNCF 畢業的專案有很多,例如Kubernetes 、Prometheus、Envoy、CoreDNS、containerd、Fluentd 。

雲原生服務架構的原則

高可用架構設計的原則

  • 可觀測:可以通過執行狀態和資料分析,實現可觀測模式下的執行狀態和執行資料分析。

  • 可灰度:可以實現藍綠髮布、AB測試、金絲雀釋出機制等,實現資料服務的流量控制。

  • 可回滾:可以實現服務的fallback和reback回滾方式。

提高架構可用性的設計原則

  • 解耦:訊息佇列、分散式佇列、服務拆分

  • 冗餘:異地容災、多點部署、主從切換

  • 異構:sidercar模式進行分析和實現

  • 非同步:訊息佇列、非同步呼叫、響應式程式設計

微服務設計原則

盜用官方圖片一個:

原則一:完整性

功能完整性:功能內部邏輯獨立,外部依賴較少。

微服務完整性:服務裡面的每個微服務都應能獨立完成具體的業務操作或者流程,都有明確的輸入、輸出和處理邏輯。

原則二:技術限制

需要使用事務一致性的功能需要放在一個微服務內,儘量避免分散式事務問題。

原則三:效能擴充套件

對於使用者使用頻率較高,效能要求較高的功能可單獨作為一個微服務,以便做多節點擴充套件提升效能。

原則四:耦合性

微服務和微服務之間儘量避免相互呼叫依賴。可以通過 RPC 遠端呼叫介面的方式,對於關聯性較高的功能,應放在同一個微服務內。

公共使用的功能可設計在一個公共微服務。比如日誌功能,檔案上傳功能以及一些底層技術元件等,可設計在一個微服務中。

回到Quarkus上面來

Quarkus雲原生的標準

Quarkus可與常用Java標準、框架和庫協同工作,例如 Eclipse MicroProfile、Spring(作為 2020 年紅帽峰會追蹤的一個環節一起演示)、Apache Kafka、RESTEasy (JAX-RS)、Hibernate ORM (JPA)、Spring、Infinispan、Camel 等。

Quarkus上下文和依賴注入

Quarkus 的依賴注入解決方案基於 CDI(上下文和依賴注入),且包含一個擴充套件框架來擴充套件功能並將其配置、引導並整合到您的應用中。新增擴充套件就像新增依賴項一樣容易;或者,您可以使用 Quarkus 工具。

Quarkus多語言擴充套件支援

它還向 GraalVM(一種通用虛擬機器,用於執行以多種語言(包括 Java 和 JavaScript)編寫的應用)提供正確資訊,以便對應用進行原生編譯。

驚人的快速啟動時間,極低的RSS記憶體(不僅是堆大小!)在容器編排平臺(如Kubernetes)中提供了近乎即時的向上擴充套件和高密度的記憶體利用率

雙模式進行執行方式

Quarkus的設計從一開始就立足於簡單易用,其功能幾乎不需要配置即可正常使用。

開發人員可以為其應用選擇所需的Java框架,而這些應用可以在JVM模式下執行,也可以在原生模式下進行編譯和執行。 

為了方便開發人員的工作,Quarkus 還包含以下功能:

  • 實時編碼,旨在讓開發人員能夠即時檢查程式碼更改的影響並快速進行故障排除 
  • 帶有嵌入式託管事件匯流排的統一命令式和響應式程式設計 
  • 統一配置
  • 簡單的原生可執行檔案生成

容器優先

無論是將應用託管在公共雲上還是內部託管的Kubernetes叢集中,快速啟動和低記憶體消耗等特性對於降低總體主機成本來說都至關重要。

Quarkus 的開發遵從了容器優先的原則,這意味著它已通過以下方式針對降低記憶體使用和加快啟動時間進行了優化: 

  • 鼎力支援 Graal/SubstrateVM
  • 構建時元資料處理
  • 減少反射的使用
  • 本機映像預啟動

因此,Quarkus 構建的應用其記憶體消耗只有傳統 Java 的 1/10,而且啟動時間更快(快了 300 倍),這些都大大降低了雲資源的成本。 

夸克斯六步

  • 快速搭建屬於Quarkus的應用微服務骨架(為構建應用服務奠定基礎)

  • Quarkus微服務應用的(開發模式)實現實時熱部署能力(改動實時生效)

  • 通過整合多個開源庫以及相關業務需求進行開發相關的程式程式碼

  • 當開發編碼完成之後建立版本,進行開發層面整合化測試階段

  • 建立CLI程式以及建立雲原生可執行包檔案,並建立對應的容器服務

  • 將對應的雲原生檔案包直接整合部署到Kubernetes叢集中

「其他文章」