項目地址: https://github.com/taoweidong/Micro-service-learninghtml
Monolithic比較適合小項目java
微服務是指開發一個單個小型的但有業務功能的服務,每一個服務都有本身的處理和輕量通信機制,能夠部署在單個或多個服務器上。微服務也指一種種鬆耦合的、有必定的有界上下文的面向服務架構。也就是說,若是每一個服務都要同時修改,那麼它們就不是微服務,由於它們緊耦合在一塊兒;若是你須要掌握一個服務太多的上下文場景使用條件,那麼它就是一個有上下文邊界的服務,這個定義來自DDD領域驅動設計。git
微服務架構模式(MicroservicesArchitecture Pattern)的目的是將大型的、複雜的、長期運行的應用程序構建爲一組相互配合的服務,每一個服務均可以很容易得局部改良。Micro這個詞意味着每一個服務都應該足夠小,可是,這裏的小不能用代碼量來比較,而應該是從業務邏輯上比較——符合SRP原則的才叫微服務。github
相對於單體架構和SOA,它的主要特色是組件化、鬆耦合、自治、去中心化,體如今如下幾個方面:web
咱們能夠看到整個微服務的思想就如咱們如今面對信息爆炸、知識爆炸是同樣的:經過解耦咱們所作的事情,分而治之以減小沒必要要的損耗,使得整個複雜的系統和組織可以快速的應對變化。算法
Eureka是Spring Cloud Netflix微服務套件中的一部分,能夠與Springboot構建的微服務很容易的整合起來。spring
Eureka包含了服務器端和客戶端組件。數據庫
服務器端,也被稱做是服務註冊中心,用於提供服務的註冊與發現。Eureka支持高可用的配置,當集羣中有分片出現故障時,Eureka就會轉入自動保護模式,它容許分片故障期間繼續提供服務的發現和註冊,當故障分片恢復正常時,集羣中其餘分片會把他們的狀態再次同步回來。後端
客戶端組件包含服務消費者與服務生產者。在應用程序運行時,Eureka客戶端向註冊中心註冊自身提供的服務並週期性的發送心跳來更新它的服務租約。同時也能夠從服務端查詢當前註冊的服務信息並把他們緩存到本地並週期性的刷新服務狀態。api
參考:
https://www.cnblogs.com/demodashi/p/8509931.html
https://www.cnblogs.com/snowjeblog/p/8821325.html
做爲服務註冊中心,Eureka比Zookeeper好在哪裏
著名的CAP理論指出,一個分佈式系統不可能同時知足C(一致性)、A(可用性)和P(分區容錯性)。因爲分區容錯性在是分佈式系統中必需要保證的,所以咱們只能在A和C之間進行權衡。在此Zookeeper保證的是CP, 而Eureka則是AP。
Zookeeper保證CP
當向註冊中心查詢服務列表時,咱們能夠容忍註冊中心返回的是幾分鐘之前的註冊信息,但不能接受服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性。可是zk會出現這樣一種狀況,當master節點由於網絡故障與其餘節點失去聯繫時,剩餘節點會從新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk集羣都是不可用的,這就致使在選舉期間註冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集羣失去master節點是較大機率會發生的事,雖然服務可以最終恢復,可是漫長的選舉時間致使的註冊長期不可用是不能容忍的。
Eureka保證AP
Eureka看明白了這一點,所以在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工做,剩餘的節點依然能夠提供註冊和查詢服務。而Eureka的客戶端在向某個Eureka註冊或時若是發現鏈接失敗,則會自動切換至其它節點,只要有一臺Eureka還在,就能保證註冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此以外,Eureka還有一種自我保護機制,若是在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,此時會出現如下幾種狀況:
- Eureka再也不從註冊列表中移除由於長時間沒收到心跳而應該過時的服務
- Eureka仍然可以接受新服務的註冊和查詢請求,可是不會被同步到其它節點上(即保證當前節點依然可用)
- 當網絡穩定時,當前實例新的註冊信息會被同步到其它節點中
所以, Eureka能夠很好的應對因網絡故障致使部分節點失去聯繫的狀況,而不會像zookeeper那樣使整個註冊服務癱瘓。
Feign是一個聲明式的僞Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只須要建立一個接口並用註解的方式來配置它,便可完成對服務提供方的接口綁定,簡化了在使用Ribbon時自行封裝服務調用客戶端的開發量。
Feign具備可插拔的註解特性,包括Feign 註解和JAX-RS註解,同時也擴展了對SpringMVC的註解支持。Feign支持可插拔的編碼器和解碼器,默認集成了Ribbon,並和Eureka結合,默認實現了負載均衡的效果。
主要功能:簡化服務消費者調用服務提供者接口
參考:https://www.cnblogs.com/senlinyang/p/8595489.html
Ribbon是Netflix發佈的負載均衡器,它有助於控制HTTP和TCP的客戶端的行爲。爲Ribbon配置服務提供者地址後,Ribbon就可基於某種負載均衡算法,自動地幫助服務消費者去請求。Ribbon默認爲咱們提供了不少負載均衡算法,例如輪詢、隨機等。固然,咱們也可爲Ribbon實現自定義的負載均衡算法。
在Spring Cloud中,當Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務提供者地址列表,並基於負載均衡算法,請求其中一個服務提供者實例。展現了Ribbon與Eureka配合使用時的架構。
參考:https://blog.csdn.net/chengqiuming/article/details/80711168
所謂的熔斷機制和平常生活中見到電路保險絲是很是類似的,當出現了問題以後,保險絲會自動燒斷,以保護咱們的電器, 那麼若是換到了程序之中呢?
當如今服務的提供方出現了問題以後整個的程序將出現錯誤的信息顯示,而這個時候若是不想出現這樣的錯誤信息,而但願替換爲一個錯誤時的內容。
一個服務掛了後續的服務跟着不能用了,這就是雪崩效應
對於熔斷技術的實現須要考慮如下幾種狀況:
出現錯誤以後能夠 fallback 錯誤的處理信息;
若是要結合 Feign 一塊兒使用的時候還須要在 Feign(客戶端)進行熔斷的配置。
Hystrix如何解決依賴隔離
Hystrix依賴的隔離架構,以下圖:
參考:https://www.cnblogs.com/leeSmall/p/8847652.html
https://www.cnblogs.com/yepei/p/7169127.html
看單個的Hystrix Dashboard的數據並無什麼多大的價值,要想看這個系統的Hystrix Dashboard數據就須要用到Hystrix Turbine。Hystrix Turbine將每一個服務Hystrix Dashboard數據進行了整合。Hystrix Turbine的使用很是簡單,只須要引入相應的依賴和加上註解和配置就能夠了。
參考:https://www.cnblogs.com/allalongx/p/8383757.html
zuul 是netflix開源的一個API Gateway 服務器, 本質上是一個web servlet應用。
Zuul 在雲平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架。Zuul 至關因而設備和 Netflix 流應用的 Web 網站後端全部請求的前門。
zuul的工做原理
zuul的核心是一系列的filters, 其做用能夠類比Servlet框架的Filter,或者AOP。
zuul把Request route到 用戶處理邏輯 的過程當中,這些filter參與一些過濾處理,好比Authentication,Load Shedding等。
Zuul提供了一個框架,能夠對過濾器進行動態的加載,編譯,運行。
Zuul的過濾器之間沒有直接的相互通訊,他們之間經過一個RequestContext的靜態類來進行數據傳遞的。RequestContext類中有ThreadLocal變量來記錄每一個Request所須要傳遞的數據。
Zuul的過濾器是由Groovy寫成,這些過濾器文件被放在Zuul Server上的特定目錄下面,Zuul會按期輪詢這些目錄,修改過的過濾器會動態的加載到Zuul Server中以便過濾請求使用。
下面有幾種標準的過濾器類型:
Zuul大部分功能都是經過過濾器來實現的。Zuul中定義了四種標準過濾器類型,這些過濾器類型對應於請求的典型生命週期。
(1) PRE:這種過濾器在請求被路由以前調用。咱們可利用這種過濾器實現身份驗證、在集羣中選擇請求的微服務、記錄調試信息等。
(2) ROUTING:這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。
(3) POST:這種過濾器在路由到微服務之後執行。這種過濾器可用來爲響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。
(4) ERROR:在其餘階段發生錯誤時執行該過濾器。
參考:https://www.cnblogs.com/lexiaofei/p/7080257.html
https://www.cnblogs.com/xd03122049/p/6036318.html
Spring Cloud Config爲分佈式系統中的外部配置提供服務器和客戶端支持。使用Config Server,您能夠爲全部環境中的應用程序管理其外部屬性。它很是適合spring應用,也可使用在其餘語言的應用上。隨着應用程序經過從開發到測試和生產的部署流程,您能夠管理這些環境之間的配置,並肯定應用程序具備遷移時須要運行的一切。服務器存儲後端的默認實現使用git,所以它輕鬆支持標籤版本的配置環境,以及能夠訪問用於管理內容的各類工具。
Spring Cloud Config服務端特性
Config客戶端的特性(特指Spring應用)
參考:https://www.cnblogs.com/boboooo/p/8796636.html?utm_source=debugrun&utm_medium=referral
咱們若是要去更新全部微服務的配置,在不重啓的狀況下去更新配置,只能依靠spring cloud config了,可是,是咱們要一個服務一個服務的發送post請求,
咱們能受的了嗎?這比以前的沒配置中心好多了,那麼咱們如何繼續避免挨個挨個的向服務發送Post請求來告知服務,你的配置信息改變了,須要及時修改內存中的配置信息。
這時候咱們就不要忘記消息隊列的發佈訂閱模型。讓全部爲服務來訂閱這個事件,當這個事件發生改變了,就能夠通知全部微服務去更新它們的內存中的配置信息。這時Bus消息總線就能解決,你只須要在springcloud Config Server端發出refresh,就能夠觸發全部微服務更新了。
架構圖:
原理:
參考:https://www.cnblogs.com/huangjuncong/p/9077099.html
https://www.cnblogs.com/songxh-scse/p/7833963.html
Spring Cloud是目前很是流行的微服務化解決方案,它將Spring Boot的便捷開發和Netflix OSS的豐富解決方案結合起來。如咱們所知,Spring Cloud不一樣於Dubbo,使用的是基於HTTP(s)的Rest服務來構建整個服務體系。
那麼有沒有可能使用一些非JVM語言,例如咱們所熟悉的Node.js來開發一些Rest服務呢?固然是能夠的。可是若是隻有Rest服務,還不能接入Spring Cloud系統。咱們還想使用起Spring Cloud提供的Eureka進行服務發現,使用Config Server作配置管理,使用Ribbon作客戶端負載均衡。這個時候Spring sidecar就能夠大顯身手了。
Sidecar起源於Netflix Prana。他提供一個能夠獲取既定服務全部實例的信息(例如host,端口等)的http api。你也能夠經過一個嵌入的Zuul,代理服務到從Eureka獲取的相關路由節點。Spring Cloud Config Server能夠直接經過主機查找或經過代理Zuul進行訪問。
須要注意的是你所開發的Node.js應用,必須去實現一個健康檢查接口,來讓Sidecar能夠把這個服務實例的健康情況報告給Eureka。
理解:簡單來講sidecar就是可讓非java開發的微服務也能夠在SpringCloud組建中使用,利用Eureka,Config等功能。
參考:https://blog.csdn.net/shenzhen_zsw/article/details/81009238
https://www.jianshu.com/p/2788b7220407
Zipkin是一款開源的分佈式實時數據追蹤系統(Distributed Tracking System),基於 Google Dapper的論文設計而來,由 Twitter 公司開發貢獻。其主要功能是彙集來自各個異構系統的實時監控數據。分佈式跟蹤系統還有其餘比較成熟的實現,例如:Naver的Pinpoint、Apache的HTrace、阿里的鷹眼Tracing、京東的Hydra、新浪的Watchman,美團點評的CAT,skywalking等。
如圖,在複雜的調用鏈路中假設存在一條調用鏈路響應緩慢,如何定位其中延遲高的服務呢?
zipkin
的web UI
能夠一眼看出延遲高的服務參考:https://blog.csdn.net/qq924862077/article/details/80285536
啓動微服務註冊中心Eureka:microservice-discovery-eureka 帳戶:admin 密碼:admin123
訪問註冊中心地址:http://127.0.0.1:8761/
啓動服務提供者:microservice-provider-user
啓動服務消費者:microservice-consume-movie
打開註冊中心檢查服務是否註冊
訪問消費者接口1:http://127.0.0.1:9100/say 此時沒有進行服務間的調用,只是單純的訪問服務消費者
訪問消費者接口2:http://127.0.0.1:9100/say2 此時消費者調用提供者,進行服務間的通信,此時服務請求沒有參數而且返回數據爲字符串
訪問消費者接口3:http://127.0.0.1:9100/getUserInfo/1 此時進行服務間通信,而且請求帶有參數返回數據爲對象
對應腳本:microservice-test01.bat
啓動微服務註冊中心Eureka:microservice-discovery-eureka 帳戶:admin 密碼:admin123
訪問註冊中心地址:http://127.0.0.1:8761/
啓動服務提供者:microservice-provider-user1
啓動服務提供者:microservice-provider-user2
啓動服務消費者:microservice-consume-movie-feign
對應腳本:microservice-test02.bat
Zuul路由規則:http://ZUUL_HOST:ZUUL_PORT/微服務在Eureka上的serviceId/會被轉發到serviceId對應的微服務上**
屢次訪問192.168.224.1:8040/microservice-provider-user/hello,會發現兩個服務提供者循環顯示,說明Zuul可使用Ribbon達到負載均衡的效果