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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

想要设计自己的微服务?看这篇文章就对了

發(fā)布時間:2024/4/13 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 想要设计自己的微服务?看这篇文章就对了 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~

本文由我就靜靜地看 發(fā)表于云+社區(qū)專欄

本文通過使用Spring Boot,Spring Cloud和Docker構(gòu)建的概念驗證應(yīng)用程序的示例,為了解常見的微服務(wù)架構(gòu)模式提供了一個起點(diǎn)。

該代碼在Github上可用,并且可以在Docker Hub上獲得圖像。只需一個命令即可啟動整個系統(tǒng)。

作為這個系統(tǒng)的基礎(chǔ),我選擇了一個舊項目,其后端曾經(jīng)是一個整體。該應(yīng)用程序提供了一種處理個人財務(wù),組織收入和支出,管理儲蓄,分析統(tǒng)計數(shù)據(jù)和創(chuàng)建簡單預(yù)測的方法。

功能服務(wù)

整體應(yīng)用程序被分解為三個核心微服務(wù)。所有這些都是可獨(dú)立部署的應(yīng)用程序,圍繞某些業(yè)務(wù)功能組織。

帳戶服務(wù)

包含一般用戶輸入邏輯和驗證:收入/費(fèi)用項目,節(jié)省和帳戶設(shè)置。

METHODPATHDESCRIPTIONUSER AUTHENTICATEDAVAILABLE FROM UI
GET/accounts/{account}Get specified account data
GET/accounts/currentGet current account data××
GET/accounts/demoGet demo account data (pre-filled incomes/expenses items, etc)×
PUT/accounts/currentSave current account data××
POST/accounts/Register new account

統(tǒng)計服務(wù)

對主要統(tǒng)計參數(shù)執(zhí)行計算并捕獲每個帳戶的時間序列。數(shù)據(jù)點(diǎn)包含標(biāo)準(zhǔn)化為基本貨幣和時間段的值。此數(shù)據(jù)可用于跟蹤帳戶生命周期中的現(xiàn)金流動態(tài)。

METHODPATHDESCRIPTIONUSER AUTHENTICATEDAVAILABLE FROM UI
GET/statistics/{account}Get specified account statistics
GET/statistics/currentGet current account statistics××
GET/statistics/demoGet demo account statistics×
PUT/statistics/{account}Create or update time series datapoint for specified account

通知服務(wù)

存儲用戶的聯(lián)系信息和通知設(shè)置(如提醒和備份頻率)。計劃工作人員從其他服務(wù)收集所需信息,并向訂閱客戶發(fā)送電子郵件。

METHODPATHDESCRIPTIONUSER AUTHENTICATEDAVAILABLE FROM UI
GET/notifications/settings/currentGet current account notification settings××
PUT/notifications/settings/currentSave current account notification settings××

注意

  • 每個微服務(wù)都有自己的數(shù)據(jù)庫,因此無法繞過API并直接訪問持久性數(shù)據(jù)。
  • 對于這個項目,我使用MongoDB作為每個服務(wù)的主數(shù)據(jù)庫。擁有多語言持久性體系結(jié)構(gòu)(以便選擇最適合服務(wù)要求的數(shù)據(jù)庫類型)也是有意義的。
  • 服務(wù)到服務(wù)通信非常簡單:微服務(wù)僅使用同步REST API進(jìn)行通信。現(xiàn)實(shí)世界系統(tǒng)中的常見做法是使用交互方式的組合。例如,執(zhí)行同步GET請求以檢索數(shù)據(jù)并通過Message broker使用異步方法進(jìn)行創(chuàng)建/更新操作,以便解耦服務(wù)和緩沖消息。這帶給我們 一致性 。

基建服務(wù)

分布式系統(tǒng)中有許多常見模式,可以幫助我們使所描述的核心服務(wù)工作。Spring cloud 提供了強(qiáng)大的工具,可以增強(qiáng)Spring Boot應(yīng)用程序的行為以實(shí)現(xiàn)這些模式。我簡要介紹一下:

配置服務(wù)

