十次服務開發v1.第8章_第1頁
十次服務開發v1.第8章_第2頁
十次服務開發v1.第8章_第3頁
十次服務開發v1.第8章_第4頁
十次服務開發v1.第8章_第5頁
免費預覽已結束,剩余19頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章-SpringCloud學習目標熔斷器在微服務架構中通常會有多個服務層調用,基礎服務的故障可能會導致級聯故障,進而造成整個系統不可用的情況,這種現象被稱為服務雪崩效應。服務雪崩效應是一種因“服務提供者”的不可用導致“服務消費者”的不可用并將不可用逐漸放大的過程。如果下圖所示:A作為服務提供者,B為A的服務消費者,C和D是B的服務消費者。A不可用引起了B的不可用,并將不可用像滾雪球一樣放大到C和D時,雪崩效應就形成了如何避免產生這種雪崩效應呢?我們可以使用Hystrix來實現熔斷器什么是 [h?st'r?ks]的中文含義是豪豬,因其背上長滿了刺,而擁有自我保Hsix能使你的系統在出現依賴服務失效的時候,通過系統所依賴的服務,防止服務級聯失敗,同時提供失敗回退機制,更優雅地應對失效,并使你的系統能更快地從異常中恢復。了解熔斷器模式請看下 本身支持Hystrix,不需要額外引入依修改tensquare_qa模塊的application.yml,開啟在com.tensquare.qa.client包下創建impl包,包下創建熔斷實現類,實現自publicclassLabelClientImplimplementsLabelClientpublicResultfindById(Stringid)returnnewResult(falseStatusCode.ERROR,"熔斷器啟動了}}修改LabelClient的注@FeignClient@FeignClient(value="tensquare‐base",fallback=測試運重新啟動問答微服務,測試看熔斷器是否微服務網關不同的微服務一般有不同的網絡地址,而外部的客戶端可能需要調用多個服務的接口才能完成一個業務需求。比如一個購票的收集APP,可能回調用分類微服務,用戶微服務,支付微服務等。如果客戶端直接和微服務進行通信,會存在一下問題:#客戶端會多次請求不同微服務,增加客戶端的復#存在跨域請求,在一定場景下處理相對#認證復雜,每一個服務都需要獨立難以重構,隨著項目的迭代,可能需要重新劃分微服務,如果客戶端直接和微服務通 某些微服務可能使用了其他協議,直接有一什么是Zul是Netlix開源的微服務網關,他可以和Erk,Rio,Hytrix等組件配合使用。Zul組件的是一系列的過濾器,這些過濾器可以完成以下功能:#認證和安全:識別每一個資源的驗證要求,并那些不符的請#與##動態路由:動態將請求路由到不同后端#壓力測試:逐漸增加指向集群的流量,以了解 負載分配:為每一種負載類型分配對應容量,并棄用超出限定值的 靜態響應處理:邊緣位置進行響應,避免轉發到內部多區域彈性:跨域AWSRegion進行請求路由,旨在實現ELB(ElasticLoadBalancing)使SpringCloud對Zuul進行了整合和增強。管理微服務網創建子模塊tensquare_manager,pom.xml引入eureka-client和zuul創建nametensquare‐managerserviceUrlEureka客戶端與Eurekaroutes:tensquare‐gathering:pathgathering/**配置請求URLserviceId:tensquare‐gathering#指定 中心中的服務tensquare‐articlepatharticle/**配置請求URLserviceId:tensquare‐article#指定 中心中的服務tensquare‐basepathbase/**配置請求URLserviceId:tensquare‐base#指定 中心中的服務tensquare‐friendpathfriend/**配置請求URLserviceId:tensquare‐friend#指定 中心中的服務tensquare‐qapathqa/**配置請求URLserviceId:tensquare‐qa#指定 中心中的服務tensquare‐recruitpathrecruit/**配置請求URLserviceId:tensquare‐recruit#指定 中心中的服務tensquare‐spitpathspit/**配置請求URLserviceId:tensquare‐spit#指定 中心中的服務tensquare‐userpathuser/**配置請求URLserviceId:tensquare‐user#指定 中心中的服務編寫啟動publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}前臺的微服務創建子模塊tensquare_web,pom.xml引入依賴創建nametensquare‐web指定服務名serviceUrlEureka客戶端與Eureka服務端進行交互的地址routes:tensquare‐gathering:pathgathering/**配置請求URLserviceId:tensquare‐gathering#指定 中心中的服務tensquare‐articlepatharticle/**配置請求URLserviceId:tensquare‐article#指定 中心中的服務tensquare‐basepathbase/**配置請求URLserviceId:tensquare‐base#指定 中心中的服務tensquare‐friendpathfriend/**配置請求URLserviceId:tensquare‐friend#指定 中心中的服務tensquare‐qapathqa/**配置請求URLserviceId:tensquare‐qa#指定 中心中的服務tensquare‐recruitpathrecruit/**配置請求URLserviceId:tensquare‐recruit#指定 中心中的服務tensquare‐spitpathspit/**配置請求URLserviceId:tensquare‐spit#指定 中心中的服務tensquare‐userpathuser/**配置請求URLserviceId:tensquare‐user#指定 中心中的服務tensquare‐searchpathsearch/**配置請求URLserviceId:tensquare‐search#指定 中心中的服務編寫啟動publicclassWebApplicationpublicstaticvoidmain(String[]args){}}Zuul過濾器快速我們現在在 創建一個簡單的zuul過濾publicclassWebFilterextendsZuulFilterpublicStringfilterType(){return"pre";前置過濾器}publicintfilterOrder()return0;優先級為0}publicbooleanshouldFilter()returntrue;是否執行該過濾器,此處為true}publicObjectrun()throwsreturnnull;}}啟動tensquare_web會發現過濾器已經filterType:返回一個字符串代表過濾器的類型,在zuul中定義了四種不同生命周期的過pre:可以在請求被路由之前route:在路由請求時候被post:在route和error過濾器之后被調error:處理請求時發生錯誤時被:通過int值來定義過濾器的執行實現過濾器的開關。在上例中,我們直接返回true,所以該過濾器總是生效:過濾器的具體邏輯前臺的token轉我們現在在過濾器中接收header,轉發給微服修改tensquare_web的過濾器。如果有token,直接轉發publicObjectrunthrowsZuulException{ ontextreq ontext= HttpServletRequestrequest=req Stringauthorization=request.getHeader("Authorization");}return}管理過濾器實現token校 因為是管理使用,所以需要在過濾器中對token 修改tensquare_manager配置文件修改tensquare_manager的啟動類,添加publicjwtUtil(){returnnewtensquare_manager編寫過濾器publicclassManagerFilterextendsZuulFilterprivateJwtUtilpublicStringfilterType過濾器類型return"pre";//前置過濾器}publicintfilterOrder()return0;//}publicbooleanshouldFilter()returntrue;//過濾器開關,true}publicObjectrunthrowsZuulException ontextreq HttpServletRequestrequest=req returnnull;}StringauthHeaderif(authHeader!=null&&authHeader.startsWith("Bearer")){Stringtoken=authHeader.substring(7);Claimsclaims=jwtUtil.parseJWT(token);息return}}} return}}需要注意,這里我們通過ctx.se dZuulResponse(false)令zuul過濾該請求,不對其進行路由,然后通過ctx.setResponseStatusCode(401)設置了其返回的錯誤碼集中配置組件以需要分布式配置中心組件。在SpringCloud中,有分布式配置中心組件springcloudconfig,它支持配置服務放在配置服務的內存中(即本地),也支持放在Git倉庫中。在springcloudconfig組件中,分兩個角色,一是configserver,二是configConfigServer是一個可橫向擴展、集中式的配置服務器,它用于集中管理應用程序各個環境下的配置,默認使用Git配置文件內容,也可以使用SVN,或者是本地文件ConfigClient是ConfigServer的客戶端,用于操作在ConfigServer中的配置內容。微服務在啟動時會請求ConfigServer獲取配置文件的內容,請求到后再啟動容器。詳細內容看文檔將配置文件提交到使用時,國內的用戶經常遇到的問題是速度太慢,有時候還會出現無法連接 ) 步驟瀏覽器打 ,用戶,后登陸碼云管理控制創建項目tensquare- (點擊右上角的加號,下拉菜單選擇創建項目上傳配置文件,將tsrsi.l改名為vyl后可以通過拖拽的方式將文件上傳上傳成功后列表可可以再次編輯此文文件命名規則{application}-{profile}.yml或{applicationapplication為應用名稱profile指的開發環境(用于區分開發環境,測試環境、生產環境git地址,備地址為 /chuanzhiliubei/tensquare-配置中心微創建工程模塊服務tensquare_config,pom.xml創建啟動類publicclassConfigServerApplication{publicstaticvoidmain(String[]args){}}編寫配置文件client:瀏覽器測試:可以看到配置內在tensquare_base工程添加依添加bootstrap.yml刪除profile:devenabled:service‐id:client:tensquare_eurekatensquare_configtensquare_base,看是消息總線組件SpringCloudBus簡如果我們更新碼云中的配置文件,那客戶端工程是否可以及時接受新的配置信呢?我們現在來做有一個測試,修改一下碼云中的配置文件中mysql的端口然后測數據依然可以查詢出來,證明修改服務器中的配置并沒有更新立刻到工程,只有重新啟動程序才會配置。那我們如果想在不重啟微服務的情況下更新配置如何來實現呢?我們使用SpringCloudBus來實現配置的自動更新。配置服務修改tensquare_config工程的pom.xml,依修改application.yml,添加配managementmanagement include:配置客戶我們還是以基礎模塊為例,加入消息修改tensquare_base工程入依啟動tensquare_eureka、tensquare_config和tensquare_base修改碼云上的配置文件將數據庫連接IP改為,在本地部署一份數據postman測試Url:再次觀察輸出的數據是否是了本地的mysql數據自定義配置的修改碼云上的配置文件,增加自定義ip:在tensquare_base工程中新建publicclassprivateStringip;(value="/ip",method=publicStringip

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論