最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

如何構(gòu)建 Spring Boot 12 因素應(yīng)用

2021-08-23 10:37 作者:信碼由韁  | 我要投稿

【注】本文譯自:「鏈接」

在這里,我們看看 Spring Boot 框架如何支持十二因素應(yīng)用的方法,以及 GitHub、Docker 和 Kubernetes 等工具填補(bǔ)了哪些空白。

沒(méi)有國(guó)際標(biāo)準(zhǔn)組織指定 Spring Boot 應(yīng)用作為微服務(wù)必須滿足的標(biāo)準(zhǔn)。Heroku 聯(lián)合創(chuàng)始人 Adam Wiggins 向部署到 Heroku 平臺(tái)的開(kāi)發(fā)人員提供的 12 條建議是開(kāi)發(fā)人員最接近的一套云原生開(kāi)發(fā)指南。

這 12 條戒律被稱為“十二因素應(yīng)用方法論”,已成為創(chuàng)建現(xiàn)代的以 Docker 和 Kubernetes 為部署目標(biāo)的現(xiàn)代云原生微服務(wù)的事實(shí)標(biāo)準(zhǔn)。

開(kāi)發(fā)基于 Java 的微服務(wù)最流行的平臺(tái)是 Spring Boot。以下是 Spring Boot 如何支持十二因素應(yīng)用方法論的原則。

1.?Spring Boot 代碼庫(kù)

并非每個(gè) 12 因素的原則都直接映射到 Spring Boot。代碼庫(kù)原則就是責(zé)任落在 Spring 框架之外的一個(gè)例子。

根據(jù)十二因素應(yīng)用,每個(gè) Spring Boot 微服務(wù)都應(yīng)該有自己獨(dú)立的代碼庫(kù)。這可以通過(guò)創(chuàng)建單個(gè) Git 存儲(chǔ)庫(kù)來(lái)實(shí)現(xiàn),開(kāi)發(fā)人員可以在其中貢獻(xiàn)代碼、合并分支和修復(fù)錯(cuò)誤。如果您的 Spring Boot 應(yīng)用托管在其自己的 Git 存儲(chǔ)庫(kù)中,那么您已經(jīng)正確地實(shí)現(xiàn)了 12 因素代碼庫(kù)要求。


2.?外部化依賴管理

如果您使用 Spring Boot 初始化器創(chuàng)建一個(gè)項(xiàng)目,則必須在 Gradle 或 Maven 之間進(jìn)行選擇作為項(xiàng)目的構(gòu)建工具。這兩個(gè)工具都將管理依賴項(xiàng)外部化。

如果您將 JAR 文件放在項(xiàng)目的 lib 目錄之外,并在 Maven POM 或 Gradle 構(gòu)建文件中列出程序的所有外部依賴項(xiàng),則您的 Spring Boot 應(yīng)用程序?qū)⒄_實(shí)現(xiàn) 12?因素 依賴項(xiàng)管理。

3.?Spring Boot 和 Kubernetes 配置

根據(jù)十二因素應(yīng)用方法論,Spring Boot 應(yīng)用程序應(yīng)該從環(huán)境中讀取其配置數(shù)據(jù)。 例如,如果將云原生 Spring Boot 應(yīng)用程序部署到 Docker 容器并在 Kubernetes 集群中進(jìn)行管理,則應(yīng)用程序應(yīng)該從 Kubernetes ConfigMap 讀取其配置數(shù)據(jù)——而不是從 JavaBean 字段甚至應(yīng)用程序?qū)傩晕募pring 的級(jí)聯(lián)配置處理系統(tǒng)完全滿足了這個(gè) 12-因素要求。

任何用 Spring @ConfigurationProperties 注解修飾的 JavaBean 都會(huì)在多個(gè)地方尋找配置數(shù)據(jù)。 @ConfigurationProperties 修飾的 bean 的規(guī)則是始終使用最高外部化級(jí)別的配置。在 JavaBean 中硬編碼的屬性將被 ApplicationProperties 文件中的數(shù)據(jù)覆蓋,這些數(shù)據(jù)將被 JVM 參數(shù)覆蓋,最終將被 Docker 或 Kubernetes ConfigMap 提供的參數(shù)覆蓋。

使用 @ConfigurationProperties 注解,您的 12?因素?Spring Boot 應(yīng)用將符合配置。

4.?支持服務(wù)和 Spring Boot

將支持服務(wù)視為附加資源的能力自 Java 語(yǔ)言一開(kāi)始就已經(jīng)融入到 Java 語(yǔ)言中,因此即使開(kāi)發(fā)人員齊心協(xié)力,也很難違反這個(gè) 12?因素?約束。

例如,所有通過(guò) Java 數(shù)據(jù)庫(kù)連接 (JDBC) 訪問(wèn)的數(shù)據(jù)庫(kù)都需要一個(gè) URL 和驅(qū)動(dòng)程序,這隱式地使數(shù)據(jù)庫(kù)成為附加資源。 如果不將數(shù)據(jù)庫(kù)視為支持服務(wù),就不可能在 Java 中執(zhí)行 JDBC 或 JPA。 NoSQL 數(shù)據(jù)庫(kù)、Kafka 隊(duì)列和 RESTful Web 服務(wù)也是如此。如果您在 Jakarta EE 或 Spring Boot 中編寫(xiě)代碼,則幾乎必須按照 12-因素指南將所有外部資源視為支持服務(wù)。

