什麼是微服務?java
微服務沒有一個標準統一的概念,我的理解爲:微服務是一種可讓軟件職責單1、鬆耦合、自包含、能夠獨立運行和部署的架構思想。spring
關鍵思想就是:拆分、單1、獨立、組件化。把本來一個龐大、複雜的項目按業務邊界拆分一個一個獨立運行的小項目,經過接口的方式組裝成一個大的項目。架構
微服務解決了什麼問題?負載均衡
微服務的出現及流行,必定有它的過人之處,既解決了非微服務項目的部分問題或缺點。分佈式
相對於微服務,普通的項目都會包含不少功能的,是一個大而全的「超級」工程。好比:以普通架構方式實現的電商平臺會是一個包含:登陸、權限、會員、商品庫存、訂單、收藏、關注、購物車等功能的單一項目。隨着項目業務愈來愈複雜、開發人員愈來愈多相應開發、編譯、部署、技術擴展、水平擴展都會受到限制。模塊化
開發微服務
太多功能在一個項目中,可能會讓代碼複雜、結構混亂、業務關聯混亂、技術單一。過多的功能,讓整個項目結構複雜,業務相互交織,可能致使開發人員對業務的理解和代碼實現相互交織,最後沒人能徹底理解整個項目。並且也很難控制每一個開發人員能「合法合規」的編碼,可能會把兩個原本鬆耦合、互不影響的功能由於實現「簡單」就偷懶強關聯在一塊兒。工具
技術單一組件化
單一的項目爲了技術的統一和管理的簡單方便,通常都會採用統一的技術實現。可是超大型業務如電商平臺,不可能只採用一種技術(如:java),可能會結合業務及不一樣技術優缺點和技術團隊優執採用不一樣的技術。若是把項目拆分紅不一樣的小項目,每一個小項目能夠根據本身的特色採用不一樣技術,只須要提供統一的接口實現對接便可,最大化技術的優點。單元測試
編譯
過於龐大的代碼也會致使整個項目編譯時間過長,一次簡單的修改或一個簡單的單元測試須要漫長的編譯和啓動。
版本控制
過多的開發人員在同一個項目中共同開發不一樣業務模塊,也會大大增長版本衝突。
部署
一個簡單的修改須要部署整個項目。當多個功能同時上線,但僅僅由於一個小功能失敗,就會致使其它全部功能一塊兒回滾。
擴展
互聯網的飛速發展,用戶和請求量急劇增長,傳統的項目很難擴展(水平、垂直),即集羣和分佈式擴展的問題。
微服務如何解決上面問題?
以上就是單個(單體)大項目的問題,微服務就是要解決上面的問題。
核心思路很簡單,就是拆分,即然是單體項目的問題,那麼直接把項目拆分紅一個個小項目是否是就能夠完美解決。
微服務有哪些缺點?
然而,這並非銀彈,也不是最完美的解決方案。微服務有本身的優勢,也帶來了相應的劣勢。具體以下:
如何拆分:微服務的核心就是拆分項目,把整個項目模塊化、組件化;職責更單一,精中力量作好一件事。可是如何拆分纔是合理的?一般的做法是,按業務拆分,功能從業務上分類,很是耦合的分在同一個微服務中;反之,耦合性很是低的則放到不一樣的微服務。
事務:本來在同一個項目中的兩個操做,若是拆分到不一樣的項目中,那麼就可能會遇到分佈式事務的問題。這是一個棘手但沒有完美解決方案的問題。基本原則是,須要在同一事務中實現的兩個操做屬於強耦合業務,最好拆分到同一個微服務。若是確實是兩個微服務(如:減庫存、扣款)則經過其它方式(如:消息隊列、分佈式事務鎖、重試機制、對帳)來解決
spring cloud
微服務是一個架構思想,並非一種實現,它指明瞭解決單體應該缺點的方向,但並無給定相應的實現和解決方案以及細節。
spring cloud是spring提供的,基於spring boot以及結合Netflix 相關思想和代碼對微服務理念的java實現。spring cloud本質上是分佈式解決方案,但微服務最終也落實到分佈式,所以也是對微服務的實現方案。
Spring Cloud 爲開發人員提供了一些能夠用於快速構建分佈式系統通用模式的工具(例如:配置管理、服務註冊與發現、斷路器、智能路由、微代理、控制總線)。分佈式系統的協調趨於一些模版模式, 而且,使用Spring Cloud使開發人員能夠快速建立實現了這些模式的服務和應用。 他們能夠在任何的分佈式環境中良好運行,這些環境包括開發人員本身的筆記本、裸機上的數據中心、像Cloud Foundry這樣的託管平臺(雲平臺)。
spring cloud主要提供了分佈系統中如下幾個開箱即用的功能:
分佈式/版本化/集中化配置 - spring cloud config 服務註冊發現 - Netflix Eureka 路由 - Netflix Zuul 服務之間的點對點調用(Service-to-service calls)負載均衡-Netflix Ribbon 斷路器 - Netflix Hystrix 分佈式消息
五大核心組件:
服務註冊發現 - Netflix Eureka
配置中心 - spring cloud config
負載均衡-Netflix Ribbon
斷路器 - Netflix Hystrix
路由(網關) - Netflix Zuul