馬榮彥
(中央宣傳部電影數字節目管理中心,北京 100866)
1引言
隨著我國國民經濟整體建設水平進入一個新的時代,廣大農村群眾對于精神文化的消費需求也相應提高。農村電影放映工程是國家加強農村文化建設戰略部署的貫徹落實成果,是公共文化服務體系的重要組成部分,要進一步聚焦農村電影放映,提高服務農村和農民群眾的水平。因此農村公益電影公共服務平臺的完善建設也顯得越來越重要,而且隨著互聯網科學技術的快速發展,以及長時間以來用戶需求的不斷變化,誕生了許多比較前沿的互聯網應用技術。在以前,我們只需要一個服務器,將程序全部打包并在這個服務器上部署好就可以,隨著應用業務的擴展,在開發時如果使用常規單一的架構,需要的資源會越來越多,就會導致系統運行速度降低,而且維護也越來越困難,這就需要對現有的架構進行升級改造,亟需一個框架系統確保應用有條不紊運行,因此就發展出了微服務架構。本文對農村公益服務平臺建設可以使用的比較流行的微服務框架技術進行了詳細介紹,并對可行性進行了研究分析。
傳統的web開發方式大都是一個WAR 包整合所有的功能,包含DO/DAO 層、Service層、UI等所有的業務邏輯和實現,然后部署在一個容器 (常用的容器有Tomcat、Jboss、Web Logic 等)里運行。它的主要優點是開發簡單,集中式管理;功能都在本地,沒有分布式的管理和調用消耗等,但是也存在比如效率低、維護難、穩定性差、擴展性不夠等問題。隨著用戶要求的提高,對于大型的系統來說傳統架構已經很難滿足市場需求,于是衍生出了分布式架構,又從分布式衍生出了SOA 架構,在這個過程中,功能的顆粒度被拆解得越來越小,這就發展成為了微服務架構。
微服務在維基百科上的定義為:由以單一應用程序構成的小服務,自己擁有自己的行程與輕量化處理,服務根據業務功能設計,以全自動的方式部署,與其他服務可以進行通信。我個人認為微服務架構就是一組單一功能服務的有機組合,每個服務只解決一個問題并且可以獨立的開發、測試、部署、上線運行,有著非常完整的生命周期,服務之間也可以根據某種協議進行交互,這樣使系統變得更加靈活。微服務架構的最小顆粒度是服務,根據服務來開發、管理和迭代應用,在每個服務中都可以使用云架構和平臺式部署、管理等工具,并且可以用不同的編程語言與數據庫等組件實現,這使對產品的管理變得快速且簡單。
一個大型的復雜的系統由多個微服務組成,系統的各個微服務之間都是松散耦合的,并且能很好地解決單一功能問題。當前市場上微服務開源的框架主要有Dubbo、Spring Cloud等,本文主要介紹這兩種框架技術。