Spring Cloud Config 是分布式系統(tǒng)的水平可擴(kuò)展集中配置服務(wù)。它使用可插入的存儲庫層,目前支持本地存儲,Git和Subversion。

在這個項目中,我使用 native profile,它只是從本地類路徑加載配置文件。你可以在Config服務(wù)資源中查看 share 目錄 。現(xiàn)在,當(dāng)Notification-service請求它的配置時,使用shared/notification-service.yml 和 配置服務(wù)響應(yīng) shared/application.yml (在所有客戶端應(yīng)用程序之間共享)。

客戶端使用

只需構(gòu)建具有spring-cloud-starter-config 依賴性的Spring Boot應(yīng)用程序 ,自動配置將完成剩下的工作。

現(xiàn)在,你的應(yīng)用程序中不需要任何嵌入屬性。只需提供 bootstrap.yml 應(yīng)用程序名稱和配置服務(wù)URL:

spring:application:name: notification-servicecloud:config:uri: http://config:8888fail-fast: true 復(fù)制代碼

使用Spring Cloud Config,可以動態(tài)更改應(yīng)用程序配置

例如, EmailService bean 使用注釋 @RefreshScope。這意味著你可以更改電子郵件文本和主題行,而無需重建和重新啟動Notification Service應(yīng)用程序。

首先,在Config服務(wù)器中更改所需的屬性。然后,對Notification服務(wù)執(zhí)行刷新請求: curl -H "Authorization: Bearer #token#" -XPOST http://127.0.0.1:8000/notifications/refresh

你還可以使用 webhooks自動執(zhí)行此過程。

注意

  • 動態(tài)刷新有一些限制。 @RefreshScope 不適用于 @Configuration 類,不能影響 @Scheduled 方法。
  • fail-fast property表示如果Spring Boot應(yīng)用程序無法連接到Config Service,則會立即失敗啟動。當(dāng)你同時啟動所有應(yīng)用程序時,這非常有用 。
  • 下面有重要的安全說明。

驗證服務(wù)

授權(quán)職責(zé)完全提取到單獨(dú)的服務(wù)器,該服務(wù)器 為后端資源服務(wù)授予 OAuth2令牌。Auth Server用于用戶授權(quán)以及周邊內(nèi)部的安全機(jī)器到機(jī)器通信。

在這個項目中,我使用 Password credentials 授權(quán)類型進(jìn)行用戶授權(quán)(因為它僅由本機(jī)應(yīng)用程序UI使用),并且 Client Credentials 用作微服務(wù)授權(quán)的授權(quán)類型。

Spring Cloud Security提供方便的注釋和自動配置,使服務(wù)器和客戶端都能輕松實(shí)現(xiàn)。你可以在文檔中了解有關(guān)它的更多信息, 并檢查Auth Server代碼中的配置詳細(xì)信息 。

從客戶端來看,一切都與傳統(tǒng)的基于會話的授權(quán)完全相同。你可以從Principal 請求中檢索 對象,使用基于表達(dá)式的訪問控制和@PreAuthorize 注釋檢查用戶角色和其他內(nèi)容 。

PiggyMetrics中的每個客戶端(帳戶服務(wù),統(tǒng)計服務(wù),通知服務(wù)和瀏覽器)都有一個范圍: server用于后端服務(wù), ui - 用于瀏覽器。因此,我們還可以保護(hù)控制器免受外部訪問,例如:

@PreAuthorize("#oauth2.hasScope('server')") 復(fù)制代碼@RequestMapping(value = "accounts/{name}", method = RequestMethod.GET) 復(fù)制代碼public List<DataPoint> getStatisticsByAccountName(@PathVariable String name) { 復(fù)制代碼 return statisticsService.findByAccountName(name); 復(fù)制代碼} 復(fù)制代碼

API網(wǎng)關(guān)

如你所見,有三種核心服務(wù),它們將外部API暴露給客戶端。在現(xiàn)實(shí)世界的系統(tǒng)中,這個數(shù)字可以非常快速地增長,并且整個系統(tǒng)的復(fù)雜性也會增加。實(shí)際上,渲染一個復(fù)雜的網(wǎng)頁可能涉及數(shù)百種服務(wù)。

