代立晨,王 晨
(中南民族大學計算機科學學院,湖北武漢 430074)
在“依法治國”戰略大力推行和5G 時代來臨的大背景下,將法律服務從線下搬到線上是一個趨勢。習近平總書記強調,律師隊伍是依法治國的一支重要力量,要求切實加強律師工作和律師隊伍建設[1]。但長期以來,我國居民習慣于以聽廣播、看電視的形式獲取法律相關知識,以線下前往律師事務所咨詢律師的方式獲得專業的法律服務,這些方式往往效率低下,不利于律師與客戶的前期溝通。在線律師網站可以加強律師與普通用戶的溝通,有助于“依法治國”戰略的實施,也有助于律師隊伍在實戰中加強自身素養。
文獻[2]提出建設多元便捷的公共法律平臺,以滿足人民群眾對于專業法律知識和法律服務的需求;文獻[3]論述了在線法律服務應該遵循的法律規制,闡明了在線律師網站需要遵守的政策要求。現存的在線律師網站多為單體應用架構,所有的功能打包在同一個項目文件下,模塊之間的邊界模糊、耦合度高。并且,單體應用一且修改便只能作為一個整體去擴展,無法根據業務需求進行靈活伸縮。李春陽等[4]設計并實現了一種基于微服務架構的統一應用開發平臺,并成功在國家電網多個項目中投入使用;楊巍等[5]研究了基于微服務架構的圖書館業務系統,并成功在深圳大學圖書館投入運營和使用。這些基于微服務架構的系統迅速在其應用場景下發揮了微服務靈活伸縮、敏捷開發、快速部署的優勢。
但是,已有研究中對于如何將微服務與中小型應用網站有機結合的例子并不多,特別是對于如何將在線律師服務與微服務架構網站有機融合的研究還存在不足。本文將在線法律服務和微服務架構軟件設計思想有機結合,設計并實現了一個基于微服務架構的在線律師網站,對于中小型應用網站根據自身應用場景進行重構有一定借鑒價值。
2012 年以來,以綠狗網和律云網為代表的新型在線法律服務網站迅速崛起,其依托電子商務平臺,通過互聯網和移動互聯網的布局,為消費者購買法律服務提供了新的渠道。浙江省司法廳于2015 年開始建設浙江公共法律服務網[2],順應了時代規律和發展潮流,滿足了用戶需要。在線法律服務的迅猛發展對于降低律師服務收費和培養消費者通過法律途徑解決問題的習慣十分有利,與建設社會主義法治國家的目標相呼應[3]。
2017 年,國家電網公司針對龐大業務系統,以及復雜的開發及維護,提出了基于微服務架構的統一應用開發平臺,將微服務架構引入國家電網日常的業務系統中[4]。2020 年,深圳大學基于微服務架構重構了新一代的圖書館服務平臺[5],取得了非常好的效果。越來越多的開發者和公司開始使用微服務的概念[6],微服務架構是一種將單個應用程序分解為一系列可獨立運行的小服務的軟件架構,這些服務實現獨立的業務邏輯,可獨立部署,并通過輕量級協議進行通信,可以用不同的編程語言編寫并采用不同的存儲技術[7]。微服務具有低成本擴容、彈性伸縮、適應云環境的優勢。
構建一個Web 服務的后端有多種選擇,最常見的是PHP、ASP.NET 和Java。根據TIOBE 編程語言排行榜的數據,從2002 年 到2020 年,傳 統Web 后端開發語言PHP 和ASP.NET 的熱度一直呈緩慢下降趨勢,而Java 語言的流行程度呈急速上升趨勢,足以證明Java 作為Web 后端開發語言的優越性已經得到了全世界開發者的認可和選擇,如圖1 所示。
而作為Web 應用的前端部分,當前市面上還是大多數采用Html+CSS+JavaScript 的傳統開發方式[8],這種開發方式代碼耦合度高、開發周期長、層次之間不夠清晰,向后端服務器發起網絡請求也比較復雜。傳統的Web 應用開發技術已經不能滿足用戶對于豐富網頁形式和富媒體信息的需要[9]。現在主流的Web 框架為Vue.js,React 和Angu?lar.js,其并稱為“前端三大框架”。其中,Vue.js 于2014 年由在美國讀大學的學生尤雨溪發布。Vue.js 是一套構建用戶界面的漸進式框架,不但性能優異,最重要的是其比其他兩個前端框架更加簡單易學,降低了學習成本和開發成本,非常適合中小型應用網站開發。

