日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Cloud –基本设置

發布時間:2023/12/3 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cloud –基本设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring Cloud解決了分布式系統的常見問題。 但是,對于只使用廣為人知的整體應用程序工作的人來說,從一開始就跳入一長串為分布式服務設計的模式可能會讓人不知所措。 本文將通過實用的方法為您介紹Spring Cloud的基礎知識。 完成后,您不僅應該知道如何基于Spring Cloud啟動項目,還應該了解為什么需要所有步驟以及它們解決了哪些問題。

1.第一服務

讓我們定義一下我們將使用Spring Cloud解決的問題。 該演示的目的是為分布式博客平臺奠定基礎。

分布式系統的核心組件是服務,它不過是旨在專注于域的特定部分的常規應用程序。 在一個復雜的系統中,可能會有數十種不同的服務,但是為了清楚起見,我們僅從兩個示例開始。 第一項服務將照顧作者,而第二項服務將專注于文章。

作者服務

在我們的例子中,作者服務是使用spring-boot-starter-web創建的典型Spring Boot應用程序。 目前,我們不使用Spring Cloud的任何功能。

@SpringBootApplication public class AuthorServiceApplication {public static void main(String[] args) {SpringApplication.run(AuthorServiceApplication.class, args);}}

這是一個作者域類,這是我們第一個服務的主要重點。

class Author {private final Long id;private final String name;//…}

最后,我們創建一個REST控制器,該控制器允許提取所有作者或根據其標識符查找特定作者。

@RestController class AuthorController {//…@GetMappingList<Author> findAll() {//…}@GetMapping("/{id}")Author findOne(@PathVariable long id) {//…}}

文章服務

第二項服務類似于上一項。 如果需要代碼示例,可以在GitHub存儲庫中找到它們 。

此步驟的關鍵是要認識到,我們將域的不同部分分為較小的和松散耦合的應用程序,而不是一個較大的應用程序。 它給我們帶來什么? 有許多優點,例如,更簡單的可伸縮性,彈性或更快的部署。 如果您需要更多的理論背景,建議您閱讀Sam Newman撰寫的一本很棒的書,名為Building microservices 。

2.分布式配置

如果您嘗試在一臺機器上啟動這兩種服務,則默認的Spring Boot設置將無法實現,因為這兩個應用程序都將嘗試在端口8080上運行。您可以自定義設置并在每個應用程序的application.properties中選擇不同的端口。應用程序,這對于兩個服務來說不是問題,但對于許多服務而言,可能會更成問題。

配置服務器

對于復雜的分布式系統,明智的做法是將所有服務的配置都放在一個位置,以簡化整個管理過程。 為了適合微服務系統,這些配置將由…另一服務提供。 創建應用程序,并將以下依賴項放入pom.xml中 。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId> </dependency>

配置服務器中的主要應用程序類與其他應用程序沒有太大區別。 唯一的區別是之前添加的Spring Cloud依賴項中的@EnableConfigServer批注,該批注負責為外部配置公開API。

@SpringBootApplication @EnableConfigServer public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}}

配置位置

我們將在哪里保留服務的配置? 配置服務器JAR文件中的捆綁屬性不是一個靈活的解決方案。 一些外部位置似乎是一個更好的主意。 默認情況下,Spring Cloud使用Git存儲庫來管理配置。 可以在配置應用程序的application.properties中設置Git服務器的URI地址(以及其他詳細信息)。 幸運的是,在我們的演示中,我們不需要單獨的Git服務器。 出于測試目的,本地存儲庫可以正常工作。

server.port=9001 spring.application.name=config-serverspring.cloud.config.server.git.uri=file://${user.home}/config

Git存儲庫的位置是通過spring.cloud.config.server.git.uri屬性設置的。 為了使用真實服務器,應將值更改為不帶file:前綴的某些URL。 我們還更改了默認端口,以避免在單臺計算機上運行時與其他服務沖突。 此外,該應用程序收到了自己的名稱。 目前不需要,但稍后我們將使用該名稱作為其他服務中對配置服務器的引用。

配置庫

所有服務的配置都將保留在spring.cloud.config.server.git.uri中設置的位置。 現在,我們可以創建兩個文件,專門用于以前開發的服務,在其中我們將更改默認端口并分配名稱,就像對配置服務器所做的一樣。

這是article-service.properties文件的內容。

server.port=9003 spring.application.name=article-service

此時的author-service.properties文件看起來幾乎相同。

server.port=9004 spring.application.name=author-service

最后,初始化Git存儲庫并提交兩個創建的配置。

git init git add . git commit -m 'Service configs'

3.服務發現