理論上,客戶端可以直接向每個微服務(wù)發(fā)出請求。但顯然這個選項存在挑戰(zhàn)和局限,例如必須知道所有端點(diǎn)地址,分別對每個信息和平執(zhí)行http請求,在客戶端合并結(jié)果。另一個問題是非網(wǎng)絡(luò)友好協(xié)議,可能在后端使用。

通常,更好的方法是使用API網(wǎng)關(guān)。它是進(jìn)入系統(tǒng)的單一入口點(diǎn),用于通過將請求路由到適當(dāng)?shù)暮蠖朔?wù)或通過調(diào)用多個后端服務(wù)并聚合結(jié)果來處理請求 。此外,它還可用于身份驗證,壓力測試,服務(wù)遷移,靜態(tài)響應(yīng)處理,主動流量管理。

Netflix開源了 這樣的優(yōu)質(zhì)服務(wù),現(xiàn)在有了Spring Cloud,我們可以通過一個@EnableZuulProxy注釋啟用它 。在這個項目中,我使用Zuul存儲靜態(tài)內(nèi)容(UI應(yīng)用程序)并將請求路由到適當(dāng)?shù)奈⒎?wù)。以下是Notification服務(wù)的簡單基于前綴的路由配置:

zuul: 復(fù)制代碼 routes: 復(fù)制代碼 notification-service: 復(fù)制代碼 path: /notifications/** 復(fù)制代碼 serviceId: notification-service 復(fù)制代碼 stripPrefix: false 復(fù)制代碼

這意味著所有以請求開頭的請求 /notifications 都將路由到Notification服務(wù)。可以看到,沒有硬編碼的地址。Zuul使用 服務(wù)發(fā)現(xiàn) 機(jī)制來定位Notification服務(wù)實(shí)例以及 Circuit Breaker和Load Balancer。

Service Discovery

另一種眾所周知的架構(gòu)模式是Service Discovery。它允許自動檢測服務(wù)實(shí)例的網(wǎng)絡(luò)位置,這些服務(wù)實(shí)例可能由于自動擴(kuò)展,故障和升級而動態(tài)分配地址。

服務(wù)發(fā)現(xiàn)的關(guān)鍵部分是注冊表。我在這個項目中使用了Netflix Eureka。當(dāng)客戶端負(fù)責(zé)確定可用服務(wù)實(shí)例的位置(使用注冊服務(wù)器)并在它們之間加載平衡請求時,Eureka是客戶端發(fā)現(xiàn)模式的一個很好的例子。

使用Spring Boot,你可以輕松地使用spring-cloud-starter-eureka-server 依賴項, @EnableEurekaServer 注釋和簡單配置屬性構(gòu)建Eureka Registry 。

通過@EnableDiscoveryClient 注釋和 bootstrap.yml 應(yīng)用程序名稱啟用客戶端支持 :

spring:application:name: notification-service 復(fù)制代碼

現(xiàn)在,在應(yīng)用程序啟動時,它將向Eureka Server注冊并提供元數(shù)據(jù),例如主機(jī)和端口,運(yùn)行狀況指示器URL,主頁等.Eureka從屬于服務(wù)的每個實(shí)例接收消息。如果故障超過可配置的時間表,則實(shí)例將從注冊表中刪除。

此外,Eureka提供了一個簡單的界面,你可以在其中跟蹤正在運(yùn)行的服務(wù)和可用實(shí)例的數(shù)量: http://localhost:8761

負(fù)載均衡器,斷路器和Http客戶端

Netflix OSS提供了另一套很棒的工具。

Ribbon

Ribbon是一個客戶端負(fù)載均衡器,可以讓你對HTTP和TCP客戶端的行為進(jìn)行大量控制。與傳統(tǒng)的負(fù)載均衡器相比,每次線上調(diào)用都不需要額外的跳過 - 你可以直接聯(lián)系所需的服務(wù)。

開箱即用,它本身與Spring Cloud和Service Discovery集成。 Eureka Client 提供可用服務(wù)器的動態(tài)列表,因此Ribbon可以在它們之間取得平衡。

Hystrix

Hystrix是Circuit Breaker模式的實(shí)現(xiàn) ,它可以控制通過網(wǎng)絡(luò)訪問的依賴關(guān)系的延遲和故障。主要思想是在具有大量微服務(wù)的分布式環(huán)境中停止級聯(lián)故障。這有助于快速失敗并盡快恢復(fù) - 自我修復(fù)的容錯系統(tǒng)的重要方面。

除了斷路器控制之外,使用Hystrix還可以添加一個回退方法,以便在主命令失敗時獲取默認(rèn)值。

此外,Hystrix會為每個命令生成執(zhí)行結(jié)果和延遲的指標(biāo),我們可以使用它來 監(jiān)控系統(tǒng)行為。

Feign

Feign是一個聲明式HTTP客戶端,可與Ribbon和Hystrix無縫集成。實(shí)際上,通過一個 spring-cloud-starter-feign 依賴關(guān)系和 @EnableFeignClients 注釋,你可以擁有一整套負(fù)載均衡器,斷路器和HTTP客戶端,并具有合理的即用型默認(rèn)配置。

以下是帳戶服務(wù)的示例:

@FeignClient(name = "statistics-service") public interface StatisticsServiceClient {@RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)void updateStatistics(@PathVariable("accountName") String accountName, Account account); } 復(fù)制代碼
  • 你需要的只是一個界面
  • 你可以在Spring MVC控制器和Feign方法之間共享 @RequestMapping
  • 以上示例指定了所需的服務(wù)ID - statistics-service感謝Eureka的自動發(fā)現(xiàn)(但顯然你可以訪問具有特定URL的任何資源)

監(jiān)控儀表板

在此項目配置中,每個帶有Hystrix的微服務(wù)都通過Spring Cloud Bus(使用AMQP代理)將指標(biāo)推送到Turbine。Monitoring項目只是一個帶有Turbine 和 Hystrix Dashboard的小型Spring啟動應(yīng)用程序 。

讓我們看看我們在負(fù)載下的系統(tǒng)行為:帳戶服務(wù)調(diào)用統(tǒng)計服務(wù),它響應(yīng)模仿延遲。響應(yīng)超時閾值設(shè)置為1秒。

0 ms delay500 ms delay800 ms delay1100 ms delay
表現(xiàn)良好的系統(tǒng)。吞吐量約為22個請求/秒。統(tǒng)計服務(wù)中的活動線程數(shù)量很少。中位服務(wù)時間約為50毫秒。活動線程的數(shù)量正在增長。我們可以看到紫色線程池拒絕的數(shù)量,因此大約有30-40%的錯誤,但電路仍然關(guān)閉。半開狀態(tài):失敗命令的比例超過50%,斷路器啟動。睡眠窗口的時間量后,下一個請求通過。100%的請求失敗。電路現(xiàn)在永久開放。睡眠時間后重試不會再次關(guān)閉電路,因為單個請求太慢。

日志分析

在嘗試識別分布式環(huán)境中的問題時,集中日志記錄非常有用。Elasticsearch,Logstash和Kibana堆棧使你可以輕松搜索和分析日志,利用率和網(wǎng)絡(luò)活動數(shù)據(jù)。我的其他項目中描述隨時可用的Docker配置 。

安全

高級安全配置超出了此概念驗證項目的范圍。要更真實(shí)地模擬真實(shí)系統(tǒng),請考慮使用https和JCE密鑰庫來加密微服務(wù)密碼和配置服務(wù)器屬性內(nèi)容( 有關(guān)詳細(xì)信息,請參閱 文檔)。

基建自動化

與部署整體應(yīng)用程序相比,部署微服務(wù)具有相互依賴性,這是一個復(fù)雜得多的過程。擁有一個完全自動化的基礎(chǔ)設(shè)施非常重要。我們可以通過持續(xù)交付方法獲得以下好處:

  • 隨時發(fā)布軟件的能力。
  • 任何構(gòu)建都可能最終成為一個版本。
  • 構(gòu)建工件一次,根據(jù)需要進(jìn)行部署。

這是一個簡單的Continuous Delivery工作流程,在此項目中實(shí)現(xiàn):

在此 配置中,Travis CI為每個成功的Git推送構(gòu)建標(biāo)記圖像。因此latest ,Docker Hub上的每個微服務(wù)始終都有一個 映像,舊的映像使用Git commit hash進(jìn)行標(biāo)記。如果需要,可以輕松部署其中任何一個并快速回滾。

如何運(yùn)行所有的東西?

這真的很容易,我建議你試試。請記住,你要啟動8個Spring Boot應(yīng)用程序,4個MongoDB實(shí)例和RabbitMq。確保4 Gb 的計算機(jī)上有 RAM。你始終可以通過網(wǎng)關(guān),注冊表,配置,身份驗證服務(wù)和帳戶服務(wù)運(yùn)行重要服務(wù)。

在你開始之前

  • 安裝Docker和Docker Compose。
  • 出口環(huán)境變量: CONFIG_SERVICE_PASSWORD, NOTIFICATION_SERVICE_PASSWORD, STATISTICS_SERVICE_PASSWORD, ACCOUNT_SERVICE_PASSWORD, MONGODB_PASSWORD

生產(chǎn)模式

在此模式下,所有最新圖像都將從Docker Hub中提取。只需復(fù)制 docker-compose.yml 并點(diǎn)擊即可 docker-compose up -d。

發(fā)展模式

如果你想自己構(gòu)建映像(例如,在代碼中進(jìn)行一些更改),則必須使用Maven克隆所有存儲庫并構(gòu)建工件。然后,運(yùn)行docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

docker-compose.dev.yml 繼承 docker-compose.yml 在本地構(gòu)建映像的額外可能性,并公開所有容器端口以便于開發(fā)。

重要的終點(diǎn)

  • localhost:80 - 網(wǎng)關(guān)
  • localhost:8761 - Eureka Dashboard
  • localhost:9000 - Hystrix儀表板
  • localhost:8989 - Hystrix儀表板源
  • localhost:15672 - RabbitMq管理

注意

所有Spring Boot應(yīng)用程序都需要運(yùn)行 Config Server 才能啟動。但是我們可以同時啟動所有容器,因為 fail-fast Spring Boot屬性和 restart: always docker-compose選項。這意味著所有相關(guān)容器將嘗試重新啟動,直到Config Server啟動并運(yùn)行。

此外,Service Discovery機(jī)制在所有應(yīng)用程序啟動后需要一些時間。在實(shí)例,Eureka服務(wù)器和客戶端在其本地緩存中都具有相同的元數(shù)據(jù)之前,客戶端無法發(fā)現(xiàn)任何服務(wù),因此可能需要3次偵聽。默認(rèn)偵聽時間為30秒。

原文標(biāo)題《Microservice Architectures With Spring Cloud and Docker》

作者:Alexander Lukyanchikov

譯者:我就靜靜地看

不代表云加社區(qū)觀點(diǎn),更多詳情請查看原文鏈接

問答 微服務(wù)架構(gòu)的優(yōu)勢與不足? 相關(guān)閱讀 Web應(yīng)用程序開發(fā)指南 深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的六大趨勢 如何編寫自己的jQuery插件? 【每日課程推薦】機(jī)器學(xué)習(xí)實(shí)戰(zhàn)!快速入門在線廣告業(yè)務(wù)及CTR相應(yīng)知識

此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,更多原文請點(diǎn)擊

搜索關(guān)注公眾號「云加社區(qū)」,第一時間獲取技術(shù)干貨,關(guān)注后回復(fù)1024 送你一份技術(shù)課程大禮包!

海量技術(shù)實(shí)踐經(jīng)驗,盡在云加社區(qū)!

總結(jié)

以上是生活随笔為你收集整理的想要设计自己的微服务?看这篇文章就对了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。