李祥 金安安



摘? ?要:微服務架構因其服務獨立開發、獨立部署、獨立維護、可擴展性高等眾多優點成為當前網絡應用開發首選架構。文章針對現有實驗室管理平臺的缺點,對微服務架構在實驗室管理平臺上的應用進行充分研究;在分析軟件構架演變的基礎上,以實驗室科研管理為實際業務場景,結合開發與設計實驗室管理平臺實踐,對Spring Cloud微服務架構進行研究,實現實驗室管理軟件的Docker平臺應用部署,對同類設計與開發具有良好的借鑒作用。
關鍵詞:實驗管理系統;微服務;Spring Cloud
中圖分類號:TP315;G203 文獻標志碼:A 文章編號:1673-8454(2021)01-0055-05
一、引言
高校實驗室是進行實驗教學、開展科學研究、培育學生創新能力、提高學生綜合素質的重要基地,也是孵化高水平研究成果、服務經濟建設的主要場所。高等院校的實驗教學是培養學生創新精神和實踐動手能力直接、關鍵的環節,其優勢在于使學生把所學的理論和實踐相結合,著力培養學生創新精神和知識運用能力。它既有知識傳承,又有動手實踐,遵循認知規律,讓學生在科學實驗中親身去發現和認識科學理論,并檢驗所獲得的理論知識。
當前高校實驗室普遍存在著因實驗課時過少和封閉式管理,沒有充分發揮其培養學生創新精神和實踐能力的重要作用的問題。如何利用實驗教學資源與已建成的基礎實驗平臺、專業基礎實驗平臺和重點學科研究實驗平臺共同構建一個完整實驗室體系,是一項值得重要扶持和發展的重點課題。因此,高校實驗室開放共享體系的構建,對培養學生的創新精神和實踐動手能力具有重要的意義和深遠的影響。
微服務是將獨立的應用系統開發分解為一組小型服務的開發,其中每個小型服務都以獨立進程運行,并采用如HTTP資源API這樣輕量機制來相互通信的新型應用開發機制。近年來,微服務架構以其獨立部署、高效、松耦合、高內聚、擴展性強等優點成為目前火熱的后臺開發架構之一。本文旨在通過以實驗室管理系統設計開發為實際業務場景,在對微服務架構的整體模式進行深入分析的基礎上,完成微服務系統架構的搭建與部署工作。
二、Spring Cloud微服務框架簡介
Spring Cloud是一套用于搭建微服務架構應用的框架,由Pivotal團隊提供,實現了配置管理、服務發現、智能路由、負載均衡、熔斷器等功能。該框架簡化了Spring應用的創建、運行、調試、部署等工作,使開發者可以專注于Spring應用的開發,無需過多關注XML的配置以及特定配置方法。Spring Cloud主要包括Spring Cloud Netflix和Spring Cloud OpenFeign兩種典型框架。
Spring Cloud Netflix是Spring Cloud中的一套框架,它包含了解決服務注冊與發現,網關、負載均衡、服務之間通信、斷路器等微服務架構所需解決問題的眾多組件。Spring Cloud OpenFeign框架則只需要定義好接口,就可以將原來通過Http的請求調用轉化為調用定義好接口的方法,使客戶端可以很容易調用http服務,為微服務架構下服務之間的調用提供了更加便捷的應用解決方案。
三、系統微服務構架的設計與實現
1.微服務架構設計
不同于單體架構,引入微服務后,系統整體架構提升了復雜度,結合Spring Cloud體系結構,本文設計了本系統微服務架構,如圖1所示。服務注冊中心是微服務架構最核心和最基礎的服務,使用Eureka解決。實驗管理系統拆分的三個服務(人員服務user、成果服務achievement、設備服務device)作為業務模塊,使用Spring Boot構建。拆分為多個微服務后,使用Zuul組件作為服務網關統一管理服務的入口。每個服務都有自己的配置文件,過于分散,不易管理。故使用Spring Cloud Config這一組件作為配置中心來統一管理所有應用的相關配置文件。在數據存儲方面,關系型數據庫主要使用開源的MySQL。
在實驗室管理系統的分析設計過程中,為充分發揮云平臺中的微服務應用效率,將通用的人員管理(user)、成果管理(achievement)以及設備管理(device)三個模塊劃分為三個微服務模塊:①user服務管理實驗室人員信息,包括添加、修改、查詢等功能。②achievement服務管理實驗室的科研成果。科研成果包括著作、論文、專利、研究項目四種類型。③device服務管理實驗室的設備信息,包括實驗室設備信息的錄入、修改、刪除等。實驗室人員可以申請實驗室的設備使用,但申請后應得到管理員的審核方可使用。
2.微服務構架技術實現
在實現角度,每個微服務共有的操作大概分為三步,包括引入依賴完成pom文件、編寫啟動類以及用ymal語法編寫yml配置文件等部分。
在實驗室管理系統中,系統用戶管理微服務模塊,主要提供用戶注冊、用戶登錄、用戶個人信息管理、用戶地址管理等服務。在設計過程中,考慮到用戶管理中心其他微服務也會調用,所以先做聚合工程UserManage,此模塊包含2個子工程:
- leyou-user-interface:包含實體類及對外接口;
- leyou-user-service:包括業務邏輯和內部接口。
具體結構如圖2所示:
(1)模塊邏輯設計
- 請求方式:GET;
- 請求路徑:/check/{param}/{type};
- 請求參數:param,type;
- 返回結果:true或false。
(2)關鍵代碼分析
//**
*用戶注冊
*@param user
*@param code
*@return
*/
@ PostMapping("register")
public ResponseEntity
userService.register(user,code);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
/**
*校驗數據是否可用
*@param data
*@param type
*@return
*/
@GetMapping("/check/{data}/{type}")
Public ResponseEntity
Boolean boo=this.userService.checkData(data,type);
if(boo==null){
Return ResponseEntity.status(HttpStatus.BAD_REQUEST).Build();
}
Return ResponseEntity.ok(boo);
/**
* 發送驗證碼
* @param phone
* @return
*/
3.微服務構架高可用優化
在微服務架構中,高可用通過部署多個實例來實現。如Eureka Server微服務構架中,可以啟動多個Eureka Server實例,這些Eureka Server實例之間以相互注冊的方式來實現服務的高可用。
所有Eureka Server節點在服務提供者的同時,也在服務消費者。實現步驟如下:
(1)新建兩個配置文件application-e1.yml和application-e2.yml。
(a)application-e1.yml作為實例一的配置文件,將service-url指向實例二。內容如下:
eureka:
client:
service-url:
defaultZone:? http://eureka2:8762/eureka/
spring:
application:
name: eureka
server:
port: 8761
(b)application-e2.yml作為實例二的配置文件,將service-url指向實例一。內容如下:
eureka:
client:
service-url:
defaultZone:? http://eureka1:8761/eureka/
spring:
application:
name: eureka
server:
port: 8762
(2)然后使用rancher通過參數spring.profiles.active指定配置文件分別啟動兩個eureka實例。
四、系統功能結構設計(見圖3)
本文所針對的實驗室管理系統開發以所在學校的科研實驗室管理為主要分析對象,主要包含人員管理、成果管理和設備管理等三部分內容,實現開放管理。
1.人員管理
主要負責實驗室人員的信息管理,包括管理員和普通人員兩類角色。功能主要分為:①查詢。所有人都可以查詢個人信息。管理員擁有最高權限,可以錄入、修改和刪除人員信息,并且可以查詢所有人員信息。普通人員只可以查詢自己個人信息。②添加、修改和刪除。管理員可以添加、修改和刪除所有人的個人信息,而個人不可以執行這些操作。③查詢統計個人成果。在人員管理模塊,可以指定某條人員信息后查詢該人員的所有科研成果信息。
在該頁面中會加載被編輯人員原來的詳細信息。顯示的信息字段與添加人員信息的字段一致。但是姓名字段不可修改,并且該頁面隱藏了人員id字段。其中性別和導師字段輸入框均為下拉框。在加載頁面時會初始化加載數據。在頁面的最下面有兩個按鈕,點擊返回直接返回到人員管理查詢頁面,并會刷新修改之后的數據。修改數據后點擊保存,數據包括隱藏字段人員id將會以json格式傳給user服務。在服務端將會根據人員id更新人員信息。所有人的人員信息以一個表格的形式展示,包括姓名、專業、崗位、導師、研究方向、教育背景、介紹、聯系方式、操作。其中操作字段顯示的是人員信息的編輯按鈕。點擊編輯按鈕,頁面將跳轉到人員信息的編輯頁面。人員信息查詢可以根據查詢姓名進行查詢,輸入姓名后,點擊查詢,Get請求將會攜帶姓名信息,以及默認的每頁顯示頁數和當前頁信息到后臺。(見圖4)
2.成果管理
負責所有實驗室人員的科研成果信息維護。包括著作、論文、專利以及科研項目。每條成果信息必須包含實驗室人員id,該id對應人員管理部分中人員信息的id,邏輯上是成果信息的外鍵。成果信息主要由管理人員維護,管理員可以對所有成果信息進行增加、修改、刪除以及查詢。而普通人員只擁有查詢所有人科研成果的權限。
查詢結果頁面以表格信息展示著作信息,包括序列號、書名、類型、作者、出版社、出版時間、描述、操作等列項。其中操作列中顯示著作的編輯按鈕。在表格的上方可以輸入查詢條件,可以根據書名查詢書籍信息。當點擊著作菜單項時,會跳轉到圖5所示頁面。第一頁的書籍信息會自動加載。輸入查詢條件,點擊搜索框,頁面發送請求到achievement服務進行查詢。
3.設備管理
負責實驗室的設備信息管理,處理實驗室的設備信息維護,包括增、刪、改、查等。還應該維護實驗室設備的借用情況。實驗室人員使用實驗室設備之前必須提交申請,等待管理員通過審核后方可使用。
實驗室信息管理頁面的添加、修改和查詢與前面相似。在這里介紹一下設備申請功能。點擊設備信息管理頁面的申請按鈕,將攜帶設備的編號跳轉到設備申請頁面,在該頁面首先會根據url攜帶的設備編號參數,加載設備的名稱和庫存數量,這兩個字段都設置為只讀。申請者填寫申請數量后點擊保存提交后將數據發送給device服務,device服務生成申請編號后保存到device_apply表中,等待管理員審核,同時,申請信息將會保存到device_apply表中的申請信息,作為操作日志備查。(見圖6)
五、系統微服務架構配置
根據系統設計,基于Spring Boot應用框架,以Spring Cloud技術棧作為微服務的架構配置流程包括以下幾個方面內容:
1.服務注冊中心
服務注冊中心使用Eureka組件。Eureka包含服務端和客戶端。除了注冊中心,其它的服務都可以在主類中加上注解@EnableEurekaServer注冊到eureka server端。并且通過設置參數defaultZone注冊到eureka注冊中心。DefaultZone屬性可以是eureka注冊中心多實例中的任何一個。
2.配置中心搭建
Spring Cloud Config默認是采用Git存儲配置。實現過程如下:
(1)添加config server和eureka client依賴。引入eureka客戶端依賴,是因為需要將config-server注冊到eureka服務端進入微服務治理體系,以實現配置中心的高可用。
(2)主類同時添加注解@EnableDiscoveryClient和@EnableConfigServer。Config服務既作為Eureka的客戶端,又作為Config的服務端。
(3)創建Git倉庫。這里使用GitHub作為倉庫。
(4)修改配置文件。配置Git倉庫的相關信息。至此完成Spring Cloud Config的引入。
3.服務網關搭建
引入Spring Cloud Zuul步驟:
(1)添加org.springframework.cloudspring-cloud-starter-netflix-zuul依賴。
(2)通過在主類中添加注解@EnableZuulProxy啟用Zuul組件。
(3)配置路由規則。Zuul默認配置的路由規則是,所有服務暴露的端口都是可訪問的。在本系統配置中希望ahievement是不直接對外提供服務的,只是通過user服務調用,所以需要禁用默認的路由規則。禁用配置如下:
zuul:
ignored-services: achievement
(4)設置過濾。Zuul不僅可以路由,還具有過濾功能。使用Zuul,主要是使用它提供的過濾器,Zuul中提供了PRE、ROUTING、POST、ERROR四種過濾器類型。在這里調用user服務,需要驗證請求中是否攜帶令牌token。如未攜帶該請求不通過。需要在api-gateway中實現一個前置過濾器。該過濾器需實現ZuulFilter接口,filterType()方法返回前置過濾器PRE_TYPE類型,filterOrder()返回的是過濾器執行的順序位置。run()方法里是需要執行的操作,當請求中不攜帶token時,請求將得不到執行。過濾邏輯的具體實現代碼如下:
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String token = request.getParameter("token");
if(StringUtils.isEmpty(token)){
currentContext.setSendZuulResponse(false);
currentContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
}
return null;
4.斷路器搭建
(1)添加spring-cloud-starter-netflix-zuul依賴。
(2)主類添加注解@EnableCircuitBreaker以引入斷路器。
(3)Hystrix組件是一個容錯框架,可以通過注解@HystrixCommand配置,參數fallbackMethod設置回退降級處理方法。
(4)在user服務中定義findAchievementById方法的回退降級處理方法fallback。實現過程如下:
引入Hystrix-dashboard。Hystrix-dashboard是Hystrix一款可以對Hystrix進行實時監控的組件。通過Hystrix-dashborad可以清晰明了地查看請求響應時間、請求成功率等數據。
5.微服務通信
Spring Cloud中使用Feign框架來解決通信問題。現以根據實驗室人員id查看該實驗室人員科研成果這一業務為例說明如何配置微服務通信。
(1)首先創建一個著作信息BookInfo實體,通過ORM框架映射到數據庫。通過注解@Entity注明該類為數據庫表映射類。類名和數據庫表對應。注解@Id注明表的主鍵。
(2)ORM框架使用Spring Data Jpa。只需要編寫一個繼承自JpaRepository的接口就能完成數據的訪問。
(3)通過對外暴露的接口,可根據作者id查詢著作的接口進行實現。
6.微服務鏈路追蹤
Spring Cloud項目的Spring Cloud Sleuth為服務之間提供了鏈路追蹤,以了解服務耗時、網絡深度、調用次數等信息。配置模式如下:
(1)先運行一個zipkin server。通過docker可以快速運行zipkin。
(2)在user和achievement服務中添加spring-cloud-starter-zipkin依賴。
(3)在bootstrap.yml文件中添加配置。
六、結束語
現在微服務架構是非常炙熱的話題。在本項目軟件開發中,采用了Spring Boot作為單個服務應用框架,以Spring Cloud為技術棧搭建微服務架構,實現整個項目的微服務架構系統搭建,以及基于Docker容器技術的系統部署,對微服務軟件應用開發整個流程進行了系統的實踐。
微服務雖然能解決單體應用膨脹、耦合度高、開發效率低下等問題,但是同樣也會帶來部署和維護越來越復雜的問題,[14]而且如果沒有豐富的實踐經驗,對服務拆分的粒度也是很難把控的。因此,在實際開發中,應根據實際業務需要來選擇采用哪種構架來進行軟件應用開發、實現單體架構和微服務架構有機融合。
參考文獻:
[1]辛園園,鈕俊,謝志軍,張開樂,毛昕怡.微服務體系結構實現框架綜述[J].計算機工程與應用,2018(19):10-17.
[2]戴勝.微服務架構應用前景探析[J].花炮科技與市場,2018(4):67-70.
[3]趙然,朱小勇.微服務架構評述[J].網絡新媒體技術,2019(1):58-61.
[4]劉瀚璟.基于微服務架構的導師遴選和研究生招生系統的設計與實現[D].濟南:濟南大學,2018.
[5]孫宇,周綱.基于微服務架構的資源發現系統平臺構建研究[J].中國圖書館學報,2020(1).
[6]姚剛,蔡鳳翔,李英浩.淺談微服務架構的網站開發技術[J].信息系統工程,2019(12):69-70.
[7]李娜.基于Spring Cloud微服務架構的應用[J].電子技術與軟件工程,2019(12):142.
[8]黃強文,曾丹.基于Spring Cloud和Docker的分布式微服務架構設計[J].微型電腦應用,2019(6):98-101.
[9]Cerny. Aspect-oriented challenges in system integration with microservices, SOA and IoT[J].Enterprise Information Systems,2019.
[10]梅璇.基于Spring Cloud的微服務調用研究[D].武漢:武漢理工大學,2018.
[11]Ru Wang,Muhammad Imran,Kashif Saleem.A microservice recommendation mechanism based on mobile architecture[J].Journal of Network and Computer Applications,2019.
[12]隋亞楠.基于Spring Cloud技術的生產管理云平臺的研究[D].天津:天津大學,2018.
[13]周立.Spring Cloud與Docker微服務架構實戰[M].北京:電子工業出版社,2017.5.
[14]章仕鋒,潘善亮.Docker技術在微服務中的應用[J].電子技術與軟件工程,2019(4):164.
(編輯:王天鵬)