圖1 Spring Cloud技術體系主要組成部分
Spring Cloud是Spring體系的微服務解決方案,它在Spring Boot基礎上集成了包括服務注冊與發現、配置中心、網關、服務保護與熔斷、分布式配置管理、負載均衡等簡單易部署易維護的系統底層開發框架,不需要用戶再集成其他的組件即可完成微服務架構的開發以及部署,同時它也支持與其它第三方組件集成開發。
Spring Cloud常用的5個核心組件:
(1)Netflix Eureka —— 注冊中心;
(2)Netflix Ribbon—— 客戶端負載均衡;
(3)Netflix Hystrix —— 服務熔斷器;
(4)Netflix Zuul —— 服務網關;
(5)Spring Cloud Config—— 配置中心。
Spring Boot框架是Spring Cloud的基礎,因此它是可以被獨立使用來開發應用系統,但是Spring Cloud卻是依賴Spring Boot而不能獨立使用的,Spring Cloud對使用Spring Boot開發的單體微服務進行組合管理,是有著完整的一個生命周期的微服務框架。
Dubbo是阿里公司維護的致力于提供高性能和透明化的RPC 遠程服務調用框架,它在RPC 通信與微服務治理方面表現優秀,因此使用Dubbo開發的微服務具備相互之間的遠程發現與通信能力,同時Dubbo提供了豐富的服務治理能力,可以實現諸如服務發現、負載均衡、流量調度等服務治理訴求。Dubbo作為一款開源的高性能、輕量級框架,在實現風格上與Java傳統的RMI、EJB技術非常相似,具備三個特點:面向接口的遠程方法調用、智能容錯和負載均衡以及服務自動注冊和發現。
(1)在接口調用方面: 對于用戶來說是非API侵入的,所有功能都可以通過配置文件解決,調用遠程方法和本地方法是統一的,沒有任何區別。
(2)在智能容錯方面:可以通過配置使用軟件負載均衡,來降低系統開發部署成本,避免單點故障。
(3)在服務管理方面:框架提供了基于接口名來查詢服務提供者地址的服務,可以對服務提供者地址進行透明管理。
Spring Cloud和Dubbo都是當下流行的RPC框架,各自都集成了一些服務和治理組件,但還是有一些差異比較大的地方:
(1)技術維度方面
Spring Cloud是Spring體系下的微服務解決方案,而Dubbo是阿里提供的分布式服務框架,從自身集成組件上來說Dubbo只提供了服務治理,需要集成其他的第三方框架來完成相應的功能開發,而Spring C loud目前已經包含了21個子項目滿足目前的開發需求并且在不斷升級中。
(2)遠程調用方式方面
Dubbo的遠程調用方式采用的RPC 方式,Spring C loud的遠程調用方式是Http Rest方式或者采用HTTP 2.0+長鏈接方式 (可以靈活配置)。嚴格來說HTTP 跟RPC 并不是一個層的概念,HTTP也可以作為RPC 的傳輸層協議。兩種方式的區別如下:
RPC方式中需要為每一個微服務進行接口定義,它對接口、語言等有很強的依賴性,需要嚴格控制才能保證不會出現調用沖突;而Http Rest是輕量級的接口方式,服務的提供和調用只需要通過一個約定進行規范,服務之間沒有耦合,不過也可能會出現由于文檔和接口不一致而導致的集成問題,但可以通過swagger等工具整合使代碼和文檔一體化解決,所以Http Rest在分布式環境下比RPC 更加靈活。而且在微服務提出者馬丁·福勒的論文中提出的服務間通信機制就是Http Rest。
由于Dubbo默認保持著單一長連接和NIO異步通訊來進行數據處理,使用TCP協議,并且使用Hessian2框架序列化報文,因此在小數據且并發比較高的情況中或者服務消費者數量遠大于提供者數量的情況下Dubbo要比Spring Cloud 性能要高一些,但不適用于大數據傳輸的情況。
(3)服務注冊中心方面
Dubbo集成了第三方的Zoo Keeper組件來作為框架的注冊中心,來實現對服務的管理,Spring Cloud使用本身帶有的Spring Cloud Netflix Eureka組件作為實現注冊中心進行服務管理,也支持與Zookeeper集成開發。
(4)技術發展角度
Spring Cloud依托在Spring家族的基礎上,一直在不斷的優化升級中,而Dubbo的理念在最初解決了許多服務治理的問題,但是它的發展相對停滯了一段時間,后來在2017 年重新啟動進行開發維護,同時也涌現出了許多先進的技術和理念。因此Spring C loud的發展相比Dubbo來說相對完善和穩定,并且最新版本Dubbo3中的maven也有了新的變化,org.apache.dubbo:dubbo:3.0.0已經不是包含所有資源的all-in-one包,用戶如果使用了一些不在核心包中的組件如registry-etcd、rpc-hessian等,需要在pom.xml配置文件中進行集成。
負載均衡的目的是為了特定場景下,能夠將請求合理地平分到各服務實例上,以便發揮所有機器的疊加作用。主要考慮的就是不將請求分配到出現故障的機器,性能越好的機器可以分配更多的請求。一般負載均衡可以借助外部工具,硬件負載均衡或軟件負載均衡,如F5/nginx。當然了,在當前分布式環境遍地開花的情況下,客戶端的負載均衡看起來就更輕量級,顯得不可或缺。Dubbo 和Spring Cloud 均提供了幾種負載均衡策略:Random LoadBalance(隨機負載均衡算法)和RoundRobin LoadBalance(輪詢負載均衡算法)等策略,可以根據需求進行選擇配置。
系統使用微服務架構后,就被拆分成了更細維度的子服務,小到一個功能子模塊都可以作為一個微服務,各個微服務之間大都是互不影響的、松耦合的,可以被獨立開發以及部署。因此各個服務之間的通訊變得非常重要,RESTful HTTP協議是微服務架構中最常用的通訊機制。
在微服務架構中,隨著服務越來越多之后,服務的打包部署就會成為一件相當麻煩的事情。比如一個項目中有10個微服務需要部署,每次更新之后重新部署都需要手動操作10個微服務,這樣帶來的問題不可預估,有沒有什么辦法讓我們部署一次之后 ,只要點擊執行就可以自動部署呢? 我們可以借助Docker或者其它工具來完成一個微服務架構中的所有服務的自動化部署工作。
針對農村公益平臺中的影片訂購管理功能應用Spring Cloud 微服務架構進行實驗,后端使用Spring C loud框架進行實現,為前端業務提供支持,采用RESTful API方式并且前后端業務的數據交互使用JSON 格式。根據微服務架構的特點,我們將功能主要拆分為影片信息服務、用戶信息服務、訂單管理服務、購物車服務四個模塊,考慮到實際開發中,由于各個服務模塊之間相對獨立,對于一些公用的實體類等信息將新增一個公共模塊來存儲以避免重復定義和開發,最終的系統層次圖主要如圖2所示。