5.?構(gòu)建、發(fā)布和運(yùn)行

開(kāi)發(fā)人員遵循嚴(yán)格的構(gòu)建、發(fā)布和運(yùn)行策略的建議似乎有些不言而喻。 具有諷刺意味的是,這也可能是最常違反的 12 因素規(guī)則之一。

這里的想法是您應(yīng)該始終從您的代碼庫(kù)構(gòu)建您的代碼。發(fā)布是與版本化配置文件相關(guān)聯(lián)的標(biāo)記構(gòu)建。它是您在服務(wù)器上部署和運(yùn)行的標(biāo)記構(gòu)建和版本化配置數(shù)據(jù)的組合。

不應(yīng)更新在服務(wù)器上運(yùn)行的代碼來(lái)修復(fù)錯(cuò)誤。不應(yīng)在運(yùn)行時(shí)調(diào)整配置設(shè)置來(lái)克服 Java 性能問(wèn)題。進(jìn)入部署的所有代碼都來(lái)自構(gòu)建,它基于在裸 Git 存儲(chǔ)庫(kù)中進(jìn)行版本控制的代碼。

一旦與構(gòu)建配對(duì)以創(chuàng)建發(fā)布,配置數(shù)據(jù)就不得更改。如果需要更改,團(tuán)隊(duì)必須再次經(jīng)歷完整的構(gòu)建、發(fā)布和運(yùn)行周期。 不應(yīng)該有違反 12 因素構(gòu)建、發(fā)布和運(yùn)行原則的捷徑。

6.?無(wú)狀態(tài) Spring Boot 進(jìn)程

Java 和 Jakarta EE API 有許多類(lèi)和接口,它們隱式地向應(yīng)用程序添加狀態(tài),其中最重要的是 Servlet 和 JSP API 的 HttpSession 對(duì)象。

為了實(shí)現(xiàn) 12 因素合規(guī)性,Spring Boot 為 HttpSession 提供了一個(gè)替代品,稱為 Spring Session。這有助于外部化數(shù)據(jù),否則這些數(shù)據(jù)將被有狀態(tài)地保存在 Tomcat 或 Jetty 等應(yīng)用程序服務(wù)器上。這是 Spring Boot 如何提供額外 API 并重新實(shí)現(xiàn)常用類(lèi)以確保應(yīng)用程序和微服務(wù)保持 12 因素合規(guī)性的一個(gè)主要示例。

此外,Spring Boot 允許開(kāi)發(fā)人員輕松地將 NoSQL 數(shù)據(jù)庫(kù)(如 Cassandra 和 MongoDB)中的狀態(tài)外部化,這也有助于簡(jiǎn)化無(wú)狀態(tài)微服務(wù)的開(kāi)發(fā)。

必須指出的是,確保微服務(wù)作為無(wú)狀態(tài)進(jìn)程運(yùn)行的責(zé)任也很大程度上落在了軟件開(kāi)發(fā)人員的肩上。如果開(kāi)發(fā)人員決定將用戶狀態(tài)保存在一個(gè)實(shí)例變量中,而不是在共享資源中將該數(shù)據(jù)外部化,那么 Spring、Docker 或 Kubernetes 無(wú)法讓該應(yīng)用程序作為無(wú)狀態(tài)進(jìn)程進(jìn)行擴(kuò)展。

7.?端口綁定

端口綁定是另一個(gè) 12 因素 原則,它超出了 Spring Boot 框架的范圍。相反,Docker 容器會(huì)將 Tomcat 或 Undertow 服務(wù)器使用的內(nèi)部端口映射到公共端口。在集群環(huán)境中,kubectl 使用程序會(huì)將 Kubernetes Pod 的端口綁定為公共服務(wù)。無(wú)論哪種方式,Spring Framework 都不負(fù)責(zé)端口綁定要求。

Spring 確實(shí)提供了更改打包的 Spring Boot 應(yīng)用程序內(nèi)部使用的端口的能力,但 Kubernetes 或 Docker 將負(fù)責(zé)外部端口綁定,使云原生應(yīng)用程序可公開(kāi)訪問(wèn)。

8.?并發(fā)性

根據(jù)十二因素應(yīng)用方法論,云原生應(yīng)用應(yīng)該能夠橫向擴(kuò)展,以支持來(lái)自客戶端的大容量并發(fā)請(qǐng)求-響應(yīng)周期。只要 Spring Boot 應(yīng)用是無(wú)狀態(tài)的,Kubernetes 副本集就會(huì)負(fù)責(zé)使用 Docker 容器創(chuàng)建新的 Pod,這些容器可以同時(shí)處理不斷增加的工作負(fù)載。

9.?快速啟動(dòng)和關(guān)閉