配置服務器已準備就緒,但其他服務仍不知道其存在以及如何獲取其配置的方式。 該問題的一種可能解決方案是使用Spring Cloud Config Client將服務直接與服務器連接,該客戶端可以添加spring-cloud-starter-config依賴項。 主要缺點是我們必須在每個服務中對配置服務器的地址進行硬編碼。 如果此服務的位置將來發生更改,或者我們想提供冗余對等方,則所有服務都需要更新。 在稱為“服務發現”的模式下解決了在分布式系統中查找其他服務的問題。

注冊表服務器

我們已經為所有配置創建了服務器,這是我們的第一個基礎架構服務。 同樣,現在我們將開發一個注冊表服務器,這是另一種基礎結構服務,它將充當分布式系統中所有組件的地址簿。 創建具有以下依賴關系的新應用程序。

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency> </dependencies>

第一個負責公開注冊表API。 已經提到了第二個依賴關系,該依賴關系用于連接我們的配置服務器,該服務器還將保存我們正在創建的注冊表的配置。 主應用程序類類似于其他Spring Boot應用程序。 我們僅添加@EnableEurekaServer批注以公開注冊表API。

@SpringBootApplication @EnableEurekaServer public class RegistryServerApplication {public static void main(String[] args) {SpringApplication.run(RegistryServerApplication.class, args);}}

注冊表服務器中最后缺少的是引導程序配置。 配置的主要部分將由配置服務器提供服務,但是我們需要描述如何找到它。 在main / resources目錄中創建bootstrap.properties文件,并添加下面顯示的行,這些行是配置服務器的地址和用于獲取屬性的注冊表應用程序的名稱。

spring.cloud.config.name=registry-server spring.cloud.config.uri=http://localhost:9001

公開注冊表配置

下一步是將配置添加到配置服務器監控的Git存儲庫中。 創建一個名為Registry-server.properties的文件。 重要的是,文件名必須與注冊表服務器應用程序中bootstrap.properties文件中的spring.cloud.config.name屬性值匹配。 最低要求的配置如下所示。 不要忘記將更改提交到Git存儲庫。

spring.application.name=registry-server server.port=9002eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:9002/eureka/

前兩個屬性是普通Spring Boot應用程序的典型屬性。 其他三個專用于Spring Cloud Eureka Client。 默認情況下,每個Eureka服務器都將嘗試連接到其他對等服務器以注冊其存在。 在我們的簡單演示中,我們只有一個注冊表服務器實例,但是在生產解決方案中,您可能會提供此類服務的某些冗余。 我們的注冊表服務器不會連接任何東西,這就是為什么我們將默認值更改為false的原因。 注冊事件會傳播到eureka.client.serviceUrl.defaultZone中列出的所有Eureka服務器,但是盡管只有一種,因為在我們這種情況下,我們仍然需要設置此屬性以覆蓋默認值。

使用外部配置運行注冊表

目前,我們可以同時運行兩個服務器,以驗證它們是否按預期工作。 由于注冊表服務器取決于配置服務器,因此需要首先啟動它。 幾秒鐘后,也可以啟動注冊表服務器。 如果您沒有遺漏任何步驟,則兩個應用程序都應運行,日志中沒有任何錯誤。 配置服務器應獲取配置并在端口9002上運行。導航到http:// localhost:9002 /后 ,將顯示Eureka儀表板,其中包含有關正在運行的實例的一些詳細信息。

4.配置服務注冊

我們的注冊服務與配置服務器連接的事實并不意味著該服務器已注冊為服務。 服務的責任是將其狀態傳達給分布式寄存器。 為了連接到注冊表服務,配置服務器需要以下依賴關系。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId> </dependency>

它將允許我們在配置服務器的主類中使用Eureka客戶端注釋。

@EnableEurekaClient public class ConfigServerApplication {//… }

最后是注冊表服務器的地址,必須將其添加到配置服務器的application.properties中。

eureka.client.serviceUrl.defaultZone=http://localhost:9002/eureka/

此時,您可能開始懷疑服務器之間的通信將如何進行。 注冊表服務器需要從配置服務器進行配置,而同時配置服務器希望連接到注冊表以通知其存在。 他們應該以什么順序交流?

實際上,沒有任何變化。 您首先啟動配置服務器。 每隔幾秒鐘,它將嘗試與注冊表服務器連接并在每次失敗時打印錯誤日志。 啟動注冊表服務器后,它將獲取其配置并開始接受注冊。 最后,配置服務器將注冊,并且不再顯示錯誤日志。 嘗試一下以確認它是否按預期工作。

5.配置獲取

我們的配置服務器最終可以通過本文開頭創建的域服務發現。 首先,進行少量修改,我們需要針對作者和文章服務重復上一段的所有步驟,以允許與注冊服務進行通信。 提醒一下,這些步驟是:

