天天看點

論雲原生架構及其應用摘要正文總結

  聲明:本文為本人2020軟考系統架構設計師考試中所寫論文(52分)的回憶版本,不保證内容的原創性與正确性,僅供參考,請勿照抄和用于學術論文等正規場合,因不當使用産生後果一律自負。

摘要

  2019年3月,我機關聯合某高校研發了《程式線上評測比賽考試系統》。系統以程式代碼線上送出自動評測功能為核心,分為題庫子產品、評測機子產品、實驗作業子產品、考試子產品、比賽子產品、抄襲判定子產品、使用者管理子產品等,支援對接教務平台。在項目中我擔任系統架構師,負責架構設計工作。

  本文以該系統為例,主要論述了雲原生架構在項目中的具體應用。系統以Spring Cloud微服務架構開發,分為前端Web服務、平台保障服務、業務服務三部分。前端Web服務由負載均衡與伺服器叢集結合,實作高并發的前台界面;平台保障服務以Eureka為中心,由API網關、服務注冊中心、監控平台等構成,實作基礎服務架構;業務服務劃分為多個微服務,基于Docker容器,協同工作實作具體業務功能。最終系統順利上線,獲得使用者一緻好評。

正文

  筆者在一個專為高校建設計算機專業智能教學一體化平台的機關任職,過往成果有《計算機組成原理仿真實驗系統》等。2019年3月,我機關聯合某大學研發了《程式線上評測比賽考試系統》項目(以下簡稱為“OJ系統”),以取代原有傳統的程式設計上機考試平台。

  系統以程式代碼的線上送出自動評測功能為核心,主要分為題庫子產品、評測機子產品、實驗作業子產品、考試子產品、比賽子產品、抄襲判定子產品、使用者管理子產品等。題庫子產品主要負責試題和測試用例的管理,使用者根據試題要求編寫程式代碼送出到系統,系統将測試用例與程式代碼發送給評測機子產品,由評測機自動編譯、執行、判分,并将結果發送給其他相關子產品進行統計;實驗作業子產品用于線上布置作業,從題庫中選取試題,設定截止日期等要求;考試子產品用于學生線上考試,按教師預先設定的參數自動從題庫随機抽題生成試卷,以及向教務平台上傳考試成績;比賽子產品主要用于ACM競賽的教育訓練;抄襲判定子產品用于鑒定代碼與他人代碼雷同率;使用者管理子產品負責使用者資訊的管理。在這個項目中,我擔任了系統架構師的職務,主要負責系統的架構設計相關工作。

  雲原生架構以微服務和容器技術為代表,有服務化、強韌性、可觀測性和自動化四類設計原則。通過服務化的設計原則,應用被分解為多個服務,可分别選擇不同的技術,單個服務子產品很容易開發、了解和維護,無需協調其他服務對本服務的影響;通過強韌性的設計原則,微服務可以分布式雲化部署,負載均衡管理請求的分發,避免單機失敗對整體服務的影響,以及彈性調整資源容量;通過可觀測性的設計原則,能夠對系統進行健康檢查、名額監控、日志管理和鍊路追蹤,提高系統運維、管理和排錯能力;通過自動化的設計原則,可實作系統的自動化部署、自動化擴充伸縮、自動化運維、持續傳遞和內建,有效減少人工操作的工作量。

  OJ系統基于Spring Cloud微服務架構開發,将平台服務劃分為三類,分别為前端Web服務、平台保障服務、業務服務。下面針對這三類服務展開具體說明。

1. 前端Web服務

  前端Web服務主要提供給使用者使用的界面,分為前置Nginx負載均衡伺服器、前端網站Nginx叢集。當使用者通過網絡通路系統時,首先會通路到前置的Nginx負載均衡伺服器,負載均衡伺服器會将請求轉發到前端網站的Nginx叢集,前端網站通過發起http請求來和後端互動,具體是通過Ajax方式來調用後端REST API接口。使用者通路網站通過前置的Nginx負載均衡伺服器來轉發到前端網站叢集,以起到将使用者請求進行分流的作用。目前端網站叢集中的部分服務發生故障時,系統仍可正常地對外提供服務。前置Nginx負載均衡伺服器使用軟體反向代理的方式來實作負載均衡,部署為路由模式,系統内部網絡與外部網絡分屬于不同的邏輯網絡,以實作系統内部與外部網絡的隔離。在負載均衡算法的選擇上,使用最小連接配接法,每當使用者的請求來臨時,任務分發單元會将任務平滑配置設定給最小連接配接數的前端網站節點,這樣的架構以廉價且透明的方式擴充了伺服器和網絡的帶寬,可以大大提升系統的并發量,同時保證網站前端整體的穩定性和可靠性。

