Eureka(服務(wù)治理言蛇,配置中心):
? ? ? ?Client服務(wù)啟動后向EurekaServer注冊僻他,Eureka Server會將注冊信息向其他Eureka Server進(jìn)行同步,當(dāng)服務(wù)消費(fèi)者要調(diào)用服務(wù)提供者腊尚,則向服務(wù)注冊中心獲取服務(wù)提供者地址吨拗,然后會將服務(wù)提供者地址緩存在本地,下次再調(diào)用時(shí),則直接從本地緩存中取劝篷,完成一次調(diào)用哨鸭。當(dāng)服務(wù)注冊中心Eureka Server檢測到服務(wù)提供者因?yàn)殄礄C(jī)、網(wǎng)絡(luò)原因不可用時(shí)娇妓,則在服務(wù)注冊中心將服務(wù)置為DOWN狀態(tài)像鸡,并把當(dāng)前服務(wù)提供者狀態(tài)向訂閱者發(fā)布,訂閱過的服務(wù)消費(fèi)者更新本地緩存哈恰。服務(wù)提供者在啟動后只估,周期性(默認(rèn)30秒)向Eureka Server發(fā)送心跳,進(jìn)行服務(wù)續(xù)約蕊蝗。Eureka Server在一定的時(shí)間(默認(rèn)90秒)未收到客戶端的心跳仅乓,則認(rèn)為服務(wù)宕機(jī),注銷該實(shí)例蓬戚。服務(wù)間使用標(biāo)準(zhǔn)的REST方式通訊夸楣。
Eureka Server 集群:?Eureka通過互相注冊的方式來實(shí)現(xiàn)高可用的部署,所以我們只需要將Eureke Server配置其他可用的serviceUrl就能實(shí)現(xiàn)高可用部署
CAP:一個(gè)分布式系統(tǒng)不可能同時(shí)滿足C(一致性)子漩、A(可用性)和P(分區(qū)容錯(cuò)性)豫喧。
Zookeeper? :保證CP(強(qiáng)一致性Eureka各個(gè)節(jié)點(diǎn)都是平等的,幾個(gè)節(jié)點(diǎn)掛掉不會影響正常節(jié)點(diǎn)的工作幢泼,剩余的節(jié)點(diǎn)依然可以提供注冊和查詢服務(wù)紧显。而Eureka的客戶端在向某個(gè)Eureka注冊或時(shí)如果發(fā)現(xiàn)連接失敗,則會自動切換至其它節(jié)點(diǎn)缕棵,只要有一臺Eureka還在孵班,就能保證注冊服務(wù)可用(保證可用性),只不過查到的信息可能不是最新的(不保證強(qiáng)一致性)招驴。除此之外篙程,Eureka還有一種自我保護(hù)機(jī)制,如果在15分鐘內(nèi)超過85%的節(jié)點(diǎn)都沒有正常的心跳别厘,那么Eureka就認(rèn)為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障虱饿,此時(shí)會出現(xiàn)以下幾種情況:?1. Eureka不再從注冊列表中移除因?yàn)殚L時(shí)間沒收到心跳而應(yīng)該過期的服務(wù)?2. Eureka仍然能夠接受新服務(wù)的注冊和查詢請求,但是不會被同步到其它節(jié)點(diǎn)上(即保證當(dāng)前節(jié)點(diǎn)依然可用)?3. 當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí)触趴,當(dāng)前實(shí)例新的注冊信息會被同步到其它節(jié)點(diǎn)中)氮发。在leader出現(xiàn)宕機(jī)時(shí)zk無法對外提供訪問。
Eureka:保證 AP(最終一致性)冗懦。Eureka各個(gè)節(jié)點(diǎn)都是平等的爽冕,幾個(gè)節(jié)點(diǎn)掛掉不會影響正常節(jié)點(diǎn)的工作,剩余的節(jié)點(diǎn)依然可以提供注冊和查詢服務(wù)披蕉。而Eureka的客戶端在向某個(gè)Eureka注冊或查詢時(shí)如果發(fā)現(xiàn)連接失敗扇售,則會自動切換至其它節(jié)點(diǎn)前塔,只要有一臺Eureka還在,就能保證注冊服務(wù)可用(保證可用性)承冰,只不過查到的信息可能不是最新的(不保證強(qiáng)一致性)华弓。除此之外,Eureka還有一種自我保護(hù)機(jī)制困乒,如果在15分鐘內(nèi)超過85%的節(jié)點(diǎn)都沒有正常的心跳寂屏,那么Eureka就認(rèn)為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障,此時(shí)會出現(xiàn)以下幾種情況:
?????1. Eureka不再從注冊列表中移除因?yàn)殚L時(shí)間沒收到心跳而應(yīng)該過期的服務(wù)
?????2. Eureka仍然能夠接受新服務(wù)的注冊和查詢請求娜搂,但是不會被同步到其它節(jié)點(diǎn)上(即保證當(dāng)前節(jié)點(diǎn)依然可用)?
? ? ?3. 當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí)迁霎,當(dāng)前實(shí)例新的注冊信息會被同步到其它節(jié)點(diǎn)中
Ribbon(實(shí)現(xiàn)客戶端負(fù)載均衡):
? ? ? ?Ribbon實(shí)現(xiàn)的關(guān)鍵點(diǎn)是為ribbon定制的RestTemplate,ribbon利用了RestTemplate的攔截器機(jī)制百宇,在攔截器中實(shí)現(xiàn)ribbon的負(fù)載均衡考廉。負(fù)載均衡的基本實(shí)現(xiàn)就是利用applicationName從服務(wù)注冊中心獲取可用的服務(wù)地址列表,然后通過一定算法負(fù)載携御,決定使用哪一個(gè)服務(wù)地址來進(jìn)行http調(diào)用昌粤。在Ribbon實(shí)現(xiàn)中,定義了一個(gè)LoadBalancerInterceptor啄刹,ribbon就是通過這個(gè)攔截器進(jìn)行攔截請求涮坐,然后實(shí)現(xiàn)負(fù)載均衡調(diào)用。
Ribbon 負(fù)載均衡類型:
? ? ?RandomRule:該策略實(shí)現(xiàn)了從服務(wù)實(shí)例清單中隨機(jī)選擇一個(gè)服務(wù)實(shí)例的功能
? ??RoundRobinRule :該策略實(shí)現(xiàn)了按照線性輪詢的方式的方式一次選擇每個(gè)服務(wù)實(shí)例的功能誓军。與RandomRule非常類似袱讹。增加了一個(gè)count計(jì)數(shù)變量,該變量會在每次循環(huán)之后累加昵时,如果一直選擇不到server超過10次捷雕,那么就會結(jié)束嘗試,并打印一個(gè)警告信息壹甥。
? ? ? RetryRule :該策略實(shí)現(xiàn)了一個(gè)具備重試機(jī)制的實(shí)例選擇功能救巷。默認(rèn)使用了RoudRobinRule實(shí)例。
? ? ??WeightedResponseTimeRule :該策略是對RoundRobinRule的擴(kuò)展盹廷,增加了根據(jù)實(shí)例等運(yùn)行情況來計(jì)算權(quán)重征绸,并根據(jù)權(quán)重來挑選實(shí)例久橙,以達(dá)到更優(yōu)的分配效果俄占,它的實(shí)現(xiàn)主要有三個(gè)核心內(nèi)容:定時(shí)任務(wù)、權(quán)重計(jì)算淆衷、 實(shí)例選擇 缸榄。
? ? ??ClientConfigEnabledRoundRobinRule :實(shí)現(xiàn)功能與?RoundRobinRule相同 。
Hystrix(熔斷器祝拯,防止服務(wù)雪崩 ):
服務(wù)隔離:
????????在微服務(wù)架構(gòu)中,我們實(shí)現(xiàn)的一個(gè)業(yè)務(wù)邏輯通常會依賴多個(gè)服務(wù)Hystrix甚带。例如:A服務(wù)依賴B她肯、C服務(wù),A服務(wù)在調(diào)用B/C時(shí)會共享線程池鹰贵。如果在調(diào)用B服務(wù)無響應(yīng)時(shí)晴氨,所有應(yīng)用都處于等待狀態(tài);此時(shí)服務(wù)開始雪崩碉输。通過將每個(gè)依賴服務(wù)分配獨(dú)立的線程池進(jìn)行資源隔離, 從而避免服務(wù)雪崩籽前。服務(wù)隔離會將A服務(wù)線程數(shù)量分配給各個(gè)依賴服務(wù):例如:B40線程,C60線程敷钾。
熔斷器模式:
? ??????服務(wù)的健康狀況 = 請求失敗數(shù) / 請求總數(shù)
????????熔斷器開關(guān)由關(guān)閉到打開的狀態(tài)轉(zhuǎn)換是通過當(dāng)前服務(wù)健康狀況和設(shè)定閾值比較決定的枝哄。
? ??????當(dāng)熔斷器開關(guān)關(guān)閉時(shí), 請求被允許通過熔斷器.,如果當(dāng)前健康狀況高于設(shè)定閾值, 開關(guān)繼續(xù)保持關(guān)閉. 如果當(dāng)前健康狀況低于設(shè)定閾值, 開關(guān)則切換為打開狀態(tài)阻荒。
? ??????當(dāng)熔斷器開關(guān)打開時(shí), 請求被禁止通過挠锥。當(dāng)熔斷器開關(guān)處于打開狀態(tài), 經(jīng)過一段時(shí)間后, 熔斷器會自動進(jìn)入半開狀態(tài), 這時(shí)熔斷器只允許一個(gè)請求通過. 當(dāng)該請求調(diào)用 成功時(shí), 熔斷器恢復(fù)到關(guān)閉狀態(tài).。若該請求失敗, 熔斷器繼續(xù)保持打開狀態(tài), 接下來的請求被禁止通過。 熔斷器的開關(guān)能保證服務(wù)調(diào)用者在調(diào)用異常服務(wù)時(shí), 快速返回結(jié)果, 避免大量的同步等待. 并且熔斷器能在一段時(shí)間后繼續(xù)偵測請求執(zhí)行結(jié)果, 提供恢復(fù)服務(wù)調(diào)用的可能。
命令模式:
????????Hystrix使用命令模式(繼承HystrixCommand類或者是HystrixObservableCommand類)來包裹具體的服務(wù)調(diào)用邏輯(run方法), 并在命令模式中添加了服務(wù)調(diào)用失敗后的降級邏輯(getFallback).同時(shí)我們在Command的構(gòu)造方法中可以定義當(dāng)前服務(wù)線程池和熔斷器的相關(guān)參數(shù) 蒸甜。(也可以使用注解:@HystrixCommand)
Feign(方便各個(gè)服務(wù)之間調(diào)用厅篓。也可以實(shí)現(xiàn)服務(wù)降級):
主程序入口添加了@EnableFeignClients注解開啟對FeignClient掃描加載處理。根據(jù)Feign Client的開發(fā)規(guī)范涮俄,定義接口并加@FeignClientd注解。當(dāng)程序啟動時(shí),回進(jìn)行包掃描球昨,掃描所有@FeignClients的注解的類,并且講這些信息注入Spring IOC容器中眨攘,當(dāng)定義的的Feign接口中的方法唄調(diào)用時(shí)主慰,通過JDK的代理方式,來生成具體的RequestTemplate.當(dāng)生成代理時(shí)鲫售,F(xiàn)eign會為每個(gè)接口方法創(chuàng)建一個(gè)RequestTemplate共螺。
當(dāng)生成代理時(shí),F(xiàn)eign會為每個(gè)接口方法創(chuàng)建一個(gè)RequestTemplate對象情竹,改對象封裝可HTTP請求需要的全部信息藐不,如請求參數(shù)名,請求方法等信息都是在這個(gè)過程中確定的秦效。
然后RequestTemplate生成Request,然后把Request交給Client去處理雏蛮,這里指的時(shí)Client可以時(shí)JDK原生的URLConnection,Apache的HttpClient,也可以時(shí)OKhttp,最后Client被封裝到LoadBalanceClient類阱州,這個(gè)類結(jié)合Ribbon負(fù)載均衡發(fā)器服務(wù)之間的調(diào)用挑秉。
Zuul(服務(wù)網(wǎng)關(guān)):
服務(wù)網(wǎng)關(guān),自身包含Ribbon苔货、Hystrix模塊:?
?1.作為系統(tǒng)入口犀概,屏蔽系統(tǒng)內(nèi)部各個(gè)微服務(wù)細(xì)節(jié)立哑。? ??
2.可以與服務(wù)治理框架結(jié)合,實(shí)現(xiàn)自動化的服務(wù)實(shí)力維護(hù)集負(fù)載均衡的路由轉(zhuǎn)發(fā)姻灶。? ??
3.可以實(shí)現(xiàn)接口權(quán)限校驗(yàn)與微服務(wù)的業(yè)務(wù)邏輯解耦铛绰。? ? ??
?4.通過服務(wù)網(wǎng)關(guān)中的過濾器,在各生命周期中去校驗(yàn)請求的內(nèi)容产喉,將原本在對外服務(wù)層做的校驗(yàn)前移至耻,保證微服務(wù)的無狀態(tài)性,同時(shí)降低了微服務(wù)的測試難度镊叁,讓服務(wù)本身更關(guān)注業(yè)務(wù)邏輯尘颓。??
多實(shí)例配置:? ??
????xxxxxx.ribbon.listOfServers:配置多個(gè)實(shí)例。?
路徑匹配:
????/晦譬?匹配一個(gè)字符
????/*匹配多個(gè)字符
? ???/**匹配任意字符目錄
? ??zuul.ignored-patterns 配置希望zuul忽略的url?
核心過濾器:
? ??????pre過濾器 :主要是在請求路由之前調(diào)用疤苹,很多驗(yàn)證可以在這里做?
? ??????route過濾器:在路由請求時(shí)候被調(diào)用,主要用來轉(zhuǎn)發(fā)請求
? ? ? ? ?post過濾器:?主要用來處理響應(yīng)請求
? ??????? error過濾器:當(dāng)錯(cuò)誤發(fā)生時(shí)敛腌,會經(jīng)由這個(gè)類型的過濾器處理? ??
zuul與Spring Cloud Config 整合:
? ???須由zuul實(shí)例化? zuulproperties 且添加@RefreshScope?
Spring Cloud Config:
占位符匹配git倉庫:
????默認(rèn)倉庫:
? ? ? ? ? ? ? ? spring.cloud.config.server.git.uri=http://git.com/app/config-repo
????????占位符一(匹配路徑:http://localhost:7000/dev/*):? ? ? ? ? ? ? ??
? ??????????????spring.cloud.config.server.git.repos.dev.pattern=dev/*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????spring.cloud.config.server.git.repos.dev.uri=file://home/git/config-repo? ? ? ? ??
????????占位符二(匹配路徑:http://localhost:70000/prod/pp* 和 http://localhost:70000/online/oo*):? ? ? ? ? ? ? ??
? ??????????????? spring.cloud.config.server.git.repos.prod.pattern=prod/pp*,online/oo*? ??????????????? ??????????????????spring.cloud.config.server.git.repos.dev.uri=http://git.com/app/config-repo? ??
? ? 加密解密:
? ??????{cipher} 可以是倉庫文件中密碼自動加密
? ??????encrypt.key=xxxx 指定加密的鹽
? ??????curl http://localhost:7000/encrypt -d xxx 加密
? ??????curl http://localhost:7000/decrypt -d ******** 解密
????Client 端:
? ??????須指定:label (git分支)卧土、profile(哪個(gè)環(huán)境的配置文件)、 server端url
????失敗快速響應(yīng):? ?
? ???????spring.cloud.config.failFast=true? ?在項(xiàng)目啟動時(shí)先連接config server?
? ??失敗重試:? ? ? ? ??
? ??????使用spring-retry 和spring-boot-starter-aop? jar不需要其他配置像樊,默認(rèn)失敗重試6次? ??
? ??????spring.cloud.config.retry.multiplier:初始重試間隔時(shí)間(默認(rèn)1000毫秒)? ?
? ???????spring.cloud.config.retry.initial-interval:下一次間隔乘數(shù)? ? (默認(rèn)1.1 本次1000毫秒? ? 下次間隔1100毫秒)? ? ? ??
? ??????? spring.cloud.config.retry.-attempts:最大重試次數(shù)(默認(rèn)6次)
? ? 動態(tài)刷新配置:? ? 在client端引入actuator? 通過/refresh 端點(diǎn)刷新配置 或者使用git hook