黃 靜,朱 旭
(浙江理工大學信息學院,浙江 杭州 310018)
現(xiàn)代經(jīng)濟和生產(chǎn)效率的快速增長,人才在我國經(jīng)濟發(fā)展和社會進步的發(fā)展過程中起到至關(guān)重要的作用,在此過程中對專家信息的評定也越來越重要[1]。雖然政府加大了對專家信息評審的投入,但是隨著互聯(lián)網(wǎng)發(fā)展帶來的信息爆炸問題,使當前專家信息篩選過程變得越來越復雜,專家信息評定錯誤率高,難以滿足專家信息資源管理的實際應用要求,同時傳統(tǒng)的人工篩選方式工作量巨大且很難找到真正滿足國家、企業(yè)需求的人才[2]。
本文提出基于Spring Cloud的人才智庫遴選系統(tǒng),以Spring Cloud為框架,采用前后端分離的方式進行構(gòu)建;通過系統(tǒng)的業(yè)務需求將整個系統(tǒng)架構(gòu)劃分為若干個微服務模塊,保證每個服務的職責單一化,通過這種方式實現(xiàn)系統(tǒng)架構(gòu)的去中心化[3]。為了支持海量的人才數(shù)據(jù)存儲問題,每一個模塊下均有自己獨立的數(shù)據(jù)庫,同時人才與人才之間龐大又復雜的關(guān)聯(lián)關(guān)系,造成傳統(tǒng)的關(guān)系型數(shù)據(jù)庫已經(jīng)無法處理運算,由此引入了圖數(shù)據(jù)庫[4],它能提高人才檢索速度,對人才信息標簽之間的關(guān)聯(lián)關(guān)系進行構(gòu)建,使人才的遴選效率和質(zhì)量得以較大的提升。
隨著服務端架構(gòu)的不斷迭代和更新,系統(tǒng)架構(gòu)也逐漸由單體架構(gòu)演變?yōu)槊嫦蚍盏腟OA(Service-Oriented Architecture)架構(gòu),由于SOA架構(gòu)過度依賴消息總線,微服務MSA(Micro Service Architect)架構(gòu)應運而生,它也是目前使用最廣泛、最流行的分布式架構(gòu)[5]。
單體架構(gòu)也被稱為MVC(Model View Controller)架構(gòu),它由數(shù)據(jù)層、業(yè)務層和視圖層三個部分構(gòu)成。單體架構(gòu)雖然具有易上線、易測試的優(yōu)點,但是隨著需求數(shù)量和開發(fā)人員的不斷增加,代碼庫中的代碼快速增長,單體應用變得越來越臃腫,可維護性、靈活性逐漸降低,使得單體架構(gòu)的維護成為一大難題,開發(fā)成本越來越高[6]。因為所有的業(yè)務耦合在一起,會使代碼愈發(fā)復雜和冗余,同時使用人數(shù)的劇增,也會使系統(tǒng)快速達到并發(fā)瓶頸,導致系統(tǒng)崩潰。此外,代碼的耦合度較高及功能的復用,造成功能的優(yōu)化也會變得更加復雜。常見的單體架構(gòu)示意圖如圖1所示。
圖1 單體架構(gòu)示意圖Fig.1 Schematic diagram of single structure
微服務是從服務接口到業(yè)務邏輯層再到數(shù)據(jù)持久層,無論是邏輯上還是業(yè)務上都是獨立和相互隔離的,不同于SOA架構(gòu)那樣需要服務總線接入。微服務是一種系統(tǒng)架構(gòu)的理念[7],它主要是將系統(tǒng)從中間層分解,將系統(tǒng)拆分成很多個小應用,服務與服務之間獨立運行,互不影響,服務之間通過RPC(Remote Produce Call,遠程過程調(diào)用)進行通信,保證數(shù)據(jù)傳輸?shù)目煽啃?;微服務實現(xiàn)了數(shù)據(jù)、業(yè)務及代碼之間的解耦,各個微服務之間獨立開發(fā),一個微服務只關(guān)注一個特定的業(yè)務功能,所以它的業(yè)務清晰、代碼量較少。以微服務架構(gòu)搭建出的應用是由若干個微服務構(gòu)建而成的,而開發(fā)和維護單個微服務相對簡單,所以整個應用也會被維持在一個可控狀態(tài)。在微服務架構(gòu)中,不同微服務之間可以使用不同的技術(shù)棧,可以結(jié)合項目業(yè)務及團隊的特點,合理地為每個微服務選擇適用的技術(shù)。微服務架構(gòu)示意圖如圖2所示。
圖2 微服務架構(gòu)示意圖Fig.2 Schematic diagram of microservice architecture
本系統(tǒng)前后端相互分離,獨立部署。后端采用微服務的思想進行設計,每一個微服務均使用Spring Boot技術(shù),結(jié)合Spring Cloud搭建整體的微服務架構(gòu);其中,數(shù)據(jù)庫設計包含兩種類型:關(guān)系型數(shù)據(jù)庫采用MYSQL 8.0.18,用于存儲人才基礎數(shù)據(jù);非關(guān)系型數(shù)據(jù)庫采用Neo4j,用于存儲人才的標簽數(shù)據(jù)及人才之間的關(guān)聯(lián)關(guān)系。使用Redis(Remote Dictionary Server,遠程字典服務器)作為系統(tǒng)的數(shù)據(jù)緩存,前端使用Vue.js進行平臺的搭建。
Spring Boot[8]是一個基于Java的開源框架,它可以幫助我們快速地搭建起一個微服務應用。傳統(tǒng)的SSH(Struts,Spring,Hibernate)、SSM(Spring,SpringMVC,MyBatis)等架構(gòu)開發(fā)復雜臃腫、耦合度高,Spring Boot大大簡化了服務端開發(fā)過程,并提供了一套完整的解決方案。Spring Boot基于Spring 4.0設計,在Spring原有的優(yōu)秀特性基礎上,新增了自動化配置,通過提供一組依賴項解決大型項目依賴管理的問題。
Spring Cloud[9]是分布式服務治理框架。Spring Boot能夠快速開發(fā)單個微服務,Spring Cloud能夠快速集成多個微服務,將微服務系統(tǒng)構(gòu)架很好地應用到實際的應用開發(fā)中。使用Spring Cloud架構(gòu)可以保證各個微服務之間有條不紊地協(xié)作,如利用“阿里巴巴”的Nacos實現(xiàn)高可用的服務注冊中心及服務的配置管理等;為了使分布式系統(tǒng)更健壯,對依賴的服務使用Spring Cloud Hystrix(分布式服務容錯保護)進行包裝,通過線程隔離和熔斷機制為系統(tǒng)的可用性保駕護航。系統(tǒng)還加入了網(wǎng)關(guān)服務組件Gateway用于請求的轉(zhuǎn)發(fā)和服務集群的負載均衡。
Redis[10]是一個高可用的緩存中間件。Redis的優(yōu)秀特性不僅體現(xiàn)在讀寫速度上,同其他非關(guān)系型數(shù)據(jù)庫相比,它還支持除字符串以外的多種數(shù)據(jù)結(jié)構(gòu),如列表、集合、哈希散列表等。Redis通常將全部的數(shù)據(jù)存儲在內(nèi)存中,性能十分高效,理論上擴展沒有上限;由于它具有高并發(fā)的讀寫能力,所以在面對海量人才數(shù)據(jù)傳輸讀取時,仍然能夠輕松應對。
Neo4j[11]是一個高性能的圖形數(shù)據(jù)庫,具有高性能的圖引擎,這使得它具了所有成熟數(shù)據(jù)庫的特性。Neo4j是一種基于圖論實現(xiàn)的高性能非關(guān)系型數(shù)據(jù)庫,其數(shù)據(jù)存儲結(jié)構(gòu)和數(shù)據(jù)查詢方式都是以圖論為基礎的,圖數(shù)據(jù)庫主要用于存儲更多的連接數(shù)據(jù)。隨著人才信息的增多,人才標簽的復雜化,人才與標簽之間和人才與人才之間的聯(lián)系在基于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫下很難處理關(guān)系運算,因此引入圖數(shù)據(jù)庫。
Vue.js[12]基于漸進式JavaScript框架,可以幫助開發(fā)者快速高效地構(gòu)建用戶界面。Vue.js因為被設計為可以自底向上逐層應用,所以使它與其他大型框架有了明顯的區(qū)分。Vue.js只關(guān)注視圖層,使其不僅易于上手,還能方便地與第三方庫或既有項目整合。當與現(xiàn)代化的工具鏈及各種支持類庫結(jié)合使用時,Vue.js也完全能夠為復雜的單頁應用(SPA)提供驅(qū)動。
基于Spring Cloud的人才智庫遴選系統(tǒng)的總體架構(gòu)圖,如圖3所示。
圖3 系統(tǒng)總體架構(gòu)圖Fig.3 Overall architecture diagram of the system
本系統(tǒng)設計主要分為四個部分,具體如下。
(1)數(shù)據(jù)庫、Redis緩存:本系統(tǒng)將用戶信息、人才信息、標簽信息、人才基礎數(shù)據(jù)(如頂級實驗室數(shù)據(jù)、人才標準、國籍信息、地區(qū)產(chǎn)品導向等)存儲至MySQL數(shù)據(jù)庫中,便于進行人才信息匹配和人才信息過濾??紤]到人才之間的關(guān)聯(lián)關(guān)系及人才關(guān)鍵信息的檢索,將人才匹配成功后的標簽數(shù)據(jù)和標簽與人才、標簽與標簽的聯(lián)系存儲至Neo4j數(shù)據(jù)庫。在人才標簽匹配時,由于人才信息量較大,涉及標簽信息數(shù)量較多,所以將人才的數(shù)據(jù)更新至緩存,從數(shù)據(jù)庫匹配出的數(shù)據(jù)也暫存至緩存,待將人才類型匹配結(jié)束之后才清空緩存,達到減少與數(shù)據(jù)庫的交互,進而提高系統(tǒng)的并發(fā)能力和人才標簽匹配效率的目的。同時,本系統(tǒng)的身份校驗基于JWT(JSON Web Token,網(wǎng)絡令牌),所以在每次獲取數(shù)據(jù)請求時進行的身份認證也會先訪問緩存,若緩存中沒有用戶登錄狀態(tài),則視為無效登錄,禁止訪問系統(tǒng)數(shù)據(jù)。由于系統(tǒng)有部分關(guān)鍵功能依賴于緩存,所以為了避免緩存穿透、緩存擊穿、緩存雪崩等問題,在人才數(shù)據(jù)上加上數(shù)據(jù)的預處理,即上傳人才數(shù)據(jù)時會先進行布隆過濾,同時是用分布式鎖避免緩存擊穿;緩存雪崩的主要原因是大批數(shù)據(jù)在同一時間過期導致,故在設置人才信息時,不設置過期時間,當人才信息評定完成之后再手動進行刪除。
(2)服務端:將服務端根據(jù)業(yè)務需求劃分為若干個微服務模塊,保證每個服務職責單一,各司其職,同時依靠Spring Cloud提供的組件保證各個微服務模塊的正常運行,如系統(tǒng)的統(tǒng)一訪問入口Gateway,配置和注冊中心Nacos,服務之間的通信Openfegin,服務的限流Sentinel等。整個系統(tǒng)的功能模塊劃分為用于每個服務統(tǒng)一身份認證的身份認證服務模塊,用于人才簡歷文件預覽、簡歷上傳等專門用于文件處理的文件服務模塊,用于處理獎項、學歷、企業(yè)經(jīng)歷、國家級項目的基礎信息模塊,用于篩選、錄入、上傳人才信息的人才智庫模塊,用于人才類型評定、標簽匹配和打分的人才標簽評定模塊,用于保存人才與人才之間的關(guān)聯(lián)關(guān)系和通過關(guān)鍵詞檢索人才數(shù)據(jù)的人才推薦模塊。每個模塊下都有自己對應的數(shù)據(jù)服務和數(shù)據(jù)管理。
(3)分布式事務:由于本系統(tǒng)一個功能的實現(xiàn)需要多個模塊之間的協(xié)調(diào)才能實現(xiàn),因此不同的微服務模塊都有自己的數(shù)據(jù)庫,此時就會出現(xiàn)一個服務必須調(diào)用多個服務下的數(shù)據(jù)庫實例才能完成的情況。在分布式架構(gòu)下,每個節(jié)點只知曉自己操作失敗或者成功的狀態(tài),無法得知其他節(jié)點的狀態(tài)。本系統(tǒng)基于RabbitMQ(高級消息隊列)實現(xiàn)可靠的消息服務,解決服務間通信問題和不同微服務之間的事務問題。
(4)系統(tǒng)前端設計:本系統(tǒng)前端主要采用Vue.js框架,并配合Element-UI(桌面端組件庫)和ECharts(商業(yè)級數(shù)據(jù)圖表)實現(xiàn)良好的人機交互頁面,通過數(shù)據(jù)的圖表實現(xiàn)人才數(shù)據(jù)分析的可視化效果。
本系統(tǒng)數(shù)據(jù)庫采用MySQL 8.0.18和Neo4j兩種不同類型的數(shù)據(jù)庫。由于Neo4j為圖數(shù)據(jù)庫,不同于關(guān)系型數(shù)據(jù)庫,它不需要事先預定行列規(guī)范,所以在此不介紹Neo4j的設計,下面對MySQL數(shù)據(jù)庫中部分表的結(jié)構(gòu)設計進行說明。其中,人才基礎信息數(shù)據(jù)庫表結(jié)構(gòu)如圖4所示,人才基礎信息數(shù)據(jù)庫里包含人才所對應的基礎標簽數(shù)據(jù),其中專家?guī)?tb_profession)包含人才的姓名、年齡及系統(tǒng)匹配后人才類型等;其余的表皆為專家?guī)斓淖颖?,包含人才的詳細信息?shù)據(jù),如教育經(jīng)歷(education)、個人頭銜(personal_title)、人才標準(tb_standard)、個人經(jīng)歷(experience)、專利(patent)及導師信息(tutor)等。
圖4 人才基礎信息數(shù)據(jù)庫表結(jié)構(gòu)圖Fig.4 Structure diagram of basic information database table of talents
圖5為人才標簽評定數(shù)據(jù)庫表結(jié)構(gòu)圖,其中標簽庫(tb_tag)包含所有需要匹配的標簽數(shù)據(jù),通過條件庫(query_criteria)及條件關(guān)聯(lián)庫(query_criteria_association)匹配用戶的人才遴選類型,將匹配后的標簽分值及結(jié)果保存至人才標簽表(profession_tag),同時將人才的遴選結(jié)果同步更新到人才基礎信息數(shù)據(jù)庫的專家信息表中。
圖5 人才標簽評定數(shù)據(jù)庫表結(jié)構(gòu)圖Fig.5 Structure diagram of tag assessment database table of talents
4.3.1 微服務框架設計
本系統(tǒng)基于Spring Cloud架構(gòu)進行搭建,當接口對服務端發(fā)起請求時,每個請求都必須先經(jīng)過網(wǎng)關(guān),然后由網(wǎng)關(guān)將請求進行統(tǒng)一的轉(zhuǎn)發(fā)。本系統(tǒng)的服務端網(wǎng)關(guān)采用的是Spring Cloud全家桶中的微服務API網(wǎng)關(guān)Gateway[13]。Gateway不僅提供了統(tǒng)一的路由方式,還實現(xiàn)了網(wǎng)關(guān)的基本功能,如網(wǎng)絡請求安全、數(shù)據(jù)請求監(jiān)控及服務的限流等。
由于不同微服務可能不在同一臺服務器上,甚至不在同一網(wǎng)絡環(huán)境下,所以服務間的通信只能依賴于網(wǎng)絡,而Openfegin則實現(xiàn)了不同服務之間的數(shù)據(jù)調(diào)用。為了防止服務雪崩,本系統(tǒng)還引入了Spring Cloud Hystrix實現(xiàn)熔斷機制,當系統(tǒng)某個服務發(fā)生故障或異常時,會直接熔斷服務,而不是一直等待該服務超時[14]。
由于模塊劃分較多,配置繁雜和冗余,為了解決配置文件相對分散、配置文件無法區(qū)分環(huán)境及配置文件無法實時更新等問題,引入基于Nacos的配置中心,各個服務按需獲取自己的配置。與Spring Cloud Eureka(分布式注冊中心)不同,Nacos不需要引入額外的組件如Spring Cloud Bus(分布式消息總線)等實現(xiàn)配置的動態(tài)刷新,Nacos采用Netty保持Tcp(傳輸控制協(xié)議)的長連接實現(xiàn)實時推送,當配置中心的各種參數(shù)有更新時,也能通知各個服務實時同步最新的信息,實現(xiàn)動態(tài)更新。
服務注冊與發(fā)現(xiàn)中心采用的也是Spring Cloud Alibaba Nacos(阿里巴巴分布式注冊中心)[15],Nacos不僅具備良好的圖形化界面和服務在線管理,還極大地簡化了整個微服務架構(gòu)的復雜度和冗余度。
4.3.2 微服務功能設計
根據(jù)人才智庫遴選流程,將系統(tǒng)劃分為身份認證模塊、基礎數(shù)據(jù)模塊、人才標簽評定模塊、人才智庫模塊、人才推薦模塊。
(1)身份認證模塊。身份認證模塊主要分為用戶信息管理和身份信息校驗兩個功能。用戶信息管理即對登錄用戶的姓名、密碼、郵箱、角色等進行管理;身份信息校驗會攔截所有需要身份校驗的請求,并對其中的JWT信息進行校驗,包含登錄信息、角色權(quán)限的校驗,只有校驗成功才可以繼續(xù)訪問接口。
(2)基礎數(shù)據(jù)模塊?;A數(shù)據(jù)模塊為其他微服務模塊提供了基礎的數(shù)據(jù)支持,由于每個模塊之間的數(shù)據(jù)有耦合,所以把耦合部分提取出來作為公共服務模塊,如在錄入人才數(shù)據(jù)時需要國籍列表、獎項列表、頂級實驗室列表等數(shù)據(jù),但是在進行人才標簽匹配時也需要這些數(shù)據(jù)做比對,此時通過一個單獨的微服務將這些數(shù)據(jù)統(tǒng)一進行管理。
(3)人才標簽評定模塊。該模塊為系統(tǒng)的核心業(yè)務模塊,主要負責人才數(shù)據(jù)的標簽匹配、判斷人才的類型、對人才評分等操作。如圖6所示的國家“千人計劃”(全稱為國家海外高層次人才引進計劃)人才評定流程。
圖6 國家“千人計劃”人才評定流程圖Fig.6 Flow chart of talent evaluation of the national"Thousand Talents Program"
(4)人才智庫模塊。該模塊主要負責人才信息的導入、人才信息的存儲、人才信息的顯示、人才信息的統(tǒng)計等。系統(tǒng)將人才信息錄入或?qū)胫?,首先將人才信息保存至緩存,然后調(diào)用人才標簽評定模塊進行人才類型評定,最后將評定結(jié)果更新至人才智庫。
(5)人才推薦模塊。該模塊負責將人才與標簽、人才與人才之間構(gòu)建聯(lián)系,用于后期通過關(guān)鍵字檢索人才信息,以及通過特定條件進行人才的推薦等。人才智庫模塊中錄入的數(shù)據(jù)會傳輸?shù)饺瞬磐扑]模塊,人才推薦模塊會將人才信息和相應的標簽建立聯(lián)系,也會通過標簽建立人才與人才之間的聯(lián)系。
本文通過Spring Cloud、Neo4j、Vue.js等相關(guān)開發(fā)技術(shù)設計并實現(xiàn)了基于Spring Cloud的人才智庫遴選系統(tǒng),最終設計出能夠通過人才信息進行人才標簽類型的匹配及人才類型遴選的可視化系統(tǒng)。目前,該系統(tǒng)已經(jīng)在一家企業(yè)使用,經(jīng)過一段時間的數(shù)據(jù)追蹤和使用評價,確定該系統(tǒng)能夠滿足企業(yè)對人才遴選和人才標定的需求,在人才信息的評定和評估領域具有較大的應用價值。