云原生時代下的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 有一張云原生全景圖(github.com/cncf/landsc… 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集群中
分享資源
獲取以上資源請訪問開源項目 點擊跳轉