❶ 如何快速搭建一個微服務架構
什麼是微服務?
微服務(Microservices Architecture)是一種架構風格,一個大型復雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是松耦合的。每個微服務僅關注於完成一件任務並很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。
微服務的概念源於2014年3月Martin Fowler所寫的文章「Microservices」 martinfowler.com/articles/mi…
單體架構(Monolithic Architecture )
企業級的應用一般都會面臨各種各樣的業務需求,而常見的方式是把大量功能堆積到同一個單體架構中去。比如:常見的ERP、CRM等系統都以單體架構的方式運行,同時由於提供了大量的業務功能,隨著功能的升級,整個研發、發布、定位問題,擴展,升級這樣一個「怪物」系統會變得越來越困難。
這種架構模式就是把應用整體打包部署,具體的樣式依賴本身應用採用的語言,如果採用java語言,自然你會打包成war包,部署在Tomcat或者Jetty這樣的應用伺服器上,如果你使用spring boot還可以打包成jar包部署。其他還有Rails和Node.js應用以目錄層次的形式打包
上圖:單體架構
大部分企業通過SOA來解決上述問題,SOA的思路是把應用中相近的功能聚合到一起,以服務的形式提供出去。因此基於SOA架構的應用可以理解為一批服務的組合。SOA帶來的問題是,引入了大量的服務、消息格式定義和規范。
多數情況下,SOA的服務直接相互獨立,但是部署在同一個運行環境中(類似於一個Tomcat實例下,運行了很多web應用)。和單體架構類似,隨著業務功能的增多SOA的服務會變得越來越復雜,本質上看沒有因為使用SOA而變的更好。圖1,是一個包含多種服務的在線零售網站,所有的服務部署在一個運行環境中,是一個典型的單體架構。
單體架構的應用一般有以下特點:
微服務架構(Microservices Architecture)
微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務運行在自己的進程中,開發和發布都沒有依賴。不同服務通過一些輕量級交互機制來通信,例如 RPC、HTTP 等,服務可獨立擴展伸縮,每個服務定義了明確的邊界,不同的服務甚至可以採用不同的編程語言來實現,由獨立的團隊來維護。簡單的來說,一個系統的不同模塊轉變成不同的服務!而且服務可以使用不同的技術加以實現!
上圖:微服務架構
微服務設計
那我們在微服務中應該怎樣設計呢。以下是微服務的設計指南:
微服務消息
在單體架構中,不同功能之間通信通過方法調用,或者跨語言通信。SOA降低了這種語言直接的耦合度,採用基於SOAP協議的web服務。這種web服務的功能和消息體定義都十分復雜,微服務需要更輕量的機制。
同步消息 REST
同步消息就是客戶端需要保持等待,直到伺服器返回應答。REST是微服務中默認的同步消息方式,它提供了基於HTTP協議和資源API風格的簡單消息格式,多數微服務都採用這種方式(每個功能代表了一個資源和對應的操作)
非同步消息 – AMQP, STOMP, MQTT
非同步消息就是客戶端不需要一直等待服務應答,有應到後會得到通知。某些微服務需要用到非同步消息,一般採用AMQP, STOMP, MQTT 這三種通訊協議
消息格式 – JSON, XML, Thrift, ProtoBuf, Avro
消息格式是微服務中另外一個很重要的因素。SOA的web服務一般採用文本消息,基於復雜的消息格式(SOAP)和消息定義(xsd)。微服務採用簡單的文本協議JSON和XML,基於HTTP的資源API風格。如果需要二進制,通過用到Thrift, ProtoBuf, Avro。
服務約定 – 定義介面 – Swagger, RAML, Thrift IDL
如果把功能實現為服務,並發布,需要定義一套約定。單體架構中,SOA採用WSDL,WSDL過於復雜並且和SOAP緊耦合,不適合微服務。
REST設計的微服務,通常採用Swagger和RAML定義約定。
對於不是基於REST設計的微服務,比如Thrift,通常採用IDL(Interface Definition Languages),比如Thrift IDL。
微服務集成 (服務間通信)
大部分微服務基於RPC、HTTP、JSON這樣的標准協議,集成不同標准和格式變的不再重要。另外一個選擇是採用輕量級的消息匯流排或者網關,有路由功能,沒有復雜的業務邏輯。下面就介紹幾種常見的架構方式。
點對點方式
點對點方式中,服務之間直接用。每個微服務都開放REST API,並且調用其它微服務的介面。
上圖:通過點對點方式通信
很明顯,在比較簡單的微服務應用場景下,這種方式還可行,隨著應用復雜度的提升,會變得越來越不可維護。這點有些類似SOA的ESB,盡量不採用點對點的集成方式。
API-網關方式
API網關方式的核心要點是,所有的客戶端和消費端都通過統一的網關接入微服務,在網關層處理所有的非業務功能個。通常,網關也是提供REST/HTTP的訪問API。服務端通過API-GW注冊和管理服務。
上圖:通過API-網關暴露微服務
所有的業務介面通過API網關暴露,是所有客戶端介面的唯一入口。微服務之間的通信也通過API網關。
採用網關方式有如下優勢:
目前,API網關方式應該是微服務架構中應用最廣泛的設計模式。
消息代理方式
微服務也可以集成在非同步的場景下,通過隊列和訂閱主題,實現消息的發布和訂閱。一個微服務可以是消息的發布者,把消息通過非同步的方式發送到隊列或者訂閱主題下。作為消費者的微服務可以從隊列或者主題共獲取消息。通過消息中間件把服務之間的直接調用解耦。
上圖:非同步通信方式
通常非同步的生產者/消費者模式,通過AMQP, STOMP, MQTT 等非同步消息通訊協議規范。
數據的去中心化
單體架構中,不同功能的服務模塊都把數據存儲在某個中心資料庫中。
每個微服務有自己私有的資料庫,其它微服務不能直接訪問。單體架構,用一個資料庫存儲所有數據
微服務方式,多個服務之間的設計相互獨立,數據也應該相互獨立(比如,某個微服務的資料庫結構定義方式改變,可能會中斷其它服務)。因此,每個微服務都應該有自己的資料庫。
每個微服務有自己私有的資料庫,其它微服務不能直接訪問。每個微服務有自己私有的資料庫,其它微服務不能直接訪問。
數據去中心話的核心要點:
數據的去中心化,進一步降低了微服務之間的耦合度,不同服務可以採用不同的資料庫技術(SQL、NoSQL等)。在復雜的業務場景下,如果包含多個微服務,通常在客戶端或者中間層(網關)處理。
微服務架構的優點:
微服務架構的缺點:
微服務的一些想法在實踐上是好的,但當整體實現時也會呈現出其復雜性。
關於微服務架構的取捨
❷ 為什麼微服務一定要有網關
服務一定要有網關,這個應該是因為這樣的話,才會變得更加的安全一點,所以這個應該是必須要有網關的,才會更好一點的
❸ 微服務架構:基於微服務和Docker容器技術的PaaS雲平台架構設計
基於微服務架構和Docker容器技術的PaaS雲平台建設目標是給我們的開發人員提供一套服務快速開發、部署、運維管理、持續開發持續集成的流程。平台提供基礎設施、中間件、數據服務、雲伺服器等資源,開發人員只需要開發業務代碼並提交到平台代碼庫,做一些必要的配置,系統會自動構建、部署,實現應用的敏捷開發、快速迭代。在系統架構上,PaaS雲平台主要分為微服務架構、Docker容器技術、DveOps三部分,這篇文章重點介紹微服務架構的實施。
如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。
實施微服務需要投入大量的技術力量來開發基礎設施,這對很多公司來說顯然是不現實的,別擔心,業界已經有非常優秀的開源框架供我們參考使用。目前業界比較成熟的微服務框架有Netflix、Spring Cloud和阿里的Dubbo等。Spring Cloud是基於Spring Boot的一整套實現微服務的框架,它提供了開發微服務所需的組件,跟Spring Boot一起使用的話開發微服務架構的雲服務會變的很方便。Spring Cloud包含很多子框架,其中Spring Cloud Netflix是其中的一套框架,在我們的微服務架構設計中,就使用了很多Spring Cloud Netflix框架的組件。Spring Cloud Netflix項目的時間還不長,相關的文檔資料很少,博主當時研究這套框架啃了很多英文文檔,簡直痛苦不堪。對於剛開始接觸這套框架的同學,要搭建一套微服務應用架構,可能會不知道如何下手,接下來介紹我們的微服務架構搭建過程以及 需要那些 框架或組件來支持微服務架構。
為了直接明了的展示微服務架構的組成及原理,畫了一張系統架構圖,如下:
從上圖可以看出,微服務訪問大致路徑為:外部請求 → 負載均衡 → 服務網關(GateWay)→ 微服務 → 數據服務/消息服務。服務網關和微服務都會用到服務注冊和發現來調用依賴的其他服務,各服務集群都能通過配置中心服務來獲得配置信息。
服務網關(GateWay)
網關是外界系統(如:客戶端瀏覽器、移動設備等)和企業內部系統之間的一道門,所有的客戶端請求通過網關訪問後台服務。為了應對高並發訪問,服務網關以集群形式部署,這就意味著需要做負載均衡,我們採用了亞馬遜EC2作為虛擬雲伺服器,採用ELB(Elastic Load Balancing)做負載均衡。EC2具有自動配置容量功能,當用戶流量達到尖峰,EC2可以自動增加更多的容量以維持虛擬主機的性能。ELB彈性負載均衡,在多個實例間自動分配應用的傳入流量。為了保證安全性,客戶端請求需要使用https加密保護,這就需要我們進行SSL卸載,使用Nginx對加密請求進行卸載處理。外部請求經過ELB負載均衡後路由到GateWay集群中的某個GateWay服務,由GateWay服務轉發到微服務。服務網關作為內部系統的邊界,它有以下基本能力:
1、動態路由:動態的將請求路由到所需要的後端服務集群。雖然內部是復雜的分布式微服務網狀結構,但是外部系統從網關看就像是一個整體服務,網關屏蔽了後端服務的復雜性。
2、限流和容錯:為每種類型的請求分配容量,當請求數量超過閥值時拋掉外部請求,限制流量,保護後台服務不被大流量沖垮;黨內部服務出現故障時直接在邊界創建一些響應,集中做容錯處理,而不是將請求轉發到內部集群,保證用戶良好的體驗。
3、身份認證和安全性控制:對每個外部請求進行用戶認證,拒絕沒有通過認證的請求,還能通過訪問模式分析,實現反爬蟲功能。
4、監控:網關可以收集有意義的數據和統計,為後台服務優化提供數據支持。
5、訪問日誌:網關可以收集訪問日誌信息,比如訪問的是哪個服務?處理過程(出現什麼異常)和結果?花費多少時間?通過分析日誌內容,對後台系統做進一步優化。
我們採用Spring Cloud Netflix框架的開源組件Zuul來實現網關服務。Zuul使用一系列不同類型的過濾器(Filter),通過重寫過濾器,使我們能夠靈活的實現網關(GateWay)的各種功能。
如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。
服務注冊與發現
由於微服務架構是由一系列職責單一的細粒度服務構成的網狀結構,服務之間通過輕量機制進行通信,這就引入了服務注冊與發現的問題,服務的提供方要注冊報告服務地址,服務調用放要能發現目標服務。我們的微服務架構中使用了Eureka組件來實現服務的注冊與發現。所有的微服務(通過配置Eureka服務信息)到Eureka伺服器中進行注冊,並定時發送心跳進行 健康 檢查,Eureka默認配置是30秒發送一次心跳,表明服務仍然處於存活狀態,發送心跳的時間間隔可以通過Eureka的配置參數自行配置,Eureka伺服器在接收到服務實例的最後一次心跳後,需要等待90秒(默認配置90秒,可以通過配置參數進行修改)後,才認定服務已經死亡(即連續3次沒有接收到心跳),在Eureka自我保護模式關閉的情況下會清除該服務的注冊信息。所謂的自我保護模式是指,出現網路分區、Eureka在短時間內丟失過多的服務時,會進入自我保護模式,即一個服務長時間沒有發送心跳,Eureka也不會將其刪除。自我保護模式默認為開啟,可以通過配置參數將其設置為關閉狀態。
Eureka服務以集群的方式部署(在博主的另一篇文章中詳細介紹了Eureka集群的部署方式),集群內的所有Eureka節點會定時自動同步微服務的注冊信息,這樣就能保證所有的Eureka服務注冊信息保持一致。那麼在Eureka集群里,Eureka節點是如何發現其他節點的呢?我們通過DNS伺服器來建立所有Eureka節點的關聯,在部署Eureka集群之外還需要搭建DNS伺服器。
當網關服務轉發外部請求或者是後台微服務之間相互調用時,會去Eureka伺服器上查找目標服務的注冊信息,發現目標服務並進行調用,這樣就形成了服務注冊與發現的整個流程。Eureka的配置參數數量很多,多達上百個,博主會在另外的文章里詳細說明。
微服務部署
微服務是一系列職責單一、細粒度的服務,是將我們的業務進行拆分為獨立的服務單元,伸縮性好,耦合度低,不同的微服務可以用不同的語言開發,每一個服務處理的單一的業務。微服務可以劃分為前端服務(也叫邊緣服務)和後端服務(也叫中間服務),前端服務是對後端服務做必要的聚合和剪裁後暴露給外部不同的設備(PC、Phone等),所有的服務啟動時都會到Eureka伺服器進行注冊,服務之間會有錯綜復雜的依賴關系。當網關服務轉發外部請求調用前端服務時,通過查詢服務注冊表就可以發現目標服務進行調用,前端服務調用後端服務時也是同樣的道理,一次請求可能涉及到多個服務之間的相互調用。由於每個微服務都是以集群的形式部署,服務之間相互調用的時候需要做負載均衡,因此每個服務中都有一個LB組件用來實現負載均衡。
微服務以鏡像的形式,運行在Docker容器中。Docker容器技術讓我們的服務部署變得簡單、高效。傳統的部署方式,需要在每台伺服器上安裝運行環境,如果我們的伺服器數量龐大,在每台伺服器上安裝運行環境將是一項無比繁重的工作,一旦運行環境發生改變,就不得不重新安裝,這簡直是災難性的。而使用Docker容器技術,我們只需要將所需的基礎鏡像(jdk等)和微服務生成一個新的鏡像,將這個最終的鏡像部署在Docker容器中運行,這種方式簡單、高效,能夠快速部署服務。每個Docker容器中可以運行多個微服務,Docker容器以集群的方式部署,使用Docker Swarm對這些容器進行管理。我們創建一個鏡像倉庫用來存放所有的基礎鏡像以及生成的最終交付鏡像,在鏡像倉庫中對所有鏡像進行管理。
服務容錯
微服務之間存在錯綜復雜的依賴關系,一次請求可能會依賴多個後端服務,在實際生產中這些服務可能會產生故障或者延遲,在一個高流量的系統中,一旦某個服務產生延遲,可能會在短時間內耗盡系統資源,將整個系統拖垮,因此一個服務如果不能對其故障進行隔離和容錯,這本身就是災難性的。我們的微服務架構中使用了Hystrix組件來進行容錯處理。Hystrix是Netflix的一款開源組件,它通過熔斷模式、隔離模式、回退(fallback)和限流等機制對服務進行彈性容錯保護,保證系統的穩定性。
1、熔斷模式:熔斷模式原理類似於電路熔斷器,當電路發生短路時,熔斷器熔斷,保護電路避免遭受災難性損失。當服務異常或者大量延時,滿足熔斷條件時服務調用方會主動啟動熔斷,執行fallback邏輯直接返回,不會繼續調用服務進一步拖垮系統。熔斷器默認配置服務調用錯誤率閥值為50%,超過閥值將自動啟動熔斷模式。服務隔離一段時間以後,熔斷器會進入半熔斷狀態,即允許少量請求進行嘗試,如果仍然調用失敗,則回到熔斷狀態,如果調用成功,則關閉熔斷模式。
2、隔離模式:Hystrix默認採用線程隔離,不同的服務使用不同的線程池,彼此之間不受影響,當一個服務出現故障耗盡它的線程池資源,其他的服務正常運行不受影響,達到隔離的效果。例如我們通過andThreadPoolKey配置某個服務使用命名為TestThreadPool的線程池,實現與其他命名的線程池隔離。
3、回退(fallback):fallback機制其實是一種服務故障時的容錯方式,原理類似Java中的異常處理。只需要繼承HystixCommand並重寫getFallBack()方法,在此方法中編寫處理邏輯,比如可以直接拋異常(快速失敗),可以返回空值或預設值,也可以返回備份數據等。當服務調用出現異常時,會轉向執行getFallBack()。有以下幾種情況會觸發fallback:
1)程序拋出非HystrixBadRequestExcepption異常,當拋出HystrixBadRequestExcepption異常時,調用程序可以捕獲異常,沒有觸發fallback,當拋出其他異常時,會觸發fallback;
2)程序運行超時;
3)熔斷啟動;
4)線程池已滿。
4、限流: 限流是指對服務的並發訪問量進行限制,設置單位時間內的並發數,超出限制的請求拒絕並fallback,防止後台服務被沖垮。
Hystix使用命令模式HystrixCommand包裝依賴調用邏輯,這樣相關的調用就自動處於Hystrix的彈性容錯保護之下。調用程序需要繼承HystrixCommand並將調用邏輯寫在run()中,使用execute()(同步阻塞)或queue()(非同步非阻塞)來觸發執行run()。
動態配置中心
微服務有很多依賴配置,某些配置參數在服務運行期間可能還要動態修改,比如:根據訪問流量動態調整熔斷閥值。傳統的實現信息配置的方法,比如放在xml、yml等配置文件中,和應用一起打包,每次修改都要重新提交代碼、打包構建、生成新的鏡像、重新啟動服務,效率太低,這樣顯然是不合理的,因此我們需要搭建一個動態配置中心服務支持微服務動態配置。我們使用Spring Cloud的configserver服務幫我們實現動態配置中心的搭建。我們開發的微服務代碼都存放在git伺服器私有倉庫裡面,所有需要動態配置的配置文件存放在git伺服器下的configserver(配置中心,也是一個微服務)服務中,部署到Docker容器中的微服務從git伺服器動態讀取配置文件的信息。當本地git倉庫修改代碼後push到git伺服器倉庫,git服務端hooks(post-receive,在服務端完成代碼更新後會自動調用)自動檢測是否有配置文件更新,如果有,git服務端通過消息隊列給配置中心(configserver,一個部署在容器中的微服務)發消息,通知配置中心刷新對應的配置文件。這樣微服務就能獲取到最新的配置文件信息,實現動態配置。
以上這些框架或組件是支撐實施微服務架構的核心,在實際生產中,我們還會用到很多其他的組件,比如日誌服務組件、消息服務組件等等,根據業務需要自行選擇使用。在我們的微服務架構實施案例中,參考使用了很多Spring Cloud Netflix框架的開源組件,主要包括Zuul(服務網關)、Eureka(服務注冊與發現)、Hystrix(服務容錯)、Ribbon(客戶端負載均衡)等。這些優秀的開源組件,為我們實施微服務架構提供了捷徑。
如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級交流:854630135,群里有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給大家。
❹ 北京北大青鳥:微服務架構中API網關的角色
「當你想到網關的時候,你通常會想到一個集中的層,一個額外的跳在網路上處理附加的功能。
但這並不一定是真的,」Palladino上周在洛杉磯舉行的2017年MesosCon上發表的講話。
網關還可以提供一種有效的方式來處理跨微服務之間的通信。
他說:「你也可以在現有的微服務上運行Kong,擺脫額外的跳躍,減少延遲。
」在過去的10年裡,北京電腦培訓http://www.kmbdqn.cn/認為API一直是一種受歡迎的通信交互方式,Docker使其易於設置微服務架構,其中應用程序和服務是由較小的可交換組件組成。
但這些組件之間需要一種方式進行發現與調用。
這就是API網關的作用。
API網關「可以成為一個抽象層它位於這些微服務中每個請求的訪問路徑上,」Palladino說道。
網關鞏固了通往系統常用功能的所有路徑,比如身份驗證或者服務發現,通過插件都能被網關識別。
「插件是一種有效的中間件功能你能動態應用於所有的微服務上,」他講到。
API網關可以聚合服務請求和這些特性。
客戶端可以做出一個響應,網關可以將其分解為多個請求,節省了客戶端自身調用的帶寬。
網關同樣還可以跟蹤這些請求。
當一個組織開始把一個單體應用拆分為微服務時,網關可以將對客戶端的影響最小化。
「網關就像裝載單體應用前的一個窗簾。
客戶端只會處理網關,而你可以在窗簾後面解耦你的單體應用,不必擔心更新你的客戶端,」他說道。
他說:「當你沒掌控你的客戶端的時候這個特別有用」。
傳統上,API網關在組織網路的邊緣上被使用,處理的流量大部分來自於單體應用和外部客戶端之間的交互。
然而微服務架構將大部分的流量轉移到內部網路,因為不同的微服務之間要進行交互。
「你可以有外部的客戶端使用案例,但這成為了當前消費微服務的眾多客戶端之一。
」
❺ 網關作用 微服務
在網路層以上實現網路互連
網關(Gateway)又稱網間連接器、協議轉換器。網關在網路層以上實現網路互連,是最復雜的網路互連設備,僅用於兩個高層協議不同的網路互連。網關既可以用於廣域網互連,也可以用於區域網互連。 網關是一種充當轉換重任的計算機系統或設備。使用在不同的通信協議、數據格式或語言,甚至體系結構完全不同的兩種系統之間,網關是一個翻譯器。與網橋只是簡單地傳達信息不同,網關對收到的信息要重新打包,以適應目的系統的需求。同層--應用層。
❻ 航天橋北大青鳥分享微服務架構中API網關的角色
「當你想到網關的時候,你通常會想到一個集中的層,一個額外的跳在網路上處理附加的功能。
但這並不一定是真的,」Palladino上周在洛杉磯舉行的2017年MesosCon上發表的講話。
網關還可以提供一種有效的方式來處理跨微服務之間的通信。
他說:「你也可以在現有的微服務上運行Kong,擺脫額外的跳躍,減少延遲。
」在過去的10年裡,航天橋電腦培訓http://www.kmbdqn.cn/認為API一直是一種受歡迎的通信交互方式,Docker使其易於設置微服務架構,其中應用程序和服務是由較小的可交換組件組成。
但這些組件之間需要一種方式進行發現與調用。
這就是API網關的作用。
API網關「可以成為一個抽象層它位於這些微服務中每個請求的訪問路徑上,」Palladino說道。
網關鞏固了通往系統常用功能的所有路徑,比如身份驗證或者服務發現,通過插件都能被網關識別。
「插件是一種有效的中間件功能你能動態應用於所有的微服務上,」他講到。
API網關可以聚合服務請求和這些特性。
客戶端可以做出一個響應,網關可以將其分解為多個請求,節省了客戶端自身調用的帶寬。
網關同樣還可以跟蹤這些請求。
當一個組織開始把一個單體應用拆分為微服務時,網關可以將對客戶端的影響最小化。
「網關就像裝載單體應用前的一個窗簾。
客戶端只會處理網關,而你可以在窗簾後面解耦你的單體應用,不必擔心更新你的客戶端,」他說道。
他說:「當你沒掌控你的客戶端的時候這個特別有用」。
傳統上,API網關在組織網路的邊緣上被使用,處理的流量大部分來自於單體應用和外部客戶端之間的交互。
然而微服務架構將大部分的流量轉移到內部網路,因為不同的微服務之間要進行交互。
「你可以有外部的客戶端使用案例,但這成為了當前消費微服務的眾多客戶端之一。
」