Fig.1 TIOBE programming community index圖1 TIOBE 編程社區指數
以微服務架構重構現有的在線律師網站,不僅要從底層架構思想對現有技術進行重構,還要尋找適合開發應用網站的前后端開發語言和開發框架,將其進行有機整合。經過比較,本系統選擇Java 語言作為后端開發語言,使用企業級開發框架SpringBoot 結合SpringCloud 微服務相關技術,選擇Vue.js 作為前端開發框架,將現有的在線律師網站從架構思想到開發語言、從后端到前端,進行全面重構。
律師管理系統設計并完成后,由運營人員操作后臺管理系統并對數據進行管理,Web 端主要負責展示數據,可滿足用戶以下4 個方面的要求:
(1)找律師。用戶通關短信驗證碼注冊登陸普法律師網后,可以瀏覽網頁,尋找感興趣的律師進行在線咨詢,咨詢法律相關問題。
(2)學法律。用戶可通過普法律師網的“公開課”頁面,觀看律師上傳的普法視頻,在線學習法制相關知識。
(3)觀案例。用戶可通過瀏覽網頁查看相關案例的判決結果和律師對于該案例的專業分析。
(4)看熱點。普法律師網會在網站上及時發布并更新近期新聞媒體報導的法制新聞熱點。
普法律師網是一個B2C 架構的法制綜合平臺,集找律師、學法律、觀案例、看熱點等多種功能于一身,其分為前臺用戶系統和后臺運營平臺。具體設計如圖2 所示。
根據系統需求分析,普法律師網主要服務于律師和注冊用戶,由于律師的專業性,要求律師線下將相關資料和證件信息提交給系統運營人員進行審核。系統運營人員審核律師提交的材料,在后臺管理系統對官網信息進行及時更新,普通注冊用戶和律師登陸官網使用本網站提供的相關服務。通過上述分析,普法律師網的用戶可分為以下幾類:
(1)系統管理員。主要負責后臺管理系統操作、律師信息審核、系統律師管理、課程分類管理、公開課管理、內容管理等。

Fig.2 System function architecture圖2 系統功能架構
(2)注冊用戶。注冊用戶分為普通用戶和律師。普通用戶可以瀏覽律師的個人頁面、觀看公開課視頻、瀏覽案例信息和熱點信息、向律師發起咨詢;律師可以在官網上回復用戶留言,上傳公開課視頻等。
前端主要用于用戶交互和數據展示,后端主要負責接收前端的請求,并迅速作出響應。前端分為官網和后臺管理系統,其主要分工和使用到的技術有所不同。Web 端主要面向非系統管理員角色,用戶在注冊成功并登錄官網后,可以使用系統提供的服務。
后臺管理系統主要面向系統運營人員,系統運營人員可以對數據庫的數據進行增刪改查操作,并對Web 端頁面的展示數據進行及時管理和更新。
后端對Web 端和后臺管理系統的請求及時作出響應,并保證整個系統運行的穩定性。
2.2.1 前端設計
前端主要分為表現層和服務層。
(1)表現層使用HTML5 和CSS3 設計網站頁面,使用AJAX[10]向服務端API 發起異步請求,AJAX 通過JavaScript腳本向服務端發起請求,使網頁實現異步更新,這意味著可以在不重新加載整個網頁的情況下,只對當前網頁需要更新的部分進行更新;表現層使用開源可視化圖表庫ECharts 進行圖表繪制。
本系統服務層還針對百度、搜狗等做了搜索引擎優化(Search Engine Optimization,SEO)[11],使開發的網站有更大的概率在百度等流量入口獲得更高的排名,有助于幫助網站獲取更高的人氣和流量。
(2)前端表現層主要包括前端代碼的運行環境Node.js、前端框架Vue.js,使用簡潔易用且高效的http 庫Axios 發送網絡請求,其中官網部分使用基于Vue.js 構建的框架Nuxt.js 進行開發,Nuxt.js 是一個基于Vue.js 的輕量級應用框架。傳統網站每次加載一個新的頁面便要向系統請求一個新的資源,給后臺服務器造成了很大壓力。Nuxt.js 通過服務器端渲染(SSR),代碼結構分層清晰,支持網站資源熱加載,降低了網站開發難度和加載時間,具有非常好的用戶體驗。前端項目開發完成后,使用webpack 進行項目的打包和發布。具體設計如圖3 所示。