十二因素應(yīng)用方法論的第 9 條原則是可處置性,它堅(jiān)持微服務(wù)應(yīng)該快速啟動(dòng)并優(yōu)雅地關(guān)閉。

為了便于處理,Spring Boot 實(shí)現(xiàn)了延遲加載設(shè)計(jì)模式。它還執(zhí)行智能初始化以減少在云原生微服務(wù)啟動(dòng)時(shí)創(chuàng)建的對(duì)象數(shù)量。此外,當(dāng)開(kāi)發(fā)人員使用 Spring 框架提供的資源類(lèi)時(shí),控制能力的反轉(zhuǎn)確保資源在 Kubernetes 節(jié)點(diǎn)耗盡或 Docker 容器下線時(shí)優(yōu)雅地終止。

10.?環(huán)境之間的奇偶校驗(yàn)

開(kāi)發(fā)、用戶驗(yàn)收測(cè)試、預(yù)生產(chǎn)和生產(chǎn)環(huán)境之間總會(huì)存在差異。但十二因素方法堅(jiān)持這些環(huán)境盡可能相似。

為了促進(jìn)環(huán)境對(duì)等,Spring Boot 構(gòu)建將創(chuàng)建一個(gè)可運(yùn)行的 JAR 文件,其中嵌入了一個(gè)應(yīng)用程序服務(wù)器,例如 Tomcat。 打包在 Docker 容器中的相同嵌入式 Tomcat JAR 文件將用于每個(gè)不同的部署環(huán)境。 由于每個(gè)環(huán)境都部署了相同的編譯代碼和應(yīng)用服務(wù)器,最終實(shí)現(xiàn)了環(huán)境間的對(duì)等。

此外,Spring Profiles 提供了一種簡(jiǎn)單的方法來(lái)定義和配置需要從一個(gè)環(huán)境更改到另一個(gè)環(huán)境的屬性,從而允許開(kāi)發(fā)人員解決不可避免地發(fā)生的環(huán)境之間的差異。

11.?日志作為事件流

十二因素應(yīng)用堅(jiān)持將日志視為事件流。

Spring Boot 使用的所有標(biāo)準(zhǔn) Java 日志框架都將它們的數(shù)據(jù)寫(xiě)入事件流,該事件流被保存到運(yùn)行 Docker 容器的 Kubernetes 節(jié)點(diǎn)上的公共目錄中。然后這些日志文件很容易被 Kubernetes DaemonSets 使用,比如 FluentD 或 Logstash。這些 DaemonSet 然后將日志流式傳輸?shù)?Elasticsearch 和 Logstash 等工具以供使用。

只要您使用框架標(biāo)準(zhǔn)的 Java 日志框架,您就可以放心,在日志消耗方面,您擁有一個(gè)符合 12 因素標(biāo)準(zhǔn)的 Spring Boot 應(yīng)用程序。

12.?管理進(jìn)程管理

應(yīng)用通常需要運(yùn)行管理進(jìn)程,這些進(jìn)程與處理客戶端-服務(wù)器交互的請(qǐng)求-響應(yīng)循環(huán)沒(méi)有直接聯(lián)系的。根據(jù)十二因素應(yīng)用,不應(yīng)將實(shí)現(xiàn)這些過(guò)程的代碼放在單獨(dú)的代碼庫(kù)中。管理進(jìn)程應(yīng)打包為標(biāo)準(zhǔn)的、受版本控制的構(gòu)建的一部分,并且進(jìn)程本身應(yīng)在應(yīng)用使用的相同運(yùn)行時(shí)環(huán)境中執(zhí)行。

在云原生 Spring Boot 應(yīng)用程序中添加對(duì)管理進(jìn)程的支持非常容易。Spring Batch 項(xiàng)目可以輕松添加對(duì)運(yùn)行一次并退出的作業(yè)的支持。 此外,任何 Git 存儲(chǔ)庫(kù)都可以配置為包含文件夾,這些文件夾允許添加可以在需要時(shí)在 REPL shell 中運(yùn)行的腳本。

云原生微服務(wù)的開(kāi)發(fā)沒(méi)有明確的標(biāo)準(zhǔn),但十二要素應(yīng)用方法很接近。如果您是一名 Java 開(kāi)發(fā)人員并且想要?jiǎng)?chuàng)建 12 因素應(yīng)用,Spring Boot 將幫助您的團(tuán)隊(duì)保持云原生合規(guī)性。


如何構(gòu)建 Spring Boot 12 因素應(yīng)用的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
平山县| 神木县| 双流县| 福鼎市| 大丰市| 潮安县| 宜春市| 阿拉善盟| 苗栗县| 广河县| 宾阳县| 武夷山市| 新龙县| 广德县| 甘孜| 会同县| 于都县| 连平县| 板桥市| 海宁市| 南溪县| 赤城县| 海丰县| 铜山县| 贵阳市| 行唐县| 石景山区| 崇信县| 普陀区| 罗山县| 嘉黎县| 赤壁市| 聂荣县| 原平市| 寻乌县| 齐齐哈尔市| 沛县| 辰溪县| 汤原县| 都昌县| 南丰县|