圖2 Spring C loud構建的簡單的微服務系統
本次開發使用IDEA 作為實驗項目的搭建工具,然后創建Maven項目,并搭建以下幾個部分:
(1)搭建組件SpringBoot Eureka,用來發現服務以及進行服務注冊;
(2)搭建組件SpringBootConfig,用于動態維護配置文件;
(3)搭建Spring Cloud組件網關服務Zuul,用于路由控制,如果有需要也可以加入Hystrix用于熔斷處理;
(4)搭建Spring Cloud Oauth認證授權中心;
(5)創建影片信息服務、用戶信息服務、訂單管理服務以及購物車服務、公共服務模塊,進行配置。
每個服務部署運行時都有單獨的服務端口號對外開放,前端服務通過網關映射到對應端口號的服務進行調用。Spring Cloud的啟動方式有多種,本次采用Java jar方式部署啟動,程序開發完成使用IDE 中的package功能進行打包,再使用Java-jar*.jar(包名)進行啟動。
農村公益電影服務作為農村群眾所喜好的一種文化娛樂方式,不僅讓農民群眾感受到了現代科技的進步,還豐富了農民的文化知識和精神世界。農村電影公益平臺的升級建設非常有必要,隨著信息化技術的飛速發展,微服務架構的應用越來越廣,在技術選型的時候我們需要根據實際情況選擇使用,其中Spring Cloud架構的調用方式Rest API更符合微服務官方的定義,而且Spring Cloud 來源于Spring家族,它更注重微服務架構生態,是解決微服務架構實施的綜合性框架,整合了諸多優秀的組件,并且Spring Cloud是Java語言中最常用的微服務框架解決方案。而Dubbo從整個大的平臺架構來看,Dubbo框架更專注于服務之間的治理,其他的功能實現比如配置中心、鏈路追蹤等需要依賴第三方組件進行集成,這樣增加了Dubbo開發的難度。Spring C loud幾乎考慮了服務治理的各個方面,并有Spring Boot的支持,開發起來會相對便利和簡單,但是具體使用還需要根據具體情況進行研究選擇。?