這是一份是我在極客時間學習《微服務架構核心20講》時作的筆記。前端
1.什麼是微服務架構?
2.架構師如何權衡微服務的利弊?
3.康威法則和微服務給架構師怎樣的啓示
4.企業應該在何時開始考慮引入微服務
5.怎麼的組織架構更適合微服務?
6.如何理解阿里巴巴提出的微服務中臺戰略
7.如何給出一個清晰簡潔的服務分層方式?
8.微服務整體技術架構是怎樣設計的
9.微服務最經典的三種服務發現機制
10.微服務 API 服務網關(一)「原理」
11.微服務 API 服務網關(二)「開源網關 Zuul」
12.跟 Netflix 學習微服務路由發現體系
13.集中式配置中心的做用和原理
14.微服務通信方式 RPC vs. REST
15.微服務架構須要考慮哪些治理環節
16.微服務監控系統分層和監控架構
17.微服務的調用鏈監控該如何選擇
18.微服務的容錯限流是如何工做的
19.Docker 容器部署技術 & 持續交付流水線
20.容器集羣調度和基於容器的發佈體系
Netflix - 微服務定義:Loosely coupled (鬆耦合), service oriented architecture (面向服務架構 - SOA) with bounded context(有界上下文或局部狀態)。ios
微服務優點:數據庫
微服務帶來的挑戰:緩存
康威法則:安全
「Organizations which design systems ... are constrained to produce designs which are copies of the communication structures of these organizations.」設計系統的組織,其產生的設計和架構,等價組織的組織架構。服務器
初期團隊規模、業務量不大、系統比較簡單,主要嘗試業務模式能不能起來。隨着業務增加、團隊規模變大(從一個團隊擴大到多個團隊),這時候若是系統架構仍然是單塊應用就會和多團隊產生不匹配的狀況(違反了康威法則,即單塊應用架構沒有反應組織架構
)就會出現矛盾、協調成本變高、交付效率變低。網絡
微服務是一種解決手段,將單塊應用拆分紅若干個微服務(圖:組織內部有 3 個團隊,把單塊架構拆分紅 S一、S二、S3 3 個服務,每一個團隊負責維護本身的服務。符合康威法則)架構
擴展:每一個架構師都應該研究下康威定律負載均衡
初期業務複雜性不高,開發的應用系統主要是驗證商務模式。這個時候建議採用單塊應用。不推薦微服務,由於微服務前期有基礎設施要求,使得生產力變低。框架
隨着應用變得成功、用戶變多、系統複雜性變得愈來愈高,若是仍然使用單塊應用就會違背康威法則,使得生產力會隨着系統複雜性而下降,這時候就要考慮使用微服務。
考慮使用微服務的點(圖中交叉點),我的經驗:團隊接近百人研發時應該考慮採用微服務架構。
如何選擇?
不推薦方案 1:由於一開始的時候對問題領域並非很理解,很難把控怎麼來拆分這個服務、劃分服務邊界。另外有可能花了不少精力開發一套微服務,可是這個應用並不被客戶接受(應用沒有被市場驗證,可能會失敗)
推薦: 單塊優先,隨着業務推動,架構師會對業務領域有愈來愈清晰的瞭解,這個時候若是單塊應用不能知足業務發展需求了,研發效率開始降低(到了交叉點)。須要將某些功能點拆分出來,後續陸陸續續隨着業務團隊變大能夠將其餘功能點陸續拆分出來,最後變成一個微服務架構
。
橫座標: 業務價值流交付過程(研發 -> 上線 -> 運維)
縱座標: 業務能力,不一樣的業務線(業務團隊)
傳統企業: 團隊劃分是嚴格按照職能的(獨立職能部門),當有項目來的時候會從每一個團隊抽調一些人來組成交付團隊,當項目完成後這些人會回到各自的職能團隊。
這個團隊的劣質:
基於微服務跨職能的組織模式:每一個團隊跨職能既有產品專家、用戶體驗專家、研發、測試專家,整個造成一個端到端的閉環。這些人圍繞在微服務周圍進行開發、測試和交付、不會由於項目結束而解散。
DBA、運維也以產品的方式來交付平臺產品(將計算、網絡存儲、持續交付的能力封裝在一個平臺內),對外提供 API 來支持不一樣的業務線快速的交付、迭代。
端到端控制權: 團隊內部人要負責:架構、設計、開發、評審、測試、發佈、運行和支持。
團隊規模:根據亞馬遜的兩個披薩原則 – 12我的左右(2 個披薩能搞定) 誰開發、誰就要去構建、去負責運行
微服務架構本質上是組織架構的重組 – Netflix 前架構師 Andrew
現代技術體系分四層:
阿里巴巴提出大中臺(技術中臺 + 業務中臺),小前臺戰略(前端業務更小、更靈活,能根據市場的變化、業務的需求不斷的演化)從而賦能業務的持續創新,產生各類業務模式、快速響應市場需求。
PaaS 是微服務基礎設施層,核心業務層是公司的核心領域能力把它微服務化、抽象化沉澱下來的核心能力,這層能力依賴下一層的 PaaS 雲平臺、大數據及AI,同時向上支撐不一樣的業務線去交付業務應用。
分紅兩層(不一樣公司有本身的分層,有的3、四層,有的只有一層:統稱服務或微服務)
方式一:服務提供商上線後會向運維申請一個域名,而後運維配置負載均衡器。當用戶訪問域名時會域名解析到負載均衡器,負載均衡器進而指向到後臺服務器(多份)
優勢:廣泛的作法、比較簡單;消費者接入的成本比較低 缺點:服務的配置、域名的配置都須要運維的介入;集中的LB 可能會是一個單點,若是集中式LB 掛掉會影響到整個服務沒法訪問;性能損失,當消費者調用後臺服務時必須穿透LB ,會有性能開銷。
方式二:將LB 功能移動到應用的進程內,服務提供商會自動經過註冊方式註冊到服務註冊表,並按期發送心跳。服務消費經過客戶端(帶有服務發現和負載均衡功能)LB 調用後臺服務,而且LB會按期同步服務註冊表中的服務信息。
優勢: 沒有集中式的LB,性能會好,不存在單點問題
缺點: 在多語言環境中,必須爲每個消費者去開發有這樣一個客戶端,升級成本和多語言支持成本會高些
方式三:在前面兩種方式基礎上作了一個折中,將LB功能以一個獨立進程的方式部署在一臺獨立的主機上(既不是集中式LB,也不是在進程內客戶端的LB),其餘和方式二相似。
公司內部通常會有不少微服務:購物車、庫存、訂單等,這些微服務是每一個團隊各自獨立維護的,但咱們不但願外部用戶訪問的時候知道這些細節。這時候就能夠經過網關來屏蔽這些細節,讓客戶看到的企業內部這些服務的時候像是一個服務。
屏蔽內部細節,暴露統一接口
爲何在接入網關前有一層負載均衡?是想讓網關是無狀態的(無狀態網關好處:能夠部署不少,不會有單點,即便掛了一臺其餘網關還在,這對整個系統的穩定性和可用性很是重要)。
網關基本功能:
對請求的身份驗證、受權、限流熔斷、日誌監控等的處理函數稱爲邊緣函數。
Zuul過濾器:
(過濾器上傳加載機制)
(Request Context 實如今各個階段過濾器中分享相關信息。)
Netflix 兩個核心組件:
內部微服務兩層邏輯劃分:
1.基礎服務 – Netflix稱:中間層服務2.聚合服務 – Netflix 稱:Edge service(邊界服務)
內部服務經過內部服務註冊中心 Eureka 註冊、發現。
服務註冊中心還能夠作服務治理,例如對服務調用的安全管控。
傳統的作法在配置文件中作配置,而且每一個團隊有各自的作法,這種作法的隱患:
哪些須要集中配置:
配置中心能夠簡單的認爲是一個服務器,開發、運營人員能夠經過界面對配置中心進行配置,咱們的服務連到配置中心後能夠實時更新配置服務器中修改的配置。
更新的方式主要有兩種:
攜程開源的配置中心 – Apollo
Apollo 配置中心(左側)是一個服務器,研發或運營人員能夠在服務端進行配置的修改,Apollo配置中心帶有客戶端(支持Java、.Net),客戶端有一個緩存機制 – 配置更新後會拉取到客戶端的內存緩存中,爲了防止內存緩存的丟失客戶端還會按期將內存緩存同步到本地文件緩存中,這樣的設計可使得若是配置中心掛掉或應用程序重啓後還能經過讀取本地文件緩存。
服務的更新結合了配置推送 + 定時拉取,以保證高可用
微服務治理就將這些環節沉澱下來變成框架或平臺的一部分;開發人員專一於業務邏輯的實現,在實現業務邏輯的過程當中不須要考慮這個外圍的治理能力。
這些治理環節沉在框架裏,由框架團隊或平臺團隊來集中管控。
完善的監控體系能實時瞭解微服務的健康狀況對整個系統的可靠性和穩定性是很是重要的。
主要分爲5 個層次發監控:
5 個關鍵監控面:
主流監控架構:
在主機或服務進程內安裝Agent,Agent負責收集機器和應用中的日誌和Metrics發送到咱們的監控系統。
當服務比較大、收集的日誌和Metrics量比較大時會加入隊列(Kafka)。標準的日誌監控棧 – ELK(Elasticsearch、Logstash、Kibana);Metrics會採用時間序列數據庫(InfluxDB、Grafana呈現展現)
經過健康檢查機制來按期對應用的健康進行自動化的檢查,開源的工具備Nagios。
原理: 當請求進入Web容器時會生成一個Span(圖中Root Span),當繼續調用Service 時又會生成一個Span(Child Span),請求進來進入Service會生成一個Span,Service調用DB或其餘Service時會產生Span;Web應用在調用Cache時會產生Span。
Span是調用鏈造成的關鍵,在Span會有一些信息:Trace Id、Span Id等。Root Span比較特殊會生成Span Id和Trace Id,其餘的Span會生成本身的Span Id同時爲了維護調用鏈之間的父子關係Child Span會跟蹤記錄Parent Id。
在跨進程中爲了使調用鏈持續連接,會將Trace Id和Parent Id一塊兒帶過來。
主流開源的調用鏈工具對比:
熔斷: 這一律念來源於電子工程中的斷路器(Circuit Breaker)。在互聯網系統中,當下遊服務因訪問壓力過大而響應變慢或失敗,上游服務爲了保護系統總體的可用性,能夠暫時切斷對下游服務的調用。這種犧牲局部,保全總體的措施就叫作熔斷。
若是不採起熔斷措施,咱們的系統會怎樣呢?例子 當前系統中有A,B,C三個服務,服務A是上游,服務B是中游,服務C是下游。它們的調用鏈以下:
一旦下游服務 C 因某些緣由變得不可用,積壓了大量請求,服務B的請求線程也隨之阻塞。線程資源逐漸耗盡,使得服務B也變得不可用。緊接着,服務 A 也變爲不可用,整個調用鏈路被拖垮。
像這種調用鏈路的連鎖故障,叫作雪崩。
隔離: 是經過資源隔離減小風險的方式,源自貨船爲了進行防止漏水和火災的擴散,會將貨倉分隔爲多個, 以下圖所示。
軟件系統的隔離推薦的方法是進行服務拆分,讓每一個小業務獨立運行,即使是其中一個業務宕掉,其餘服務依然能夠正常運行。
限流: 提早對各個類型的請求設置最高的QPS閾值,若高於設置的閾值則對該請求直接返回,再也不調用後續資源。
降級: 當服務器壓力劇增的狀況下,根據實際業務狀況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務器資源以保證核心交易正常運做或高效運做。
原理: 使用Hystrix 組件後,會將調用封裝在Hystrix Command內,封裝之後它就具備了熔斷、限流、隔離和降級功能。請求方式能夠是同步、異步或反應式的,請求過來後會作電路判斷:若是電路打開即斷路,會走降級流程調用降級函數。
若是電路閉合即沒有熔斷,而後進行線程/隊列資源判斷(若是資源不足,就會進入降級流程),若是前兩關經過就運行調用。在調用時若是運行超時也會走降級流程。執行成功(Success)獲取正確的相應結果返回調用端,失敗走降級流程。
在整個調用過程當中,任何一個環節的相關信息(電路是否打開、線程是否佔用、運行是否超時)都會以Metrics形式反饋給計算電路健康組件(Calculate Circuit Health)進而反饋給電路判斷(指導下一次關閉/打開電路的判斷依據)
容器技術的優勢:
流程: 開發人員提交代碼到Git,經過Jenkins 完成構建、單元測試和打鏡像並上傳到鏡像中心(Docker registry)。發佈到測試環境經QA測試後升級到UAT環境,通過UAT測試後升級到生產環境(生產環境可能會經過灰度發佈、藍綠部署發佈到生產環境)
藍綠部署 + 灰度發佈(經過軟路由切換流量)保證服務的穩定性:
「極客閱讀 」匯聚了國內外最優質的技術博客、產品動態、公衆號文章。開發者能夠在極客閱讀一站式的閱讀到來自互聯網技術大咖的文章。
「極客閱讀 」官網:geeker-read.com