一、前言 為了實(shí)現(xiàn)基于微服務(wù)開發(fā)的產(chǎn)品,或者說為了將單體應(yīng)用重構(gòu)為微服務(wù)架構(gòu)時(shí),將面臨著眾多技術(shù)框架的選擇。大公司往往會有專門的部門或團(tuán)隊(duì)來負(fù)責(zé)自主研發(fā)自己的框架,以滿足產(chǎn)品的需要,但是對于一般的中小型企業(yè),選擇合適的開源框架就顯得更接地氣了。本章將簡單介紹微服務(wù)中,在技術(shù)選型時(shí)需要注意哪些原則,一些常用的開源技術(shù)框架,希望能夠?yàn)榇蠹以谶M(jìn)行技術(shù)選型、調(diào)研時(shí)提供一些思路方向。 筆者面試過很多程序員,一提及微服務(wù),就會具體說道Spring Boot、Spring Cloud,然后就是“背誦”各種具體的用法和配置文件。并不是說這樣不對,但我們更希望知道的是這些技術(shù)框架的原理,為什么選擇它,它與其他類似框架又有何不同呢。 至于一個技術(shù)框架該怎么用,它適用于什么場景,筆者建議可以直接閱讀官方或?qū)?yīng)的github上的文檔,有需要時(shí)還可以閱讀下關(guān)注點(diǎn)的源碼,這樣對正確的理解它,是很有必要的,畢竟官方發(fā)布的東西是相對權(quán)威的,其他地方的資料或許存在片面性,對大家的使用、理解存在一定的誤導(dǎo)。(這只是筆者對大家在技術(shù)選型時(shí),查閱資料的一些建議) 二、選型原則在軟件開發(fā)領(lǐng)域,幾乎每天都有新的技術(shù)框架誕生、更新,一些新的概念更是層出不窮,技術(shù)選型時(shí),難免讓人無從抉擇。 對于技術(shù)選型,我個人有以下幾點(diǎn)建議: 1.有需求,再引入在微服務(wù)架構(gòu)中,各類組件/技術(shù)很多很多,但并不意味著所有的都應(yīng)該引入你的項(xiàng)目,倘若單純?yōu)榱烁采w全技術(shù)?;蚪M件而全部引入,這將是一種很不明智的選擇。后續(xù)將會成為你項(xiàng)目的累贅,讓你苦不堪言。 只要你記住這六個字:“有需求,再引入”,就OK了。伴隨著項(xiàng)目體系架構(gòu)的完善、功能的健全,當(dāng)有某方面的需求時(shí),在逐步考慮是否引入某些技術(shù)組件。 2.選擇最熟悉、使用最多的技術(shù)“一個新項(xiàng)目里最好不要使用超過30%的新技術(shù)”,我覺得這句話是有一定道理的。對于你完全不知道、不了解的技術(shù),你是無法預(yù)估、掌控在使用過程中會出現(xiàn)的任何風(fēng)險(xiǎn),一旦出現(xiàn)問題,短時(shí)間內(nèi)解決不了,你將會變得很難堪。 在這里不是說拒絕使用、接觸新技術(shù),新技術(shù)是值得大家去追捧、了解、學(xué)習(xí),一些新技術(shù)在很大程度上能給我們帶來前所未有的利處,解決其他技術(shù)框架解決不了的問題。這里所說的“新技術(shù)”,是指沒有經(jīng)過充分的考察、技術(shù)驗(yàn)證、存在種種疑惑的技術(shù),而是一味的拿來主義,這樣的風(fēng)險(xiǎn)可想而知。 確保選擇的技術(shù),是業(yè)界使用最多的、被大家認(rèn)可的技術(shù),即使出現(xiàn)了問題,也能應(yīng)對自如。至少在團(tuán)隊(duì)內(nèi)部小范圍是非常認(rèn)可的。 3.強(qiáng)大社區(qū)支撐的技術(shù)GitHub上star的數(shù)量是一個重要指標(biāo),同時(shí)參考近年來代碼、文檔、issues等更新頻率,各大技術(shù)博客是否有相關(guān)技術(shù)分享記載,這些都是能夠說明該技術(shù)是否活躍、受歡迎程度、使用人群多少等。
擁有強(qiáng)大社區(qū)支持的技術(shù),在選型后,倘若使用出現(xiàn)疑問、問題、bug等,能夠有地方可提、可修復(fù)、可深究探討,畢竟現(xiàn)在的技術(shù)社區(qū)都是足夠開放的。 慎選個人開源的技術(shù)框架、組件等,里面到底有多少坑,沒幾個人能說清楚的,況且說不定哪天就不復(fù)存在了呢。 4.從業(yè)務(wù)、項(xiàng)目規(guī)模出發(fā)任何技術(shù)的出發(fā)點(diǎn)都是為最終業(yè)務(wù)而服務(wù)的,不同業(yè)務(wù)、不同項(xiàng)目規(guī)模,對技術(shù)的要求指標(biāo)都是不同的。處于初創(chuàng)期的業(yè)務(wù),選型的基準(zhǔn)是相對靈活,畢竟業(yè)務(wù)相對簡單,支撐業(yè)務(wù)不是很大,只要夠用、開發(fā)效率足夠高就好。處于復(fù)雜業(yè)務(wù)而重構(gòu)的項(xiàng)目,選型就需謹(jǐn)慎,往往伴隨著一些復(fù)雜需求誕生、規(guī)模大小的不確定性,不得不考慮選型技術(shù)可能伴隨著一些小修小補(bǔ)或者螺旋式上升的重構(gòu),則需選型便于適配、切換、替換,耦合度低的技術(shù)。 正因?yàn)榧夹g(shù)選型和業(yè)務(wù)相關(guān),我們能夠觀察到一些很明顯的現(xiàn)象:新技術(shù)往往被早期創(chuàng)業(yè)團(tuán)隊(duì)或大公司的新興業(yè)務(wù)使用;中大型公司的核心業(yè)務(wù)則更傾向于用一些穩(wěn)定了幾年的技術(shù);一個公司如果長期使用一種技術(shù),就會傾向于一直使用下去,甚至連版本都不更新的使用下去。 學(xué)會從業(yè)務(wù)端思考。首先我們需要充分地理解業(yè)務(wù),理解用戶需求,理解當(dāng)下需要解決的首要問題,以及可能的風(fēng)險(xiǎn)有哪些,再將目標(biāo)進(jìn)行分解,進(jìn)行具體的技術(shù)選型、模型設(shè)計(jì)、架構(gòu)設(shè)計(jì)。 5.先驗(yàn)證后使用對于未經(jīng)驗(yàn)證的新技術(shù)、新理念的引入一定要慎重,一定要在全方位的驗(yàn)證過后,再大規(guī)模的使用,最終確定選型。新技術(shù)、新理念的出現(xiàn),自然有它的誘惑,慎重并不代表保守,技術(shù)總是在不斷前進(jìn),擁抱變化本身沒有問題,但是引入不成熟的技術(shù)看似能帶來短期的收益,但是它的風(fēng)險(xiǎn)或者是后期的成本可能遠(yuǎn)遠(yuǎn)大于收益。 驗(yàn)證后,才有說服力,用著更放心。 三、技術(shù)選型每種技術(shù)架構(gòu)都有其優(yōu)缺點(diǎn),存在即合理,不同的業(yè)務(wù)場景使用不同的應(yīng)用架構(gòu),技術(shù)框架,不一定說最新的架構(gòu)、技術(shù)就是最適合你的。 微服務(wù)架構(gòu)中常提及到的主要技術(shù)框架選型如下表所示,本文后面將基于此展開說明對比。
四、服務(wù)治理1.DubboDubbo是一款高性能、輕量級的開源JAVA RPC框架,以及SOA服務(wù)治理方案。簡單的說,Dubbo就是個服務(wù)框架,說白了就是個遠(yuǎn)程服務(wù)調(diào)用的分布式框架。它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用、智能容錯和負(fù)載均衡、以及服務(wù)自動注冊和發(fā)現(xiàn),很容易和Spring框架無縫集成。 Dubbo邏輯架構(gòu)如下圖所示:
Dubbo特點(diǎn):
在現(xiàn)有的微服務(wù)架構(gòu)下,Dubbo只能說是一個服務(wù)治理框架,或者說是一個RPC框架,是以接口為粒度,一個接口類就就是一個服務(wù)。如果直接用Dubbo來實(shí)現(xiàn)微服務(wù)架構(gòu),還缺少以下幾個功能:
2.Spring CloudSpring Cloud是目前最主流的微服務(wù)架構(gòu)落地首選方案之一,是基于Spring Boot實(shí)現(xiàn)的開源框架,是一個全家桶,是微服務(wù)的整體技術(shù)棧。
它為服務(wù)注冊發(fā)現(xiàn)、動態(tài)路由、負(fù)載均衡、配置管理、消息總線、熔斷器、分布式鏈路追蹤、大數(shù)據(jù)操作等提供了簡單的實(shí)現(xiàn),讓我們可以更簡潔的使用它。 正如我們前面說過的,微服務(wù)是可以獨(dú)立部署、水平擴(kuò)展、獨(dú)立訪問的服務(wù)單元,而Spring Cloud就是這些微服務(wù)的“大管家”,采用了微服務(wù)這種架構(gòu)之后,項(xiàng)目的數(shù)量會非常多,調(diào)用鏈路復(fù)雜,從而管理成了很大的問題,而Spring Cloud框架恰恰提供了各種組件用于管理和治理微服務(wù)。理所應(yīng)當(dāng)?shù)?,就成了大家首選框架了。 Spring Cloud的整體架構(gòu)如下圖所示,提供一站式的微服務(wù)架構(gòu)解決方案。 使用Spring Cloud來構(gòu)建微服務(wù)架構(gòu)可以省去你整合各家技術(shù)的成本,Spring Cloud為我們構(gòu)建微服務(wù)架構(gòu)提供了一站式的解決方案,就好比當(dāng)初Spring誕生是為解決EJB企業(yè)應(yīng)用開發(fā)的眾多問題而提供的一站式輕量級企業(yè)應(yīng)用開發(fā)解決方案一樣,隨著使用Spring Cloud的產(chǎn)品數(shù)量增加,Spring Cloud在微服務(wù)架構(gòu)中已一統(tǒng)江湖。 下面是Spring Cloud的完整技術(shù)棧,看完你就知道它為啥會在微服務(wù)架構(gòu)中一統(tǒng)江湖了。 3.對比、總結(jié)
通過上表對比,很容易發(fā)現(xiàn)Spring Cloud擁有很多的項(xiàng)目模塊,包含了微服務(wù)系統(tǒng)的方方面面。Dubbo是一個非常優(yōu)秀的服務(wù)治理和服務(wù)調(diào)用框架,但缺少很多功能模塊,例如網(wǎng)關(guān)、鏈路追蹤等。在項(xiàng)目模塊上,Spring Cloud占據(jù)著更大的優(yōu)勢。對比并不是否定誰,推崇誰,只是說明在不同場景下,有利優(yōu)劣,需客觀來看。 如果僅關(guān)注于服務(wù)治理的這個層面,Dubbo其實(shí)還優(yōu)于Spring Cloud很多:
如果對效率有極高的要求建議使用Dubbo,相對比RPC的效率會比Restful高很多,如果選擇微服務(wù)架構(gòu)去重構(gòu)整個技術(shù)體系,那么 Spring Cloud是當(dāng)仁不讓之選,它可以說是目前最好的微服務(wù)框架沒有之一,并且可以斷言,將來Dubbo可以很好的整合到Spring Cloud中。 五、API網(wǎng)關(guān)API網(wǎng)關(guān)作為微服務(wù)中所有服務(wù)的唯一入口,免得業(yè)界各類成熟的技術(shù)框架組件,在進(jìn)行技術(shù)選型時(shí),需要特別考慮是否擁有以下特性:
1.ZuulZuul作為Spring Cloud中的核心組件之一,充當(dāng)API網(wǎng)關(guān)的重要角色,所有請求都可以通過Zuul達(dá)到后端的應(yīng)用程序、服務(wù)。Zuul提供了動態(tài)路由、監(jiān)控、彈性負(fù)載和安全等特性,其核心是一系列的Filter,其作用類似于Servlet框架中的Filter,或者AOP。 Zuul底層利用各種Filter實(shí)現(xiàn)了如下功能:
基于上述這些功能特性,使得Zuul作為API網(wǎng)關(guān)的不二之選。 Zuul的邏輯架構(gòu)如下圖所示: Zuul的過濾器是由Groovy來實(shí)現(xiàn)的,這些過濾器文件被存放在Zuul Server的特定目錄下,Zuul會定期輪詢這些目錄,修改過的過濾器會動態(tài)加載到Zuul Server中,以便過濾請求使用。 Zuul的大部分功能都是通過過濾器來實(shí)現(xiàn)的,其中定義了4種標(biāo)準(zhǔn)的過濾器類型(pre、route、post、error),以滿足應(yīng)用于請求的不同階段。 2.traefik在了解traefik之前,不妨先看看它的整體架構(gòu)圖,如下所示: 從上圖不難看出,traefik充當(dāng)了HTTP反向代理的角色,使得發(fā)布的服務(wù)變得輕松有趣。在微服務(wù)中,實(shí)質(zhì)上是一個為了讓部署微服務(wù)變得更加便捷而誕生的HTTP反向代理、負(fù)載均衡工具。,它支持多種后臺 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 來自動化、動態(tài)的應(yīng)用它的配置文件設(shè)置。 除了眾多功能之外,traefik的與眾不同之處還在于它會自動發(fā)現(xiàn)適合您服務(wù)的配置。無需維護(hù)和同步單獨(dú)的配置文件,一切都會自動,實(shí)時(shí)地進(jìn)行(無需重新啟動,不會中斷連接)。使用traefik后,你可以將更多的精力、時(shí)間花費(fèi)在開發(fā)和部署上面,而不是在配置和維護(hù)其工作狀態(tài)上。 特性:
3.OpenRestyOpenResty是一個基于Nginx與Lua的高性能Web平臺,其內(nèi)部集成了大量精良的Lua庫、第三方模塊以及大多數(shù)的依賴項(xiàng)。用于方便地搭建能夠處理超高并發(fā)、擴(kuò)展性極高的動態(tài)Web應(yīng)用、Web服務(wù)和動態(tài)網(wǎng)關(guān)。 OpenResty通過匯聚各種設(shè)計(jì)精良的Nginx模塊(主要由OpenResty團(tuán)隊(duì)自主開發(fā)),從而將Nginx有效地變成一個強(qiáng)大的通用Web應(yīng)用平臺。這樣,Web 開發(fā)人員和系統(tǒng)工程師可以使用Lua腳本語言調(diào)動 Nginx支持的各種C以及Lua模塊,快速構(gòu)造出足以勝任10K乃至 1000K以上單機(jī)并發(fā)連接的高性能Web應(yīng)用系統(tǒng)。 OpenResty的目標(biāo)是讓你的Web服務(wù)直接跑在Nginx服務(wù)內(nèi)部,充分利用Nginx的非阻塞I/O模型,不僅僅對HTTP客戶端請求,甚至于對遠(yuǎn)程后端諸如MySQL、PostgreSQL、Memcached以及Redis等都進(jìn)行一致的高性能響應(yīng)。 4.KongKong是一個在Nginx中運(yùn)行的Lua應(yīng)用程序,并且可以通過lua-nginx模塊實(shí)現(xiàn),Kong不是用這個模塊編譯Nginx,而是與OpenResty一起發(fā)布,OpenResty已經(jīng)包含了lua-nginx-module,OpenResty不是 Nginx的分支,而是一組擴(kuò)展功能的模塊。 是一個Api Gateway,通過插件的形式提供負(fù)載均衡,日志記錄,身份驗(yàn)證,速率限制,轉(zhuǎn)換等功能??梢院茌p松擴(kuò)展功能,模塊化,可以運(yùn)行在任何基礎(chǔ)設(shè)施上。 它的核心是實(shí)現(xiàn)數(shù)據(jù)庫抽象,路由和插件管理,插件可以存在于單獨(dú)的代碼庫中,并且可以在幾行代碼中注入到請求生命周期的任何位置。很方便地為路由和服務(wù)提供各種插件,網(wǎng)關(guān)所需要的基本特性,Kong都如數(shù)支持:
上面這些特性中,反復(fù)提及了Kong背后的OpenResty,實(shí)際上,使用 Kong之后,Nginx可以完全摒棄,因?yàn)镵ong的功能是Nginx的父集。 5.對比、總結(jié)
綜上對比,從開源社區(qū)活躍度和學(xué)習(xí)成本來看,無疑是Zuul和Traefik較好;從成熟度來看,較好的是Kong、Traefik;從性能角度來看,Kong要比其他幾個領(lǐng)先一些,從架構(gòu)優(yōu)勢的擴(kuò)展性來看,Kong豐富的插件,而Zuul是完全需要自研各類Filter,但Zuul由于與Spring Cloud深度集成,使用度也很高。 六、服務(wù)注冊與發(fā)現(xiàn)服務(wù)注冊與發(fā)現(xiàn),是一個古老的話題,當(dāng)應(yīng)用開始脫離單機(jī)運(yùn)行和訪問時(shí),服務(wù)注冊與發(fā)現(xiàn)就誕生了。目前的網(wǎng)絡(luò)架構(gòu)是每個主機(jī)都有一個獨(dú)立的IP地址,那么服務(wù)發(fā)現(xiàn)基本上都是通過某種方式獲取到服務(wù)所部署的IP地址。DNS協(xié)議是最早將一個網(wǎng)絡(luò)名稱翻譯為網(wǎng)絡(luò)IP的協(xié)議,在最初的架構(gòu)選型中,DNS+LVS+Nginx基本可以滿足所有的RESTful服務(wù)的發(fā)現(xiàn),此時(shí)服務(wù)的IP列表通常配置在Nginx或者LVS。后來出現(xiàn)了RPC服務(wù),服務(wù)的上下線更加頻繁,人們開始尋求一種能夠支持動態(tài)上下線并且推送IP列表變化的注冊中心框架或組件。 現(xiàn)如今,各類服務(wù)注冊與發(fā)現(xiàn)的框架、組件很多(Zookeeper、Eureka、Consul、etcd等),在選擇上更是眼花繚亂。在服務(wù)注冊與發(fā)現(xiàn)的技術(shù)選型上,我覺得我們應(yīng)該還是有一定遵循原則和關(guān)注要點(diǎn)的。通常可從以下幾個方面出發(fā),進(jìn)行重點(diǎn)關(guān)注、抉擇。
七、配置中心在微服務(wù)架構(gòu)中,服務(wù)的數(shù)量以及配置信息的日益增多,比如各種服務(wù)器參數(shù)配置、各種數(shù)據(jù)庫訪問參數(shù)配置、各種環(huán)境下配置信息的不同、配置信息修改之后實(shí)時(shí)生效等等,傳統(tǒng)的配置文件方式或者將配置信息存放于數(shù)據(jù)庫中的方式已無法滿足開發(fā)人員對配置管理的要求,如:
在微服務(wù)架構(gòu)中,使用配置中心之前,上述的問題或麻煩,你肯定也會遇到過,所以,是否引入配置中心,取決于你是否有下面的需求:
一般完善的配置中心,都會從以下兩個方面設(shè)計(jì)出發(fā),以發(fā)揮配置中心的作用。 1)配置實(shí)時(shí)生效 傳統(tǒng)的靜態(tài)配置方式要想修改某個配置只能修改之后重新發(fā)布應(yīng)用,要實(shí)現(xiàn)動態(tài)性,可以選擇使用數(shù)據(jù)庫,通過定時(shí)輪詢訪問數(shù)據(jù)庫來感知配置的變化。輪詢頻率低感知配置變化的延時(shí)就長,輪詢頻率高,感知配置變化的延時(shí)就短,但比較損耗性能,需要在實(shí)時(shí)性和性能之間做折中。配置中心專門針對這個業(yè)務(wù)場景,兼顧實(shí)時(shí)性和一致性來管理動態(tài)配置。 2)配置管理流程 配置的權(quán)限管控、灰度發(fā)布、版本管理、格式檢驗(yàn)和安全配置等一系列的配置管理相關(guān)的特性也是配置中心不可獲取的一部分。(這也算是配置中心的高級特性作用) 1.Spring Cloud ConfigSpring Cloud Config作為Spring Cloud中的一個組件,其功能開放,可開發(fā)性強(qiáng),常是各類配置中心自我研發(fā)的基石。 從Spring Cloud Config的源碼(spring-cloud-config-server)中,可以看出目前支持本地存儲、Git倉庫存儲、SVN倉庫存儲、數(shù)據(jù)庫存儲方式,其他存儲方式可參考源碼自行實(shí)現(xiàn)即可。 以Git存儲方式為例說明,Spring Cloud Config包含config-server、Git和Spring Cloud Bus三大組件:
本地測試模式下,Spring Cloud Bus和config-server需要部署一個節(jié)點(diǎn),Git使用GitHub就可以。在生產(chǎn)環(huán)境中,Spring Cloud Config,config-server需要部署至少兩個節(jié)點(diǎn)。Spring Cloud Bus如果使用RabbitMQ,普通集群模式至少需要兩個節(jié)點(diǎn)。 Git服務(wù)如果使用GitHub就不用考慮高可用問題,如果考慮到安全性要自建Git私有倉庫,整體的成本比較高。Web服務(wù)可以部署多節(jié)點(diǎn)支持高可用,由于Git有數(shù)據(jù)的一致性問題,可以通過以下的方式來支持高可用:
2.ApolloApollo(阿波羅)是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r(shí)推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場景。 Apollo分為MySQL,Config Service,Admin Service,Portal四個模塊:
本地測試Config Service,Admin Service,Portal三個模塊可以合并一起部署,MySQL單獨(dú)安裝并創(chuàng)建需要的表結(jié)構(gòu)。在生產(chǎn)環(huán)境使用Apollo,Portal可以兩個節(jié)點(diǎn)單獨(dú)部署,穩(wěn)定性要求沒那么高的話,Config Service和Admin Service可以部署在一起,數(shù)據(jù)庫支持主備容災(zāi)。 3.NacosNacos是一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺。這正是Nacos官方給出的定義:
核心功能:
Nacos部署需要Nacos Service和MySQL:
單機(jī)模式下,Nacos可以使用嵌入式數(shù)據(jù)庫部署一個節(jié)點(diǎn),就能啟動。如果對MySQL比較熟悉,想要了解整體數(shù)據(jù)流向,可以安裝MySQL提供給Nacos數(shù)據(jù)持久化服務(wù)。生產(chǎn)環(huán)境使用Nacos,Nacos服務(wù)需要至少部署三個節(jié)點(diǎn),再加上MySQL主備。 4.對比、總結(jié)整體來看,Nacos的部署結(jié)構(gòu)比較簡單,運(yùn)維成本較低。Apollo部署組件較多,運(yùn)維成本比Nacos高。Spring Cloud Config易于定制化二次開發(fā),生產(chǎn)高可用的成本最高。
總的來說,Apollo和Nacos相對于Spring Cloud Config的生態(tài)支持更廣,在配置管理流程上做的更好。Apollo相對于Nacos在配置管理做的更加全面,不過使用起來也要麻煩一些。Nacos使用起來相對比較簡潔,在對性能要求比較高的大規(guī)模場景更適合。 |
|