  • 添加對spring-cloud-starter-eureka的依賴
  • 用@EnableEurekaClient注釋主類
  • 在bootstrap.properties中設置eureka.client.serviceUrl.defaultZone (不在application.properties中 )

這將允許服務與注冊表服務器進行通信,但仍不會獲取任何配置。 為了使這一過程自動化,我們需要在服務中提供另一個小的依賴項(請注意,注冊表服務器中使用了相同的依賴項)。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId> </dependency>

最后,我們需要在bootstrap.properties中設置一些其他詳細信息。 這是作者服務的示例文件。 類比屬性應添加到Article服務。

spring.cloud.config.name=author-service spring.cloud.config.discovery.service-id=config-server spring.cloud.config.discovery.enabled=true

spring.cloud.config.name的值必須與配置服務器提供的配置庫中的相應屬性文件匹配。 第二個屬性用于標識在我們的Eureka服務器中注冊的配置服務器。 更改的值必須與配置服務器中application.properties中存在的spring.application.name值匹配。 使用最后一個屬性,我們啟用配置發現過程。

您應該能夠驗證兩個服務是否都在集中式配置中定義的端口上啟動。 如果您關閉了配置和發現服務,請先啟動它們,然后再運行域服務。 只要所有步驟都正確完成,兩個服務都應在配置的端口上響應瀏覽器。 在另一種情況下,確保您不會錯過任何步驟或將代碼與存儲庫中的示例進行比較 。

6.一勞永逸,一勞永逸

目前,我們實際上可以認為我們的基本設置已經準備就緒,但是我們將為難題添加另一部分,并了解分布式系統中使用的另一種模式,即服務網關。 顧名思義,其目的是允許客戶端使用單個訪問點查找所有服務。 換句話說,網關充當分布式服務的路由器。

網關服務

讓我們在此演示中創建最后一個Spring Boot應用程序,并添加下面提到的依賴項。 唯一的新功能是spring-cloud-starter-zuul ,其中包含創建網關所需的類。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId> </dependency>

除了以前添加的注釋外,應用程序的主類還應使用@EnableZuulProxy聲明自己為代理網關。

@SpringBootApplication @EnableZuulProxy @EnableEurekaClient public class GatewayServiceApplication {public static void main(String[] args) {SpringApplication.run(GatewayServiceApplication.class, args);}}

該應用程序還需要bootstrap.properties文件,該文件的值類似于先前配置的域服務。 這里沒有什么新東西需要解釋。

spring.cloud.config.name=gateway-service spring.cloud.config.discovery.service-id=config-server spring.cloud.config.discovery.enabled=trueeureka.client.serviceUrl.defaultZone=http://localhost:9002/eureka/

配置獲取

就像其他常規服務一樣,網關依賴于配置服務器管理的Git存儲庫中存儲的配置。 創建一個名為gateway-service.properties的文件,使用以下值設置其內容,然后將更改提交到配置庫。

spring.application.name=gateway-service server.port=8080zuul.routes.author-service.path=/authors/**zuul.routes.article-service.path=/articles/**

我們已經知道前兩個值。 另外兩個更有趣。 在這里,我們定義對于給定的URL模式,到網關的所有請求都應轉發到由其名稱標識的服務。 請注意,我們不會將網關與這些服務的任何特定主機地址耦合。 網關將使用先前創建的發現服務找到它們。

最終基本設置驗證

啟動網關之后,應用程序應在端口8080上進行偵聽。嘗試使用配置的映射訪問這兩個域服務:

http:// localhost:8080 / articles
http:// localhost:8080 / authors

網關模式使我們能夠將API的客戶端與運行服務的特定主機分離。 只有網關的地址必須與客戶端共享。 網關還可以照顧重復服務的負載平衡,但是讓我們將這個話題再留一遍。

7.總結

乍一看,基本的Spring Cloud設置似乎非常復雜,尤其是與典型的整體應用程序基礎相比。 還有許多創建系統的構件。 但是,每個組件在設計時都考慮了“單一責任主體”。 我們了解了微服務體系結構中使用的三種基本模式,即服務發現,分布式配置和服務網關。 他們每個人都有一個專用的應用程序,僅專注于單個任務。 劃分職責是微服務體系結構的主要要素,即使我們創建的小型演示在實踐中也極大地描述了這個想法。

翻譯自: https://www.javacodegeeks.com/2017/10/spring-cloud-basic-setup.html

總結

以上是生活随笔為你收集整理的Spring Cloud –基本设置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。