李步官 潘志宏 張東源 林勁文 蔡杰遠(yuǎn) 李赟
摘要:隨著項(xiàng)目的功能需求的增加,傳統(tǒng)的單體應(yīng)用已經(jīng)變得臃腫,難以繼續(xù)進(jìn)行開發(fā)維護(hù),因此提出基于微服務(wù)架構(gòu)的系統(tǒng)架構(gòu)方法對(duì)單體應(yīng)用進(jìn)行改造。確定微服務(wù)架構(gòu)之后,選用了Spring Cloud技術(shù)體系,并將系統(tǒng)拆分為多個(gè)微服務(wù)模塊。在微服務(wù)的開發(fā)過(guò)程中,由于服務(wù)數(shù)量多,難以手動(dòng)集成和手動(dòng)部署每一個(gè)服務(wù),因此結(jié)合DevOps,采用了阿里云云效平臺(tái)的流水線功能實(shí)現(xiàn)持續(xù)集成、持續(xù)部署,同時(shí)將服務(wù)部署到Kubernetes和Docker中,實(shí)現(xiàn)了軟件產(chǎn)品的持續(xù)交付,使得開發(fā)效率得到了極大的提升。
關(guān)鍵詞:微服務(wù);Spring Cloud;DevOps;Docker;預(yù)約;攝影
中圖分類號(hào):TP312 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)31-0026-05
Abstract: With the increasing functional requirements of the project, the traditional single application has become bloated and difficult to continue development and maintenance. Therefore, a system architecture method based on micro-service architecture is proposed to improve the single application. After determining the micro-service architecture, the Spring Cloud is selected and divided into several micro-service modules. During the development of micro-services, it is difficult to manually integrate and deploy each service because of the large number of services. Therefore, combined with DevOps, using the pipeline function of Ali Yunxiao Platform to achieve continuous integration and deployment. At the sametime, deploying services to Kubernetes and Docker to achieve continuous delivery of software products, which greatly improves development efficiency.
Key words: microservice; spring cloud; DevOps; docker; reservation; photography
1 背景
預(yù)約攝影平臺(tái)的后端系統(tǒng)主要功能包括用戶模塊、約拍模塊、作品模塊和打卡點(diǎn)推薦模塊。前期規(guī)劃時(shí)系統(tǒng)采用Java語(yǔ)言開發(fā),選用單體架構(gòu)(如圖1)進(jìn)行模塊化設(shè)計(jì)。由于整個(gè)系統(tǒng)構(gòu)建在單體架構(gòu)下, 單體應(yīng)用的架構(gòu)已無(wú)法滿足業(yè)務(wù)的發(fā)展。在現(xiàn)有單體架構(gòu)應(yīng)用程序,如果代碼有細(xì)微的改動(dòng),都要手工重新編譯代碼、打jar包、上傳到服務(wù)器、重新部署應(yīng)用,所謂的牽一發(fā)而動(dòng)全身,這樣煩瑣的手工操作流程,使得整個(gè)系統(tǒng)部署上線,持續(xù)交付的耗時(shí)長(zhǎng),影響范圍大、風(fēng)險(xiǎn)高、風(fēng)險(xiǎn)高,系統(tǒng)的開發(fā)效率低[1]。
鑒于以上所述的單體架構(gòu)應(yīng)用的缺點(diǎn),提出了新的架構(gòu)方案——微服務(wù)架構(gòu),來(lái)替換之前的單體架構(gòu)應(yīng)用。Spring Cloud微服務(wù)架構(gòu)是目前應(yīng)用最廣的技術(shù),為此選擇Spring Cloud微服務(wù)架構(gòu)的方案對(duì)系統(tǒng)進(jìn)行改造,相比之前的單體架構(gòu)的應(yīng)用,新方案確實(shí)降低了開發(fā)難度,提升了開發(fā)效率,證實(shí)了該方案的可行性。
2 基于微服務(wù)的架構(gòu)方案
微服務(wù)是系統(tǒng)架構(gòu)上的一種設(shè)計(jì)風(fēng)格,將一個(gè)原本獨(dú)立的單體架構(gòu)應(yīng)用系統(tǒng)拆解為多個(gè)小型服務(wù),即微服務(wù),每個(gè)微服務(wù)都在各自獨(dú)立的進(jìn)程中運(yùn)行,服務(wù)之間通過(guò)基于HTTP的RESTful API進(jìn)行通信協(xié)作[2]。被拆分成的每一個(gè)服務(wù)都圍繞著系統(tǒng)中的某一項(xiàng)或某一些耦合度較高的業(yè)務(wù)功能進(jìn)行構(gòu)建,并且每個(gè)服務(wù)都維護(hù)著自身的數(shù)據(jù)存儲(chǔ)、業(yè)務(wù)開發(fā)、自動(dòng)化測(cè)試案例以及獨(dú)立部署機(jī)制[3]。微服務(wù)架構(gòu)模式有非常明顯的優(yōu)勢(shì),特別是在實(shí)施敏捷開發(fā)和復(fù)雜的企業(yè)應(yīng)用交付方面[4]。
結(jié)合預(yù)約攝影平臺(tái)后端系統(tǒng)的業(yè)務(wù)情況,將單體應(yīng)用拆分為微服務(wù)后,每個(gè)服務(wù)中的類遵守單一職責(zé)原則[5],將相同職責(zé)的類放到一起,不同職責(zé)的類分解到不同的接口和實(shí)現(xiàn)類中去。一個(gè)類的職責(zé)減少,代碼少了,代碼的復(fù)雜度就降低了,隨之代碼可讀性也會(huì)提高,可維護(hù)性也會(huì)提高。根據(jù)現(xiàn)有后端系統(tǒng)的單體架構(gòu),將其改造為微服務(wù)架構(gòu)的總體架構(gòu)圖2所示,服務(wù)拆分為用戶服務(wù)、約拍服務(wù)、訂單服務(wù)、作品服務(wù)、打卡點(diǎn)服務(wù)、圖片服務(wù)、輪播圖服務(wù)、搜索服務(wù)等。
3 系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
3.1 架構(gòu)搭建
3.1.1 基本的開發(fā)環(huán)境軟件版本
3.1.2 搭建統(tǒng)一的項(xiàng)目依賴
為了方便管理各個(gè)服務(wù)的依賴,需要建立一個(gè)統(tǒng)一的項(xiàng)目依賴。將該項(xiàng)目依賴作為所有工程的父依賴,在pom.xml文件中指定properties屬性,即可統(tǒng)一管理所有項(xiàng)目的依賴版本。
3.1.3 搭建分布式配置中心
分布式配置中心采用Spring Cloud Config,該微服務(wù)組件是為分布式系統(tǒng)中的基礎(chǔ)設(shè)施和微服務(wù)應(yīng)用提供集中化的外部配置支持,由客戶端和服務(wù)端兩部分組成。其服務(wù)端是一個(gè)獨(dú)立的微服務(wù)應(yīng)用,用來(lái)連接配置倉(cāng)庫(kù),并為客戶端提供獲取配置信息,加密/解密信息的訪問接口。其客戶端則是各個(gè)微服務(wù)應(yīng)用,每個(gè)微服務(wù)應(yīng)用在配置文件中指定配置中心服務(wù)端的地址,在應(yīng)用啟動(dòng)的時(shí)候會(huì)自動(dòng)地去指定的配置中心服務(wù)端地址中加載相應(yīng)的配置信息。分布式配置中心搭建步驟如下:
1)服務(wù)端的配置
添加Spring Cloud Config項(xiàng)目依賴,新建ConfigApplication啟動(dòng)類,并在該類中添加@EnableConfigServer注解,表示啟用配置服務(wù)器,將該應(yīng)用作為配置中心服務(wù)器。在代碼托管平臺(tái)中創(chuàng)建一個(gè)倉(cāng)庫(kù),用來(lái)存放各個(gè)微服務(wù)應(yīng)用的配置文件。yml配置信息如下:
spring:
cloud:
config:
label: master
server:
git:
uri: https://gitee.com/username/repo.git
search-paths: repo
username:
password:
2)客戶端的配置
以服務(wù)注冊(cè)中心panda-eureka為例,在pom.xml中添加spring-cloud-starter-config依賴,并且在yml配置文件中添加如下配置信息:
spring:
cloud:
config:
uri: http://localhost:8888
3.1.4 搭建服務(wù)注冊(cè)與發(fā)現(xiàn)中心
服務(wù)注冊(cè)中心(service registry)是服務(wù)發(fā)現(xiàn)的一個(gè)關(guān)鍵部分。它是一個(gè)包含了服務(wù)實(shí)例網(wǎng)絡(luò)位置的數(shù)據(jù)庫(kù)。服務(wù)注冊(cè)中心必須是高可用和最新的。雖然客戶端可以緩存從服務(wù)注冊(cè)中心獲得的網(wǎng)絡(luò)位置,但該信息最終會(huì)過(guò)期,客戶端將無(wú)法發(fā)現(xiàn)服務(wù)實(shí)例。因此,服務(wù)注冊(cè)中心由使用了復(fù)制協(xié)議(replication protocol)來(lái)維護(hù)一致性的服務(wù)器集群組成[4]。
Netflix Eureka 是一個(gè)很好的服務(wù)注冊(cè)中心微服務(wù)組件。它提供了一個(gè)用于注冊(cè)和查詢服務(wù)實(shí)例的 REST API。服務(wù)實(shí)例使用 POST 請(qǐng)求注冊(cè)其網(wǎng)絡(luò)位置。它必須每隔30秒使用PUT請(qǐng)求來(lái)刷新其注冊(cè)信息。通過(guò)使用 HTTP DELETE 請(qǐng)求或?qū)嵗?cè)超時(shí)來(lái)移除注冊(cè)信息。客戶端可以使用HTTP GET 請(qǐng)求來(lái)檢索已注冊(cè)的服務(wù)實(shí)例。Eureka也有服務(wù)端和客戶端組成,服務(wù)端主要處理服務(wù)注冊(cè),客戶端處理服務(wù)的注冊(cè)與發(fā)現(xiàn)。搭建步驟如下:
1)Eureka服務(wù)端
在Eureka項(xiàng)目中添加spring-cloud-starter-netflix-eureka-server依賴,yml配置文件信息如下:
spring:
cloud:
config:
uri: http://localhost:8888
label: master
name: panda-eureka
profile: dev
2)客戶端的配置:
以用戶服務(wù)panda-service-provider-user為例,在項(xiàng)目的pom.xml文件中添加spring-cloud-netflix-eureka-client依賴,yml文件配置如下:
spring:
cloud:
config:
uri: http://localhost:8888
label: master
name: panda-service-provider-user
3)Eureka工作效果
3.1.5 搭建API網(wǎng)關(guān)
API網(wǎng)關(guān)是一個(gè)智能的應(yīng)用服務(wù)器,所有的外部客戶端訪問都需要經(jīng)過(guò)它來(lái)進(jìn)行調(diào)度和過(guò)濾。在該項(xiàng)目的預(yù)約拍照系統(tǒng)中,采用Spring Cloud Zuul作為API網(wǎng)關(guān),并將Spring Cloud Zuul與Spring Cloud EurekaI進(jìn)行整合,將Zuul注冊(cè)為Eureka服務(wù)治理下的應(yīng)用,同時(shí)從Eureka中獲得了所有其他微服務(wù)的實(shí)例信息,將維護(hù)實(shí)例的工作交給了服務(wù)治理框架自動(dòng)完成,不需要人工介入。
1)構(gòu)建網(wǎng)關(guān)
新建Zuul的Spring Boot項(xiàng)目,添加相關(guān)依賴,在啟動(dòng)類上添加@EnableZuulProxy開啟API網(wǎng)關(guān)服務(wù)功能。
2)配置請(qǐng)求路由
路由功能與Eureka結(jié)合使用,在Eureka的服務(wù)注冊(cè)與發(fā)現(xiàn)體系中,每個(gè)服務(wù)既是服務(wù)提供者,也是服務(wù)消費(fèi)者,所以作為消費(fèi)者的微服務(wù)應(yīng)用也可以作為服務(wù)提供者向路由網(wǎng)關(guān)提供服務(wù)。
下面以用戶服務(wù)提供者為例,為panda-service-provider-user配置路由。
zuul:
routes:
v1-provider-user:
path: /api/v1/user/**
上面的配置中,在zuul的routes節(jié)點(diǎn)下配置了一個(gè)路徑為/api/v1/user/的路由來(lái)映射用戶服務(wù)提供者的接口地址。路由搭建好后,通過(guò)訪問API網(wǎng)關(guān)配置的路由地址可訪問到用戶服務(wù)提供者的接口地址??梢钥吹剑厦孢@種簡(jiǎn)單的path加serviceId的映射組合,稱之為面向服務(wù)的路由配置,因?yàn)閆uul與Eureka結(jié)合使用,Zuul只需要指定serviceId,路由轉(zhuǎn)發(fā)時(shí)可以從Eureka中獲取到服務(wù)實(shí)例的地址(ip和端口),這種配置方式使得API網(wǎng)關(guān)服務(wù)可以自動(dòng)化完成服務(wù)實(shí)例清單的維護(hù),完美地解決了對(duì)路由映射實(shí)例的維護(hù)問題。
3.1.6 搭建鏈路追蹤系統(tǒng)
隨著預(yù)約拍照系統(tǒng)的開發(fā),微服務(wù)應(yīng)用越來(lái)越多,系統(tǒng)規(guī)模越來(lái)越大,各微服務(wù)間的調(diào)用關(guān)系變得錯(cuò)綜復(fù)雜,幾乎每一個(gè)前端請(qǐng)求都會(huì)形成一條復(fù)雜調(diào)用的鏈路。為解決以上問題,采用ZipKin作為服務(wù)鏈路追蹤系統(tǒng)。
1)搭建ZipKin Server
搭建Spring Boot項(xiàng)目,添加相關(guān)依賴zipkin,zipkin-server,zipkin-autoconfigure-ui。在啟動(dòng)類上添加@EnableZipkinServer注解。然后在yml配置文件中添加如下配置即可。
spring:
application:
name: panda-zipkin
main:
allow-bean-definition-overriding: true
server:
port: 9411
2)在微服務(wù)中添加ZipKin客戶端配置
以用戶服務(wù)提供者為例,在pom.xml文件中添加spring-cloud-starter-zipkin依賴,在yml配置文件中添加ZipKin Server的url配置。
spring:
zipkin:
base-url: http://localhost:9411
3.2 核心業(yè)務(wù)模塊
預(yù)約攝影服務(wù)是整個(gè)系統(tǒng)的核心業(yè)務(wù),為模特和攝影師提供預(yù)約的服務(wù),核心業(yè)務(wù)代碼如下。
3.2.1 發(fā)布預(yù)約
public int addAppointment(TAppointment appointment){
//傳遞到Dao層,并保存數(shù)據(jù)到數(shù)據(jù)庫(kù)
int i = appointmentMapper.addAppointment(appointment);
if (i != 0){
appointmentRepository.save(appointment);
}
return i;
}
上面的代碼比較簡(jiǎn)單,該代碼位于Service層,作用是將從Controller層傳過(guò)來(lái)的數(shù)據(jù)傳到Dao層,并將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)。
3.2.2 預(yù)約下單
public int addOrder(TOrder order) {
int i = orderMapper.addOrder(order);
//成功將訂單插入數(shù)據(jù)庫(kù),將消息發(fā)送到MQ
if (i != 0) {
int id = order.getId();
TOrder.MyOrder myOrder = orderMapper.getOrderAndUserAndAppointmentById(id);
//獲取約拍時(shí)間
String startDatetime = myOrder.getStartDatetime();
//約拍時(shí)間不為空的情況下執(zhí)行
if (!StringUtils.isEmpty(startDatetime)) {
int hour = 2;
//提前發(fā)送郵件提醒
Long stringDateToTimestamp = DateUtils.getStringDateToTimestamp(startDatetime);
Long remindDateTimestamp = (stringDateToTimestamp - 1000 * 60 * 60 * hour) / 1000L;
String remindDate = DateUtils.getTimestampToStringDate(remindDateTimestamp);
//短信通知
SMSNoticeJobDTO smsNoticeJobDTO = new SMSNoticeJobDTO(
myOrder.getUsername(),
myOrder.getTitle(),
"" + hour,
remindDate,
myOrder.getPhone());
String smsJsonString = JSONObject.toJSONString(smsNoticeJobDTO);
mqService.sendMessage("exchange.direct", "panda.sms", smsJsonString);
//郵件通知
String emailText = "親愛的" + myOrder.getUsername()
+ ",您預(yù)約的標(biāo)題為【" + myOrder.getTitle()
+ "】" + ",還有" + hour
+ "個(gè)小時(shí)就要開始啦,請(qǐng)做好準(zhǔn)備。祝您生活愉快?。躰【熊貓約拍】";
EmailJobDTO emailJobDTO = new EmailJobDTO(
"job_" + myOrder.getOrderNo(),
remindDate,
myOrder.getEmail(),
"約拍時(shí)間提醒",
emailText);
String emailJsonString = JSONObject.toJSONString(emailJobDTO);
mqService.sendMessage("exchange.direct", "panda.email", emailJsonString);
}
}
return i;
}
這段代碼是用戶添加預(yù)約攝影的代碼,該代碼的邏輯是如果成功將訂單插入數(shù)據(jù)庫(kù),將消息發(fā)送到消息隊(duì)列MQ,由MQ處理發(fā)送郵件和短信提醒的異步任務(wù)。
3.3 前端的實(shí)現(xiàn)
前端分為網(wǎng)站和移動(dòng)客戶端,網(wǎng)站選用了目前最火的前端框架Vue.js。Vue.js是一套用于構(gòu)建用戶界面的漸進(jìn)式框架。與其它大型框架不同的是,Vue 被設(shè)計(jì)為可以自底向上逐層應(yīng)用。Vue 的核心庫(kù)只關(guān)注視圖層,不僅易于上手,還便于與第三方庫(kù)或既有項(xiàng)目整合[6]。在移動(dòng)端上,選用了uni-app。uni-app 是一個(gè)使用 Vue.js開發(fā)所有前端應(yīng)用的框架,開發(fā)者編寫一套代碼,可發(fā)布到iOS、Android、H5、以及各種小程序[7]。使用這兩個(gè)框架,可以快速的搭建出網(wǎng)站應(yīng)用和移動(dòng)客戶端應(yīng)用。
3.3.1 網(wǎng)站前端的實(shí)現(xiàn)
addOrder(pubUid, acptUid, aptId, image = '') {
if (this.isLogin){
let param = {
pubUid: pubUid,
acptUid: acptUid,
aptId: aptId,
image: image
};
request({
url: ORDER_ADD,
method: 'post',
data: this.qsParam(param),
}).then(res => {
if (res.data.code === 1) {
this.$message.success("預(yù)約成功");
this.addedOrder = true;
}
}).catch(err => {
this.$message.error("預(yù)約失敗, 請(qǐng)稍候重試");
})
}else {
this.$message.warning("請(qǐng)先登錄");
}
}
這段代碼是前端處理添加預(yù)約攝影的邏輯代碼。通過(guò)發(fā)送網(wǎng)絡(luò)請(qǐng)求向后端發(fā)送數(shù)據(jù)。
網(wǎng)站UI的設(shè)計(jì)方面,采用餓了么公司開源的UI框架Element-UI,它提供大量常用的UI組件,結(jié)合上述三個(gè)框架,完成網(wǎng)站前端的設(shè)計(jì),網(wǎng)站主頁(yè)效果圖如圖4所示。
3.3.2 移動(dòng)客戶端的實(shí)現(xiàn)
移動(dòng)客戶端采用uni-app,移動(dòng)端跨平臺(tái)的框架。相比Vue.js框架,uni-app在vue.js的基礎(chǔ)之上,將常用的功能和組件進(jìn)行了封裝,如網(wǎng)絡(luò)請(qǐng)求、UI組件等,方便開發(fā)者快速進(jìn)行開發(fā)。移動(dòng)客戶端的效果圖如圖5所示,以u(píng)ni-app打包的Andriod APP為例。
4 結(jié)合DevOps實(shí)現(xiàn)持續(xù)集成、持續(xù)部署
DevOps是一套實(shí)踐方法,在保證高質(zhì)量的前提下縮短系統(tǒng)變更從提交到部署至生產(chǎn)環(huán)境的時(shí)間。DevOps的重點(diǎn)是通過(guò)發(fā)展創(chuàng)建一個(gè)穩(wěn)定、快速的開發(fā)工作流和IT運(yùn)維。DevOps一方面可以縮短系統(tǒng)的部署時(shí)間,另一方面可以減少系統(tǒng)的缺陷,大大提高系統(tǒng)的質(zhì)量[8]。
4.1 DevOps平臺(tái)的選擇
在IT技術(shù)快速發(fā)展的今天,已經(jīng)涌現(xiàn)出了大批的DevOps平臺(tái),前有老牌的持續(xù)集成開源項(xiàng)目軟件Jenkins,后有國(guó)內(nèi)一流的互聯(lián)網(wǎng)公司推出的DevOps平臺(tái),如阿里云的云效,騰訊的藍(lán)鯨智云,百度的效率云等等。預(yù)約拍照系統(tǒng)選擇了阿里云云效平臺(tái),由于服務(wù)器是在阿里云平臺(tái)購(gòu)買的云服務(wù)器ECS,結(jié)合阿里云云效平臺(tái),可將項(xiàng)目快速地通過(guò)云效平臺(tái)部署。
4.2 阿里云云效平臺(tái)的使用
4.2.1 創(chuàng)建項(xiàng)目和應(yīng)用
創(chuàng)建項(xiàng)目,項(xiàng)目為必創(chuàng)建項(xiàng),方便管理項(xiàng)目下的每個(gè)應(yīng)用。每一個(gè)微服務(wù)都要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的應(yīng)用。
4.2.2 創(chuàng)建鏡像倉(cāng)庫(kù)
在阿里云鏡像服務(wù)中為應(yīng)用創(chuàng)建一個(gè)專門的鏡像倉(cāng)庫(kù),用來(lái)存放流水線完成的制品。
4.2.3 創(chuàng)建并配置流水線
進(jìn)入相應(yīng)的應(yīng)用,并創(chuàng)建流水線,填寫代碼倉(cāng)庫(kù)、分支、開啟webhook,并將地址添加到代碼倉(cāng)庫(kù),配置環(huán)境,填寫部署腳本和執(zhí)行用戶,保存配置即可。
4.2.4 運(yùn)行流水線
因?yàn)閯?chuàng)建流水線時(shí)配置了webhook,所以只要提交代碼到倉(cāng)庫(kù),即可觸發(fā)webhook,使流水線自動(dòng)運(yùn)行,實(shí)現(xiàn)持續(xù)集成、持續(xù)部署。流水線運(yùn)行圖如圖6所示。
5 結(jié)束語(yǔ)
隨著互聯(lián)網(wǎng)的技術(shù)的發(fā)展,近年來(lái)微服務(wù)在應(yīng)用開發(fā)和部署方面取得了顯著的進(jìn)步。相比采用傳統(tǒng)單體應(yīng)用架構(gòu)的系統(tǒng),預(yù)約拍照系統(tǒng)后端服務(wù)結(jié)合微服務(wù)架構(gòu)、DevOps文化、持續(xù)集成與持續(xù)部署(CI/CD)和容器引擎技術(shù),將服務(wù)部署到云端,極大地提高了系統(tǒng)的開發(fā)效率和維護(hù)效率。解決了單體應(yīng)用架構(gòu)代碼臃腫、開發(fā)效率低、軟件交付時(shí)間長(zhǎng)等問題。
微服務(wù)架構(gòu)在軟件開發(fā)上主要有兩種應(yīng)用模式,其中一種是從需求分析出發(fā),從無(wú)到有地開發(fā)一個(gè)新的微服務(wù)應(yīng)用程序;另一種應(yīng)用是將已有系統(tǒng)(通常是單體應(yīng)用程序)重構(gòu)到微服務(wù)架構(gòu)[9]。目前業(yè)務(wù)還未劃分完整,下一階段就是需要結(jié)合業(yè)務(wù)場(chǎng)景和服務(wù)器資源進(jìn)行細(xì)度的劃分預(yù)約拍照系統(tǒng)的后端服務(wù),在有限的服務(wù)器資源下合理地劃分服務(wù),最大化地利用服務(wù)器資源完成業(yè)務(wù)功能,使得系統(tǒng)能夠更加高效穩(wěn)定地運(yùn)行。
參考文獻(xiàn):
[1] 劉從軍,劉毅.基于微服務(wù)的維修資金管理系統(tǒng)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2019,28(4):52-60.
[2] FOWLER M.Microservice[EB/OL].(2014-04-25)[2020-04-18].http://martinfowler.com/articles/microservices.html.
[3] 翟永超.Spring Cloud微服務(wù)實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2017.
[4] Richardson C,Smith F.微服務(wù):從設(shè)計(jì)到部署[EB/OL].Oopsguy,譯. [2020-04-18].https://github.com/DocsHome/microservices .
[5] 高松,牛治永.敏捷設(shè)計(jì)原則與設(shè)計(jì)模式的編程實(shí)踐——單一職責(zé)原則與依賴倒置原則[J].計(jì)算機(jī)應(yīng)用,2011,31(S2):149-152.
[6] 高棟,王殿勝,張思琪,等.DevOps平臺(tái)建設(shè)分析[J].中國(guó)科技信息,2019(24):39-40.
[7] vue.js中文官網(wǎng)[EB/OL].[2020-04-18]. https://cn.vuejs.org/.
[8] uni-app官網(wǎng)[EB/OL].[2020-04-18].https://uniapp.dcloud.io/.
[9] 吳化堯,鄧文俊.面向微服務(wù)軟件開發(fā)方法研究進(jìn)展[J].計(jì)算機(jī)研究與發(fā)展,2020,57(3):525-541.
【通聯(lián)編輯:謝媛媛】