一、微服務概述
1、微服務是什麼
微服務架構的核心就是服務的拆分,把傳統的單體式應用,根據一定的維度(比如業務)拆分為一個一個的服務,每一個服務都有自身特定的功能,又都能夠獨立的部署,甚至可以擁有自己的儲存技術。這樣的一個一個的小型服務就是微服務。
2、微服務架構是什麼
微服務架構是一種架構風格,是一種將一個單一應用程式開發為一組小型服務的方法,每個服務執行在自己的程式中,服務間通訊採用輕量級通訊機制(HTTP REST API)。這些服務圍繞業務能力構建並且可獨立部署。這些服務可用不同的語言開發,使用不同的資料儲存技術。
3、微服務和微服務架構區別
微服務強調的是服務的大小,一般根據業務維度,職責單一原則,而微服務架構是指把一個一個的微服務管理起來,對外提供一套完整的服務體系。
4、微服務的優缺點
優點:
① 相對複雜的單體應用,拆分為多個微服務解決了業務複雜性問題;
② 開發相對比較簡單,只需要瞭解自己服務的一個業務即可;
③ 每個服務都可以有專門開發團隊來開發;
④ 服務的耦合度降低,職責比較單一;
⑤ 每個微服務可以獨立的部署,並且可更加服務自身的一個需求進行動態的擴充套件;
⑥ 每個微服務可以擁有自己特點的技術架構,資料儲存技術等;
缺點:
① 增加了運維成本,之前一個war或者一個jar,現在需要維護管理大量的服務;
② 增加了服務間的呼叫成本;
③ 微服務應用是分散式系統,由此會帶來固有的複雜性,比如分散式事務,分散式鎖等;
④ 由於服務呼叫比較複雜,需要引入呼叫鏈追蹤,系統監控等一些監控工具;
5、單體和微服務
二、微服務架構核心元件
1、註冊中心
2、服務呼叫
3、服務熔斷
4、服務閘道器
5、配置中心
三、常見的微服務架構
1、Dubbo
① 服務容器Container負責啟動,載入,執行服務提供者。
② 服務提供者Provider在啟動時,向註冊中心註冊自己提供的服務。
③ 服務消費者Consumer在啟動時,向註冊中心訂閱自己所需的服務。
④ 註冊中心Registry返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
⑤ 服務消費者Consumer,從提供者地址列表中,基於負載均衡演算法,選其中一個提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
⑥ 服務消費者Consumer和提供者Provider,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心Monitor。
2、Spring Cloud
① 服務註冊(Register):Eureka Client會通過傳送REST請求向Eureka Server註冊自己的服務,提供自身IP、埠、微服務名稱等資訊。Eureka Server接收到註冊請求後,就會把這些資訊儲存在一個雙層的Map中。
② 服務續約(Renew):在服務註冊後,Eureka Client會維護一個心跳來持續通知Eureka Server,說明服務一直處於可用狀態,防止被剔除。Eureka Client在預設的情況下會每隔30秒(eureka.instance.leaseRenewallIntervalInSeconds)傳送一次心跳來進行服務續約。
③ 服務同步(Replicate):Eureka Server叢集中多個Eureka Server之間會互相進行註冊,不同Eureka Server之間會進行服務同步,用來保證Eureka Server叢集內的所有例項中的資料一致性(從這個架構來看,Eureka Server所有例項所處的角色都是對等的,沒有類似Zookeeper、選舉過程,也不存在主從,所有的節點都是主節點。Eureka官方將Eureka Server叢集中的所有例項稱為"對等體(peer)")。
④ 獲取服務(Get Registry):服務消費者(Eureka Client)在啟動的時候,會傳送一個REST請求給Eureka Server,獲取上面註冊的服務清單,並且快取在Eureka Client本地,預設快取30秒(eureka.client.registryFetchIntervalSeconds)。同時,為了效能考慮,Eureka Server也會維護一份只讀的服務清單快取,該快取每隔30秒更新一次。
⑤ 服務呼叫(Make Remote Call):服務消費者在獲取到服務清單後,就可以根據清單中的服務列表資訊,查詢到其他服務的地址,從而進行遠端呼叫。
⑥ 服務下線(Cancel):當Eureka Client需要關閉或重啟時,就不希望在這個時間段內再有請求進來,所以,就需要提前先傳送REST請求給Eureka Server,告訴Eureka Server自己要下線了,Eureka Server在收到請求後,就會把該服務狀態置為下線(DOWN),並把該下線事件傳播出去。
⑦ 服務剔除(Evict):服務例項可能會因為網路故障等原因導致不能提供服務,而此時該例項也沒有傳送請求給Eureka Server來進行服務下線,所以,還需要有服務剔除的機制。Eureka Server在啟動的時候會建立一個定時任務,每隔一段時間(預設60秒),從當前服務清單中把超時沒有續約(預設90秒,eureka.instance.leaseExpirationDurationInSeconds )的服務剔除。
⑧ 自我保護:既然Eureka Server會定時剔除超時沒有續約的服務,那就有可能出現一種場景,網路一段時間內發生了異常,所有的服務都沒能夠進行續約,Eureka Server就把所有的服務都剔除了,這樣顯然不太合理。所以,就有了自我保護機制,當短時間內,統計續約失敗的比例,如果達到一定閾值,則會觸發自我保護的機制,在該機制下,Eureka Server不會剔除任何的微服務,等到正常後,再退出自我保護機制。自我保護開關(eureka.server.enableself-preservation: false)