Fig.3 Front-end hierarchy圖3 前端層次結構
2.2.2 后端設計
后端主要分為業務層、用戶層、服務層、并發層和存儲層5 個層次。
(1)業務層引入了阿里云的第三方服務,主要包含阿里云視頻點播服務(Video on Demand,VOD)、阿里云對象存儲服務(Object Storage Service,OSS)、阿里巴巴的開源ex?cel 文件處理框架EasyExcel、阿里云短信服務(Short Mes?sage Service,SMS)。
(2)用戶層主要對用戶進行認證和授權,采用開放授權協議的第二版OAuth2(Open Authorization,OAuth)進行微信登錄[12],使用單點登錄(Single Sign On,SSO)技術,用戶只需登錄一次,便可以訪問系統中的多個服務模塊。登錄時,使用基于token 的鑒權機制JWT(Json Web Token,JWT)[13]將用戶登錄的賬戶名和密碼進行加密,保證用戶賬戶安全。
(3)服務層使用Nacos 對多個微服務模塊進行統一管理和遠程配置,后臺系統的消息傳遞使用遵守高級消息隊列協議(Advanced Message Queuing Protocol,AMQP)的開源消息中間件RabbitMQ。
(4)開發層選用了當下最為流行的Java 開發框架SpringBoot2.2 和SpringCloud,SpringBoot,可以大大簡化Java應用搭建和開發步驟。
SpringCloud 作為微服務系統架構的一站式解決方案[14],提供了諸如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等功能,SpringCloud 提供了一套簡易的編程模型,使得程序能在SpringBoot 的基礎上輕松地實現微服務項目構建。
為了簡化Java 應用程序對數據庫的操作,還引入了Mybatis Plus 作為引用的持久層框架。Mybtis Plus 在Myba?tis 的基礎上進行優化,只需進行簡單配置,即可快速進行單張數據庫表格的增查改刪操作,可以節省大量時間,My?batis Plus 還集成了大量插件,可以實現數據分頁查詢、字段自動填充、邏輯刪除等常用功能。
(5)項目的存儲層選用了開源流行的MySQL 數據庫以存儲大部分數據。為了增強系統運行速度和用戶體驗,引入非關系型數據庫Redis 作為項目的緩存數據庫[15],Redis數據庫是一款基于內存的高性能數據庫,可以對關系型數據庫起到很好的補充作用。后端設計如圖4 所示。

Fig.4 Back-end hierarchy圖4 后端層次結構
2.2.3 數據庫設計
MySQL 數據庫設計遵循阿里巴巴出版的《碼出高效:Java 開發手冊》[16]中定義的MySQL 數據庫建表規約,其中主要遵循了以下原則:
(1)表必備 三字段:id、gmt_create、gmt_modified。其中,id 必為主鍵。gmt_create、gmt_modified 的類型均為da?tetime 類型,前者現在時表示主動創建,后者過去分詞表示被動更新。
(2)表達是與否概念的字段,必須使用is_xxx 的方式命名,數據類型是unsigned tinyint(1 表示是,0 表示否)。本系統考慮到數據備份的需要,使用邏輯刪除處理刪除請求,數據庫中邏輯刪除字段命名為is_deleted。即用戶向后臺發出刪除數據請求時,只是將需要刪除的數據中的is_deleted 字段更新為true,即只對數據作update 操作,不作delete 操作。而在作select 操作進行查詢時,補充查詢條件邏輯刪除字段為false,這樣既滿足了系統數據備份和對數據的保護,也滿足了查詢和刪除請求。
(3)不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。外鍵與級聯更新適用于單機低并發,不適合分布式、高并發集群;級聯更新是強阻塞,存在數據庫更新風暴的風險;外鍵影響數據庫的插入速度。本系統通過添加冗余字段和對表作切割處理的方式,不使用外鍵和級聯,以免外鍵和級聯影響到數據查詢和數據插入速度。
Redis(Remote Dictionary Server,Redis),即遠程字典服務,是一個開源的使用ANSI C 語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value 數據庫,并提供多種語言的API[17]。SpringBoot 對Redis 數據庫也進行了封裝,實現了很好的支持。當用戶第一次訪問首頁時,從MySQL數據庫中查詢數據,并實現主從同步,將MySQL 中查詢出的數據封裝為對象,再將MySQL 數據庫的數據序列化為Redis 數據庫的鍵值對形式進行同步存儲。當用戶第二次訪問首頁時,即可直接從Redis 數據庫中進行查詢,具體如圖5 所示。

Fig.5 Cache design principle圖5 緩存設計原理
Redis 數據庫主要應用于以下使用場景:
(1)全頁面緩存。因官網采用服務器端渲染,雖然減少了Web 端的網絡請求次數,但是若為每個請求都重新渲染頁面,會給服務器造成很大的壓力。因此,使用Redis 將首頁“廣告Banner”,“熱門律師”和“熱門公開課”模塊緩存起來,可以極大加快首頁加載速度。
(2)“Session”存儲。當訪問服務器某個網頁時,會在服務器端的內存里開辟一塊內存,這塊內存就叫作Session,而該內存是跟瀏覽器關聯在一起的。因Redis 具有緩存數據持久化的能力,將“Session”存儲在Redis 中,可以避免“Session”突然消失帶來的用戶體驗問題。
官網首頁采用簡潔明朗的設計風格,頂部和底部采用組件化設計,只刷新中間的內容區域,復用頂部的Ap?pHeader 組件和底部的AppFooter 組件。
頂部導航欄包括首頁、律師、公開課、問答、文章5 個主要模塊,以及網站搜索框和登陸注冊按鈕。底部包含友情鏈接和網站的版權信息以及ICP 備案號等,底部還添加了微信二維碼和微博的跳轉鏈接。
網頁中部主要為內容展示區域,通過Vue 框架的動態路由進行頁面刷新和跳轉[18]。首頁主要展示廣告Bannner以及熱門律師和熱門公開課兩個本系統的主要功能模塊。具體如圖6 所示(彩圖掃OSID 碼可見)。

