軟件架構是一個包含各類組織的系統組織,這些組件包括 Web服務器, 應用服務器, 數據庫,存儲, 通信層), 它們彼此或和環境存在關係。系統架構的目標是解決利益相關者的關注點。html
Conway’s law: Organizations which design systems[...] are constrained to produce designs which are copies of the communication structures of these organizations.前端
(設計系統的組織,其產生的設計和架構等價於組織間的溝通結構。)數據庫
Monolithic比較適合小項目,優勢是:編程
開發簡單直接,集中式管理, 基本不會重複開發後端
功能都在本地,沒有分佈式的管理開銷和調用開銷。它的缺點也很是明顯,特別對於互聯網公司來講(不一一列舉了):瀏覽器
開發效率低:全部的開發在一個項目改代碼,遞交代碼相互等待,代碼衝突不斷安全
代碼維護難:代碼功能耦合在一塊兒,新人不知道何從下手性能優化
部署不靈活:構建時間長,任何小修改必須從新構建整個項目,這個過程每每很長服務器
穩定性不高:一個微不足道的小問題,能夠致使整個應用掛掉網絡
擴展性不夠:沒法知足高併發狀況下的業務需求
微服務是指開發一個單個小型的但有業務功能的服務,每一個服務都有本身的處理和輕量通信機制,能夠部署在單個或多個服務器上。微服務也指一種種鬆耦合的、有必定的有界上下文的面向服務架構。也就是說,若是每一個服務都要同時修改,那麼它們就不是微服務,由於它們緊耦合在一塊兒;若是你須要掌握一個服務太多的上下文場景使用條件,那麼它就是一個有上下文邊界的服務,這個定義來自DDD領域驅動設計。
相對於單體架構和SOA,它的主要特色是組件化、鬆耦合、自治、去中心化,體如今如下幾個方面:
服務粒度要小,而每一個服務是針對一個單一職責的業務能力的封裝,專一作好一件事情。
每一個服務可以獨立被部署並運行在一個進程內。這種運行和部署方式可以賦予系統靈活的代碼組織方式和發佈節奏,使得快速交付和應對變化成爲可能。
技術選型靈活,不受遺留系統技術約束。合適的業務問題選擇合適的技術能夠獨立演化。服務與服務之間採起與語言無關的API進行集成。相對單體架構,微服務架構是更面向業務創新的一種架構模式。
團隊對服務的整個生命週期負責,工做在獨立的上下文中,本身決策本身治理,而不須要統一的指揮中心。團隊和團隊之間經過鬆散的社區部落進行銜接。
咱們能夠看到整個微服務的思想就如咱們如今面對信息爆炸、知識爆炸是同樣的:經過解耦咱們所作的事情,分而治之以減小沒必要要的損耗,使得整個複雜的系統和組織可以快速的應對變化。
咱們爲何採用微服務呢?
"讓咱們的系統儘量快地響應變化" - Rebecca Parson
讓咱們的系統儘量快地去響應變化。其實幾十年來咱們一直在嘗試解決這個問題。若是必定要在前面加個限制的話,那就是低成本的快速響應變化。上世紀90年代Kent Beck提出要擁抱變化,在同期出現了諸多輕量級開發方法(諸如 XP、Scrum);2001年敏捷宣言誕生,以後又出現了精益、看板等新的管理方式。若是說,這些是爲了儘快的響應變化,在軟件開發流程和實踐方面提出的解決方案,那麼微服務架構就是在軟件技術和架構層面提出的應對之道。
Autonomous
A Microservice is a unit of functionality; it provides an API for a set of capabilities oriented around a business domain or common utility
Isolated
A Microservice is a unit of deployment; it can be modified, tested and deployed as a unit without impacting other areas of a solution
Elastic
A Microservice is stateless; it can be horizontally scaled up and down as needed
Resilient
A Microservice is designed for failure; it is fault tolerant and highly available
Responsive
A Microservice responds to requests in a reasonable amount of time
Intelligent
The intelligence in a system is found in the Microservice endpoints not ‘on the wire’
Message Oriented
Microservices rely on HTTP or a lightweight message bus to establish a boundary between components; this ensures loose coupling, isolation, location transparency, and provides the means to delegate errors as messages
Programmable
Microservices provide API’s for access by developers and administrators
Composable
Applications are composed from multiple Microservices
Automated
The lifecycle of a Microservice is managed through automation that includes development, build, test, staging, production and distribution
通常同步調用比較簡單,一致性強,可是容易出調用問題,性能體驗上也會差些,特別是調用層次多的時候。RESTful和RPC的比較也是一個頗有意 思的話題。通常REST基於HTTP,更容易實現,更容易被接受,服務端實現技術也更靈活些,各個語言都能支持,同時能跨客戶端,對客戶端沒有特殊的要 求,只要封裝了HTTP的SDK就能調用,因此相對使用的廣一些。RPC也有本身的優勢,傳輸協議更高效,安全更可控,特別在一個公司內部,若是有統一個 的開發規範和統一的服務框架時,他的開發效率優點更明顯些。就看各自的技術積累實際條件,本身的選擇了。而異步消息的方式在分佈式系統中有特別普遍的應用,他既能減低調用服務之間的耦合,又能成爲調用之間的緩衝,確保消息積壓不會沖垮被調用方,同時能 保證調用方的服務體驗,繼續幹本身該乾的活,不至於被後臺性能拖慢。不過須要付出的代價是一致性的減弱,須要接受數據最終一致性;還有就是後臺服務通常要 實現冪等性,由於消息發送出於性能的考慮通常會有重複(保證消息的被收到且僅收到一次對性能是很大的考驗);最後就是必須引入一個獨立的broker,如 果公司內部沒有技術積累,對broker分佈式管理也是一個很大的挑戰。
實現一個API網關做爲全部客戶端的惟一入口。API網關有兩種方式來處理請求。有些請求被簡單地代理/路由到合適的服務上,其餘的請求被轉給到一組服務。
相比於提供普適的API,API網關根據不一樣的客戶端開放不一樣的API。好比,Netflix API網關運行着客戶端特定的適配器代碼,會向客戶端提供最適合其需求的API。
API網關也能夠實現安全性,好比驗證客戶端是否被受權進行某請求。
–部署與監控運維成本
–機器數量與部署成本
–服務依賴、治理,版本管理、事務處理
–環境部署成本、約定成本
–監控、限流、SLA、LB、日誌分析
–快速、複製、擴容
–單機開發
–安全、容錯、服務降級、調用延時
當企業微服務化之後,服務之間會有錯綜複雜的依賴關係,例如,一個前端請求通常會依賴於多個後端服務,技術上稱爲1 -> N扇出. 在實際生產環境中,服務每每不是百分百可靠,服務可能會出錯或者產生延遲,若是一個應用不能對其依賴的故障進行容錯和隔離,那麼該應用自己就處在被拖垮的風險中。在一個高流量的網站中,某個單一後端一旦發生延遲,可能在數秒內致使全部應用資源(線程,隊列等)被耗盡,形成所謂的雪崩效應(Cascading Failure),嚴重時可致整個網站癱瘓。
服務依賴
一個完整的微服務系統,它的底座最少要包含如下功能:
如下功能不是最小集的一部分,但也屬於底座功能:
–解決微服務對機器數量的訴求
–解決多語言問題
–單機開發、提高效率
–省錢
–可複用管理系統
–可複製
–可動態調節CPU與內存
隨着持續交付概念推廣以及Docker容器普及,微服務將這兩種理念和技術結合起來,造成新的微服務+API + 平臺的開發模式,提出了容器化微服務的持續交付概念。
下圖傳統Monolithic的DevOps開發隊伍方式:
這種總體型架構要求產品隊伍橫跨產品管理 Dev開發 QA DBA 以及系統運營管理,而微服務架構引入之後,以下圖:
微服務促進了DevOps方式的重組,將一個大臃腫的總體產品開發隊伍切分爲根據不一樣微服務的劃分的產品隊伍,以及一個大的總體的平臺隊伍負責運營管理,二者之間經過API交互,作到了鬆耦合隔絕。
微服務的實施是有必定的先決條件:基礎的運維能力(如監控、快速配置、快速部署)需提早構建,不然就會陷入如咱們般被動的局面。推薦採用基礎設施及代碼的實踐,經過代碼來描述計算和網絡基礎設施的方法,使得圖案度i能夠快速安全的搭建和處理由新的配置代替的服務器,服務器之間能夠擁有更高的一致性,下降了在「個人環境工做,而你的環境不工做」的可能,也是爲後續的發佈策略和運維提供更好的支撐。
因爲Docker引入,不一樣的微服務可使用不一樣的技術架構,好比Node.js Java Ruby Python等等,這些單個的服務均可以獨立完成交付生命週期,以下:
Netflix的微服務架構以下,着重全球分發 高可擴展性和可用性:
Twitter的微服務架構,注重高效的可擴展的數據中心:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
但願對您系統架構,軟件項目開發,運維管理,系統架構與研發管理體系, 信息安全, 企業信息化等有幫助。
文章轉載自博客園:PetterLiu