馬榮彥
(中央宣傳部電影數(shù)字節(jié)目管理中心,北京 100866)
1引言
隨著我國(guó)國(guó)民經(jīng)濟(jì)整體建設(shè)水平進(jìn)入一個(gè)新的時(shí)代,廣大農(nóng)村群眾對(duì)于精神文化的消費(fèi)需求也相應(yīng)提高。農(nóng)村電影放映工程是國(guó)家加強(qiáng)農(nóng)村文化建設(shè)戰(zhàn)略部署的貫徹落實(shí)成果,是公共文化服務(wù)體系的重要組成部分,要進(jìn)一步聚焦農(nóng)村電影放映,提高服務(wù)農(nóng)村和農(nóng)民群眾的水平。因此農(nóng)村公益電影公共服務(wù)平臺(tái)的完善建設(shè)也顯得越來(lái)越重要,而且隨著互聯(lián)網(wǎng)科學(xué)技術(shù)的快速發(fā)展,以及長(zhǎng)時(shí)間以來(lái)用戶需求的不斷變化,誕生了許多比較前沿的互聯(lián)網(wǎng)應(yīng)用技術(shù)。在以前,我們只需要一個(gè)服務(wù)器,將程序全部打包并在這個(gè)服務(wù)器上部署好就可以,隨著應(yīng)用業(yè)務(wù)的擴(kuò)展,在開(kāi)發(fā)時(shí)如果使用常規(guī)單一的架構(gòu),需要的資源會(huì)越來(lái)越多,就會(huì)導(dǎo)致系統(tǒng)運(yùn)行速度降低,而且維護(hù)也越來(lái)越困難,這就需要對(duì)現(xiàn)有的架構(gòu)進(jìn)行升級(jí)改造,亟需一個(gè)框架系統(tǒng)確保應(yīng)用有條不紊運(yùn)行,因此就發(fā)展出了微服務(wù)架構(gòu)。本文對(duì)農(nóng)村公益服務(wù)平臺(tái)建設(shè)可以使用的比較流行的微服務(wù)框架技術(shù)進(jìn)行了詳細(xì)介紹,并對(duì)可行性進(jìn)行了研究分析。
傳統(tǒng)的web開(kāi)發(fā)方式大都是一個(gè)WAR 包整合所有的功能,包含DO/DAO 層、Service層、UI等所有的業(yè)務(wù)邏輯和實(shí)現(xiàn),然后部署在一個(gè)容器 (常用的容器有Tomcat、Jboss、Web Logic 等)里運(yùn)行。它的主要優(yōu)點(diǎn)是開(kāi)發(fā)簡(jiǎn)單,集中式管理;功能都在本地,沒(méi)有分布式的管理和調(diào)用消耗等,但是也存在比如效率低、維護(hù)難、穩(wěn)定性差、擴(kuò)展性不夠等問(wèn)題。隨著用戶要求的提高,對(duì)于大型的系統(tǒng)來(lái)說(shuō)傳統(tǒng)架構(gòu)已經(jīng)很難滿足市場(chǎng)需求,于是衍生出了分布式架構(gòu),又從分布式衍生出了SOA 架構(gòu),在這個(gè)過(guò)程中,功能的顆粒度被拆解得越來(lái)越小,這就發(fā)展成為了微服務(wù)架構(gòu)。
微服務(wù)在維基百科上的定義為:由以單一應(yīng)用程序構(gòu)成的小服務(wù),自己擁有自己的行程與輕量化處理,服務(wù)根據(jù)業(yè)務(wù)功能設(shè)計(jì),以全自動(dòng)的方式部署,與其他服務(wù)可以進(jìn)行通信。我個(gè)人認(rèn)為微服務(wù)架構(gòu)就是一組單一功能服務(wù)的有機(jī)組合,每個(gè)服務(wù)只解決一個(gè)問(wèn)題并且可以獨(dú)立的開(kāi)發(fā)、測(cè)試、部署、上線運(yùn)行,有著非常完整的生命周期,服務(wù)之間也可以根據(jù)某種協(xié)議進(jìn)行交互,這樣使系統(tǒng)變得更加靈活。微服務(wù)架構(gòu)的最小顆粒度是服務(wù),根據(jù)服務(wù)來(lái)開(kāi)發(fā)、管理和迭代應(yīng)用,在每個(gè)服務(wù)中都可以使用云架構(gòu)和平臺(tái)式部署、管理等工具,并且可以用不同的編程語(yǔ)言與數(shù)據(jù)庫(kù)等組件實(shí)現(xiàn),這使對(duì)產(chǎn)品的管理變得快速且簡(jiǎn)單。
一個(gè)大型的復(fù)雜的系統(tǒng)由多個(gè)微服務(wù)組成,系統(tǒng)的各個(gè)微服務(wù)之間都是松散耦合的,并且能很好地解決單一功能問(wèn)題。當(dāng)前市場(chǎng)上微服務(wù)開(kāi)源的框架主要有Dubbo、Spring Cloud等,本文主要介紹這兩種框架技術(shù)。
圖1 Spring Cloud技術(shù)體系主要組成部分
Spring Cloud是Spring體系的微服務(wù)解決方案,它在Spring Boot基礎(chǔ)上集成了包括服務(wù)注冊(cè)與發(fā)現(xiàn)、配置中心、網(wǎng)關(guān)、服務(wù)保護(hù)與熔斷、分布式配置管理、負(fù)載均衡等簡(jiǎn)單易部署易維護(hù)的系統(tǒng)底層開(kāi)發(fā)框架,不需要用戶再集成其他的組件即可完成微服務(wù)架構(gòu)的開(kāi)發(fā)以及部署,同時(shí)它也支持與其它第三方組件集成開(kāi)發(fā)。
Spring Cloud常用的5個(gè)核心組件:
(1)Netflix Eureka —— 注冊(cè)中心;
(2)Netflix Ribbon—— 客戶端負(fù)載均衡;
(3)Netflix Hystrix —— 服務(wù)熔斷器;
(4)Netflix Zuul —— 服務(wù)網(wǎng)關(guān);
(5)Spring Cloud Config—— 配置中心。
Spring Boot框架是Spring Cloud的基礎(chǔ),因此它是可以被獨(dú)立使用來(lái)開(kāi)發(fā)應(yīng)用系統(tǒng),但是Spring Cloud卻是依賴Spring Boot而不能獨(dú)立使用的,Spring Cloud對(duì)使用Spring Boot開(kāi)發(fā)的單體微服務(wù)進(jìn)行組合管理,是有著完整的一個(gè)生命周期的微服務(wù)框架。
Dubbo是阿里公司維護(hù)的致力于提供高性能和透明化的RPC 遠(yuǎn)程服務(wù)調(diào)用框架,它在RPC 通信與微服務(wù)治理方面表現(xiàn)優(yōu)秀,因此使用Dubbo開(kāi)發(fā)的微服務(wù)具備相互之間的遠(yuǎn)程發(fā)現(xiàn)與通信能力,同時(shí)Dubbo提供了豐富的服務(wù)治理能力,可以實(shí)現(xiàn)諸如服務(wù)發(fā)現(xiàn)、負(fù)載均衡、流量調(diào)度等服務(wù)治理訴求。Dubbo作為一款開(kāi)源的高性能、輕量級(jí)框架,在實(shí)現(xiàn)風(fēng)格上與Java傳統(tǒng)的RMI、EJB技術(shù)非常相似,具備三個(gè)特點(diǎn):面向接口的遠(yuǎn)程方法調(diào)用、智能容錯(cuò)和負(fù)載均衡以及服務(wù)自動(dòng)注冊(cè)和發(fā)現(xiàn)。
(1)在接口調(diào)用方面: 對(duì)于用戶來(lái)說(shuō)是非API侵入的,所有功能都可以通過(guò)配置文件解決,調(diào)用遠(yuǎn)程方法和本地方法是統(tǒng)一的,沒(méi)有任何區(qū)別。
(2)在智能容錯(cuò)方面:可以通過(guò)配置使用軟件負(fù)載均衡,來(lái)降低系統(tǒng)開(kāi)發(fā)部署成本,避免單點(diǎn)故障。
(3)在服務(wù)管理方面:框架提供了基于接口名來(lái)查詢服務(wù)提供者地址的服務(wù),可以對(duì)服務(wù)提供者地址進(jìn)行透明管理。
Spring Cloud和Dubbo都是當(dāng)下流行的RPC框架,各自都集成了一些服務(wù)和治理組件,但還是有一些差異比較大的地方:
(1)技術(shù)維度方面
Spring Cloud是Spring體系下的微服務(wù)解決方案,而Dubbo是阿里提供的分布式服務(wù)框架,從自身集成組件上來(lái)說(shuō)Dubbo只提供了服務(wù)治理,需要集成其他的第三方框架來(lái)完成相應(yīng)的功能開(kāi)發(fā),而Spring C loud目前已經(jīng)包含了21個(gè)子項(xiàng)目滿足目前的開(kāi)發(fā)需求并且在不斷升級(jí)中。
(2)遠(yuǎn)程調(diào)用方式方面
Dubbo的遠(yuǎn)程調(diào)用方式采用的RPC 方式,Spring C loud的遠(yuǎn)程調(diào)用方式是Http Rest方式或者采用HTTP 2.0+長(zhǎng)鏈接方式 (可以靈活配置)。嚴(yán)格來(lái)說(shuō)HTTP 跟RPC 并不是一個(gè)層的概念,HTTP也可以作為RPC 的傳輸層協(xié)議。兩種方式的區(qū)別如下:
RPC方式中需要為每一個(gè)微服務(wù)進(jìn)行接口定義,它對(duì)接口、語(yǔ)言等有很強(qiáng)的依賴性,需要嚴(yán)格控制才能保證不會(huì)出現(xiàn)調(diào)用沖突;而Http Rest是輕量級(jí)的接口方式,服務(wù)的提供和調(diào)用只需要通過(guò)一個(gè)約定進(jìn)行規(guī)范,服務(wù)之間沒(méi)有耦合,不過(guò)也可能會(huì)出現(xiàn)由于文檔和接口不一致而導(dǎo)致的集成問(wèn)題,但可以通過(guò)swagger等工具整合使代碼和文檔一體化解決,所以Http Rest在分布式環(huán)境下比RPC 更加靈活。而且在微服務(wù)提出者馬丁·福勒的論文中提出的服務(wù)間通信機(jī)制就是Http Rest。
由于Dubbo默認(rèn)保持著單一長(zhǎng)連接和NIO異步通訊來(lái)進(jìn)行數(shù)據(jù)處理,使用TCP協(xié)議,并且使用Hessian2框架序列化報(bào)文,因此在小數(shù)據(jù)且并發(fā)比較高的情況中或者服務(wù)消費(fèi)者數(shù)量遠(yuǎn)大于提供者數(shù)量的情況下Dubbo要比Spring Cloud 性能要高一些,但不適用于大數(shù)據(jù)傳輸?shù)那闆r。
(3)服務(wù)注冊(cè)中心方面
Dubbo集成了第三方的Zoo Keeper組件來(lái)作為框架的注冊(cè)中心,來(lái)實(shí)現(xiàn)對(duì)服務(wù)的管理,Spring Cloud使用本身帶有的Spring Cloud Netflix Eureka組件作為實(shí)現(xiàn)注冊(cè)中心進(jìn)行服務(wù)管理,也支持與Zookeeper集成開(kāi)發(fā)。
(4)技術(shù)發(fā)展角度
Spring Cloud依托在Spring家族的基礎(chǔ)上,一直在不斷的優(yōu)化升級(jí)中,而Dubbo的理念在最初解決了許多服務(wù)治理的問(wèn)題,但是它的發(fā)展相對(duì)停滯了一段時(shí)間,后來(lái)在2017 年重新啟動(dòng)進(jìn)行開(kāi)發(fā)維護(hù),同時(shí)也涌現(xiàn)出了許多先進(jìn)的技術(shù)和理念。因此Spring C loud的發(fā)展相比Dubbo來(lái)說(shuō)相對(duì)完善和穩(wěn)定,并且最新版本Dubbo3中的maven也有了新的變化,org.apache.dubbo:dubbo:3.0.0已經(jīng)不是包含所有資源的all-in-one包,用戶如果使用了一些不在核心包中的組件如registry-etcd、rpc-hessian等,需要在pom.xml配置文件中進(jìn)行集成。
負(fù)載均衡的目的是為了特定場(chǎng)景下,能夠?qū)⒄?qǐng)求合理地平分到各服務(wù)實(shí)例上,以便發(fā)揮所有機(jī)器的疊加作用。主要考慮的就是不將請(qǐng)求分配到出現(xiàn)故障的機(jī)器,性能越好的機(jī)器可以分配更多的請(qǐng)求。一般負(fù)載均衡可以借助外部工具,硬件負(fù)載均衡或軟件負(fù)載均衡,如F5/nginx。當(dāng)然了,在當(dāng)前分布式環(huán)境遍地開(kāi)花的情況下,客戶端的負(fù)載均衡看起來(lái)就更輕量級(jí),顯得不可或缺。Dubbo 和Spring Cloud 均提供了幾種負(fù)載均衡策略:Random LoadBalance(隨機(jī)負(fù)載均衡算法)和RoundRobin LoadBalance(輪詢負(fù)載均衡算法)等策略,可以根據(jù)需求進(jìn)行選擇配置。
系統(tǒng)使用微服務(wù)架構(gòu)后,就被拆分成了更細(xì)維度的子服務(wù),小到一個(gè)功能子模塊都可以作為一個(gè)微服務(wù),各個(gè)微服務(wù)之間大都是互不影響的、松耦合的,可以被獨(dú)立開(kāi)發(fā)以及部署。因此各個(gè)服務(wù)之間的通訊變得非常重要,RESTful HTTP協(xié)議是微服務(wù)架構(gòu)中最常用的通訊機(jī)制。
在微服務(wù)架構(gòu)中,隨著服務(wù)越來(lái)越多之后,服務(wù)的打包部署就會(huì)成為一件相當(dāng)麻煩的事情。比如一個(gè)項(xiàng)目中有10個(gè)微服務(wù)需要部署,每次更新之后重新部署都需要手動(dòng)操作10個(gè)微服務(wù),這樣帶來(lái)的問(wèn)題不可預(yù)估,有沒(méi)有什么辦法讓我們部署一次之后 ,只要點(diǎn)擊執(zhí)行就可以自動(dòng)部署呢? 我們可以借助Docker或者其它工具來(lái)完成一個(gè)微服務(wù)架構(gòu)中的所有服務(wù)的自動(dòng)化部署工作。
針對(duì)農(nóng)村公益平臺(tái)中的影片訂購(gòu)管理功能應(yīng)用Spring Cloud 微服務(wù)架構(gòu)進(jìn)行實(shí)驗(yàn),后端使用Spring C loud框架進(jìn)行實(shí)現(xiàn),為前端業(yè)務(wù)提供支持,采用RESTful API方式并且前后端業(yè)務(wù)的數(shù)據(jù)交互使用JSON 格式。根據(jù)微服務(wù)架構(gòu)的特點(diǎn),我們將功能主要拆分為影片信息服務(wù)、用戶信息服務(wù)、訂單管理服務(wù)、購(gòu)物車服務(wù)四個(gè)模塊,考慮到實(shí)際開(kāi)發(fā)中,由于各個(gè)服務(wù)模塊之間相對(duì)獨(dú)立,對(duì)于一些公用的實(shí)體類等信息將新增一個(gè)公共模塊來(lái)存儲(chǔ)以避免重復(fù)定義和開(kāi)發(fā),最終的系統(tǒng)層次圖主要如圖2所示。
圖2 Spring C loud構(gòu)建的簡(jiǎn)單的微服務(wù)系統(tǒng)
本次開(kāi)發(fā)使用IDEA 作為實(shí)驗(yàn)項(xiàng)目的搭建工具,然后創(chuàng)建Maven項(xiàng)目,并搭建以下幾個(gè)部分:
(1)搭建組件SpringBoot Eureka,用來(lái)發(fā)現(xiàn)服務(wù)以及進(jìn)行服務(wù)注冊(cè);
(2)搭建組件SpringBootConfig,用于動(dòng)態(tài)維護(hù)配置文件;
(3)搭建Spring Cloud組件網(wǎng)關(guān)服務(wù)Zuul,用于路由控制,如果有需要也可以加入Hystrix用于熔斷處理;
(4)搭建Spring Cloud Oauth認(rèn)證授權(quán)中心;
(5)創(chuàng)建影片信息服務(wù)、用戶信息服務(wù)、訂單管理服務(wù)以及購(gòu)物車服務(wù)、公共服務(wù)模塊,進(jìn)行配置。
每個(gè)服務(wù)部署運(yùn)行時(shí)都有單獨(dú)的服務(wù)端口號(hào)對(duì)外開(kāi)放,前端服務(wù)通過(guò)網(wǎng)關(guān)映射到對(duì)應(yīng)端口號(hào)的服務(wù)進(jìn)行調(diào)用。Spring Cloud的啟動(dòng)方式有多種,本次采用Java jar方式部署啟動(dòng),程序開(kāi)發(fā)完成使用IDE 中的package功能進(jìn)行打包,再使用Java-jar*.jar(包名)進(jìn)行啟動(dòng)。
農(nóng)村公益電影服務(wù)作為農(nóng)村群眾所喜好的一種文化娛樂(lè)方式,不僅讓農(nóng)民群眾感受到了現(xiàn)代科技的進(jìn)步,還豐富了農(nóng)民的文化知識(shí)和精神世界。農(nóng)村電影公益平臺(tái)的升級(jí)建設(shè)非常有必要,隨著信息化技術(shù)的飛速發(fā)展,微服務(wù)架構(gòu)的應(yīng)用越來(lái)越廣,在技術(shù)選型的時(shí)候我們需要根據(jù)實(shí)際情況選擇使用,其中Spring Cloud架構(gòu)的調(diào)用方式Rest API更符合微服務(wù)官方的定義,而且Spring Cloud 來(lái)源于Spring家族,它更注重微服務(wù)架構(gòu)生態(tài),是解決微服務(wù)架構(gòu)實(shí)施的綜合性框架,整合了諸多優(yōu)秀的組件,并且Spring Cloud是Java語(yǔ)言中最常用的微服務(wù)框架解決方案。而Dubbo從整個(gè)大的平臺(tái)架構(gòu)來(lái)看,Dubbo框架更專注于服務(wù)之間的治理,其他的功能實(shí)現(xiàn)比如配置中心、鏈路追蹤等需要依賴第三方組件進(jìn)行集成,這樣增加了Dubbo開(kāi)發(fā)的難度。Spring C loud幾乎考慮了服務(wù)治理的各個(gè)方面,并有Spring Boot的支持,開(kāi)發(fā)起來(lái)會(huì)相對(duì)便利和簡(jiǎn)單,但是具體使用還需要根據(jù)具體情況進(jìn)行研究選擇。?