Fig.6 The official website homepage圖6 官網首頁
后臺管理系統和首頁使用的技術棧都是Vue 框架,只是實現起來稍有區別,具體開發流程如圖10 所示。

Fig.7 Vue framework development process圖7 Vue 框架開發流程
使用開源組件和模板可以極大加快開發迭代速度,做到“開箱即用”。后臺管理系統使用vue-admin-template 進行搭建,頁面和功能設計如圖8 所示。vue-admin-template是一個后臺前端解決方案,它基于前端框架vue.js 和餓了么公司的開源組件庫element-ui 實現。它使用了最新的前端技術棧,內置i18 國際化解決方案,動態路由,權限驗證,提煉了典型的業務模型,提供了豐富的功能組件,可幫助快速搭建企業級中后臺產品原型。后臺管理系統主頁面分為左側的導航欄,可以對頁面功能進行路由跳轉;右側的上方為搜索框,可以向Java 后臺發起數據篩選和多條件組合查詢;右側下方為內容展示區域,主要方便運維人員對系統數據進行管理。
系統主要使用Swagger 和Sentinel 工具配合進行功能測試。
Swagger 是一個規范和完整的框架,用于生成、描述、調用和可視化RESTful 風格的Web 服務[19],可以自動掃描Java 項目暴露的接口,其提供了非常簡單易用的UI 界面,并通過內置工具模擬網絡請求。在SpringBoot 項目中集成Swagger 后,通過訪問瀏覽器的“localhost:端口號/swaggerui.html”地址,即可訪問Swagger 的Web UI 界面。通過點擊Swagger 提供的按鈕即可向后臺接口發起網絡請求,并立即看到響應結果,通過該方式可以測試Java 后臺項目各接口運行情況。
Sentinel 是由阿里巴巴開發并開源的面向分布式服務架構的高可用流量防護組件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統負載保護、熱點防護等多個維度幫助開發者保障微服務的穩定性。Sentinel 同時提供實時監控功能,可以在控制臺中看到接入應用的單臺機器秒級數據,甚至500 臺以下規模集群的匯總運行情況。
QoS(Quality of Service,服務質量)指一個網絡能夠利用各種基礎技術,為指定的網絡通信提供更好的服務能力。通過Swagger 對后臺接口發起請求,結合Sentinel 生成的圖表,可以實時測試系統的QoS 和響應時間[20],以此判斷系統的性能和穩定性。經過軟件測試,使用Swagger 工具多次向系統后臺接口發起網絡請求,同時打開Sentinel 的后臺監控頁面,可以看到系統運行狀況,如圖8 所示。

Fig.8 Sentinel test results圖8 Sentinel 測試結果
分析測試結果可以發現,系統在每秒多達1 000 多次的網絡請求壓力測試下[21],單一接口無拒絕訪問的狀況發生,且系統的平均響應時間不超過5ms。該測試充分說明了基于微服務的在線律師網站架構設計合理,運行穩定,體現出基于微服務架構的應用網站的性能優勢。
可以看出,在網站應用用戶快速增加的情況下,不僅要加快開發速度,還要使系統各功能模塊之間弱耦合、可分離,微服務架構的出現很好解決了應用網站耦合度高、無法迅速迭代開發、升級維護困難等問題。在前后端編程語言選擇上,本文選擇了當下非常火熱的SpringBoot 框架和Vue.js 框架,其作為前后端開發的熱門框架,很好地滿足了當今時代對于網站應用的需求。
本文針對當前居民對法律知識和專業法律服務的需求,基于微服務架構對傳統在線律師網站進行了重構,系統采用前后端分離的方法,在前端和后端開發過程中,又采用了分層設計、層層分離的開發模式,在后端將業務分解為不同的微服務,有效降低了代碼開發的耦合度,降低了后端服務器壓力,也有效保障了系統的穩定性。通過對一個在線律師系統的設計與開發實踐,給出了一種可供現有傳統非微服務架構中小型應用網站參考的重構方案。預計將來會有越來越多的開發者和公司選擇使用基于微服務架構的SpringBoot+Vue.js 對現有傳統架構網站進行重構和升級,帶給用戶更好的體驗。