2. 平台保障服務

  平台保障服務用以實作後端微服務的基礎架構,包括API路由網關、服務注冊中心、服務監控元件。API網關收到前端的請求,不會直接調用後端的業務服務,而是首先會從服務注冊中心根據目前請求來擷取對應的服務配置,随後通過服務配置再調用已注冊的服務。當後端微服務存在多個執行個體時,将采取負載均衡的方式調用。服務注冊中心是整個雲原生架構體系的核心部分,由Spring Cloud的Eureka元件來實作,專門提供微服務的服務注冊和發現功能,涉及三種角色:服務提供者、服務消費者和服務注冊中心。API路由網關、所有業務服務,以及服務監控平台元件都注冊到服務注冊中心。通過服務注冊中心兩兩互相注冊、API路由網關向服務注冊中心注冊多個執行個體等方式,來實作後端整體服務的高可靠性。服務監控平台通過注冊到服務注冊中心,擷取所有注冊到服務注冊中心的後端業務服務,進而監控到所有後端業務服務的運作狀态資訊,最後收集并展示整個微服務系統的運作狀态,更進一步保證整個後端的服務品質。

3. 業務服務

  業務服務按功能子產品,相應劃分為題庫服務、評測機服務、考試服務、比賽服務、抄襲判定服務等。各服務單獨打包,基于Docker容器,連同運作環境一起封裝,根據實際情況可在一台或多台實體機同時部署多個執行個體,服務啟動後會将自身資訊注冊到服務注冊中心。服務間協同工作,通過松耦合的服務發現機制,動态調用對方REST API接口。對于壓力較大的服務,如評測機服務、抄襲判定服務等,将部署為多執行個體叢集。以線上考試功能為例,使用者進入考試時,考試服務核驗考生資訊通過,調用題庫服務,題庫服務傳回試題,由考試服務組合成試卷,傳回前端顯示。使用者交卷時,送出的程式代碼到達考試服務,考試服務拆分後分發給題庫服務,題庫服務将程式代碼和測試用例送入MQ隊列排隊。然後由負載均衡機制,依次将隊列中待評測程式分發給評測機服務編譯、執行、判分,完成評測後,題庫服務統計試題通過率,考試服務統計成績并向前端顯示。在此期間服務請求者無需了解其他服務對資料如何具體處理和分析。

總結

  系統自2019年10月正式上線已運作一年有餘,在學校的日常教學考試和競賽教育訓練中投入使用,至今已有3000名以上的學生使用者,評測了70000份以上的程式代碼,獲得了機關同僚上司和學校教師們的一緻好評。在開發和試運作過程中,主要遇到了兩個問題。一是跨域問題。OJ系統前後端分離,前端通過Ajax通路後端服務。由于浏覽器同源政策的限制,導緻前端UI無法正常通路不同端口和IP的後端服務。我們利用Spring Boot後端的Cors跨域機制解決了該問題。二是評測機當機問題。評測機服務需要執行使用者送出的代碼,部分使用者短時間内送出了大量不安全代碼,導緻評測機叢集中所有執行個體全部當機。我們引入心跳機制、快照復原機制,以及基于機器學習技術的預判斷機制,使評測機當機時能夠在10秒内自動重置恢複運作,最終解決了該問題。

  實踐證明,OJ系統項目能夠順利上線,并且穩定運作,與系統采用了合适的架構設計密不可分。經過這次雲原生架構的方法和實施的效果後,我也看到了自己身上的不足之處,在未來還會不斷更新知識,完善本系統在各方面的設計,使整個OJ系統能夠更加好用,更有效地服務于高校師生。

繼續閱讀