• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于Spring Boot讀寫分離架構(gòu)的理財系統(tǒng)

    2022-11-28 07:19:40朱文杰姚雨晨伏勝洋
    關(guān)鍵詞:管理員代碼耦合

    朱文杰,姚雨晨,伏勝洋,汪 洋

    (1.湖北師范大學 計算機與信息工程學院,湖北 黃石 435000;2.華中師范大學 物理科學與技術(shù)學院,湖北 武漢 430000)

    1 開發(fā)背景

    近年來互聯(lián)網(wǎng)金融的發(fā)展迅猛,擬開發(fā)一個具有操作特色的理財系統(tǒng)?,F(xiàn)有的理財系統(tǒng)多數(shù)基于C#[1]和Android[2,3]等開發(fā)技術(shù),開發(fā)難度較大,并且在效率和易維護性上存在一定問題。本文針對傳統(tǒng)方案設(shè)計模式存在的問題及缺陷,設(shè)計并實現(xiàn)了一套以Spring Boot為框架的B/S快速設(shè)計系統(tǒng);為了實現(xiàn)該系統(tǒng)前后端分離,引入MVC進行設(shè)計,使用Spring Boot以及MyBatis框架進行項目編碼;其后端借助Spring Boot、MyBaits、MySQL[4,5]等服務(wù)平臺,在實現(xiàn)基本功能的前提下,使用page helper進行頁面操作,前臺使用模板語言thyme leaf,并配以使用Maven、MyBatis[6]等提供的技術(shù)優(yōu)勢,有效地降低了開發(fā)復雜度,實現(xiàn)資源橫向擴展、動態(tài)伸縮,快速響應外部需求的變化。此外,本系統(tǒng)還加入了個性化等設(shè)計,改善用戶體驗。

    2 開發(fā)技術(shù)

    Spring Boot是一個開源框架,其內(nèi)部整合了眾多配置功能,可以利用其控制反轉(zhuǎn)、依賴注入以及切面編程的特性,實現(xiàn)通過簡單的配置較為迅速地搭建出應用開發(fā)平臺功能。同時,本理財系統(tǒng)通過合理的使用其注釋功能來簡化項目開發(fā)過程,以達到加快開發(fā)進程的目的。

    “高內(nèi)聚,低耦合”是代碼編寫的目標,內(nèi)聚和耦合都是一種度量[7~9]。內(nèi)聚包括偶然內(nèi)聚、邏輯內(nèi)聚、時間內(nèi)聚以及過程內(nèi)聚等等,其是指模塊內(nèi)各個部分之間的緊密程度,高內(nèi)聚是指一個模塊由相關(guān)性較強的代碼組成且該模塊只實現(xiàn)一項功能。耦合包括無直接耦合、數(shù)據(jù)耦合、標記耦合以及控制耦合等等,其是指模塊之間的互連程度。與內(nèi)聚不同,隨著系統(tǒng)代碼之間的耦合性的增強,系統(tǒng)各個功能模塊互相調(diào)用關(guān)系混亂不清,代碼的獨立性就會因此降低。為了避免此問題,本理財系統(tǒng)采用面向服務(wù)架構(gòu)技術(shù)開發(fā)。

    面向服務(wù)架構(gòu)SOA(Service-Oriented Architecture)是一種面向服務(wù)的、處理不同軟件之間數(shù)據(jù)交互的粗粒架構(gòu)[10~12];其根據(jù)整體應用的不同功能進行拆分來得到多個功能塊,進而提供不同服務(wù);服務(wù)之間通過協(xié)議進行聯(lián)系,每個服務(wù)之間的功能都是彼此獨立且可相互調(diào)用。為提高服務(wù)在不同系統(tǒng)中的適用性,我們在本理財系統(tǒng)中定義一個服務(wù)的接口或者協(xié)議時,往往采用能區(qū)分且用于實現(xiàn)服務(wù)系統(tǒng)的編程語言或者操作系統(tǒng),以此來實現(xiàn)服務(wù)的跨系統(tǒng)交互。

    讀寫分離(如圖1)用于解決數(shù)據(jù)庫的讀取性能限制,但并不是所有的讀性能受限制都是要用讀寫分離。對于大多數(shù)業(yè)務(wù),多見讀寫不均的現(xiàn)象,主要是數(shù)據(jù)庫讀能力要比寫能力強很多,而往往寫數(shù)據(jù)庫能力是數(shù)據(jù)庫的瓶頸。本理財系統(tǒng)為了較大提升數(shù)據(jù)庫的寫性能,削弱讀寫沖突,提升數(shù)據(jù)庫寫入能力,就必須使用讀寫分離。

    圖1 讀寫分離適用場景

    3 系統(tǒng)需求分析、總體設(shè)計

    3.1 系統(tǒng)需求設(shè)計

    本系統(tǒng)實現(xiàn)功能:權(quán)限管理、用戶信息管理、理財產(chǎn)品管理等。用戶可以使用該系統(tǒng)進行理財產(chǎn)品的購買以及貸款申請,理財方式包括零錢理財、工資理財?shù)?,同時該系統(tǒng)也會給用戶更新理財產(chǎn)品信息。為滿足網(wǎng)站用戶的需求,系統(tǒng)管理者可以在管理端對用戶端的使用權(quán)限進行修改,同時對用戶端理財信息進行增刪改查。

    3.2 總體設(shè)計

    本系統(tǒng)分為管理端和用戶端,如圖2.

    1)用戶端則分為四個模塊:系統(tǒng)首頁、個人理財、金融工具、個人中心。系統(tǒng)首頁提供理財簡介以及理財書籍推薦。個人理財包括零錢理財、工資理財、期限理財、基金理財四種理財產(chǎn)品以及銀行推薦,用戶可以在此進行理財產(chǎn)品的購買。金融工具包括資金記錄和安全網(wǎng)貸,用戶可以通過資金記錄查找賬戶資金流向,同時可以通過安全網(wǎng)貸頁面進行網(wǎng)絡(luò)貸款。個人中心分為我的理財、我的借貸、銀行卡管理、賬戶安全。用戶可以通過我的理財界面進行對已購買理財產(chǎn)品的管理,在我的借貸界面進行還貸,賬戶安全頁面可以進行賬戶密碼的修改。

    2)管理員通過登錄管理賬戶對該理財系統(tǒng)進行管理。用戶信息管理界面分為用戶信息、銀行卡、個人征信三個部分,管理員可在此進行用戶信息以及征信管理。管理員可以在理財產(chǎn)品管理界面進行理財產(chǎn)品的管理以及銀行推薦信息的更新。權(quán)限管理部分可以進行用戶界面功能的修改以及管理員權(quán)限的設(shè)置。同時,對于用戶提交的網(wǎng)貸申請,管理員可以在網(wǎng)貸管理界面進行審核,除此之外,管理員可以在網(wǎng)貸信息界面進行系統(tǒng)用戶網(wǎng)貸信息的查看以及提醒還款操作。

    3.3 微服務(wù)在理財系統(tǒng)開發(fā)中的應用

    在本理財系統(tǒng)多功能模塊的搭建中,如果簡單地將以上功能模塊進行打包整合,形成一個巨大的服務(wù)單元,也稱為單體式應用[13,14]。雖然單體式應用在系統(tǒng)部署方面確實具有一定的優(yōu)勢,但是在系統(tǒng)不斷迭代升級后,其內(nèi)部功能模塊關(guān)系會因此變得十分復雜,此時進行修改以及擴展是十分困難的。所以為了解決這一問題,引入微服務(wù)進行系統(tǒng)管理。

    微服務(wù)是SOA的細粒級組件[15~17],相比于SOA,微服務(wù)更加注重于輕量級服務(wù),雖然微服務(wù)和SOA實現(xiàn)服務(wù)所用的技術(shù)不同,但兩者功能十分相似。對于一個SOA架構(gòu),我們可以將其拆分為松散耦合的微服務(wù)組件,這些微服務(wù)組件均可獨立部署且可實現(xiàn)和SOA相同的功能,如圖3.

    圖3 單體式應用以及微服務(wù)示意圖

    3.4 系統(tǒng)數(shù)據(jù)庫組織與讀寫分離的實現(xiàn)

    由于MySQL占用小且運行速度快,所以本理財系統(tǒng)采用MySQL用作數(shù)據(jù)庫,其為一種關(guān)系型的數(shù)據(jù)庫管理系統(tǒng)。選用MySQL可以將本理財系統(tǒng)的各類數(shù)據(jù)存放在不同的表中,如此可以使訪問速度提高。在實際使用過程發(fā)現(xiàn)直接在MySQL對數(shù)據(jù)進行操作較為麻煩,為了簡化數(shù)據(jù)庫管理,且綜合考慮便捷性以及成本,本系統(tǒng)采用Navicat對數(shù)據(jù)庫進行管理,即MySQL對系統(tǒng)的數(shù)據(jù)進行管理[18,19],而Navicat對MySQL進行管理。

    本理財系統(tǒng)創(chuàng)建19個數(shù)據(jù)庫表,各用于存儲管理員信息、管理員許可、銀行信息、銀行卡信息、零錢理財信息、資金記錄、基金理財信息、通知信息、貸款信息、理財新聞信息、用戶許可信息、期限理財信息等。以下列數(shù)據(jù)庫表(表1)為例:

    表1 數(shù)據(jù)庫設(shè)計表格

    在管理數(shù)據(jù)庫時,我們發(fā)現(xiàn)理財系統(tǒng)的數(shù)據(jù)庫在高并發(fā)寫入時,表現(xiàn)出較大的壓力。此時需要削弱讀寫沖突,以此提高數(shù)據(jù)庫寫能力。我們可以采用讀寫分離,將理財系統(tǒng)原本的數(shù)據(jù)庫分為主從庫,其中我們用主庫進行寫數(shù)據(jù)(增、刪、改),剩余的從庫用于讀數(shù)據(jù)(查),其中在主庫和多個從庫之間進行數(shù)據(jù)同步,如圖4.

    圖4 讀寫分離總體示意圖

    3.5 讀寫分離相關(guān)實現(xiàn)類

    實現(xiàn) MySQL數(shù)據(jù)庫的動態(tài)讀寫分離,主要由以下幾個類實現(xiàn):

    1) ResourceHandlers(ResourceHandlerRegistry registry) Springboot默認靜態(tài)資源訪問路徑,若靜態(tài)資源路徑不是在Springboot規(guī)定的靜態(tài)資源文件夾下面,則需要在下面添加映射路徑;

    public void ResourceHandlers(ResourceHandlerRegistry registry)

    {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");

    registry.addResourceHandler("/webjars/**").addResourceLocations("/webjars/"); }

    2) determineTargetDataSource設(shè)置獲取數(shù)據(jù)源,determineCurrentLookupKey決定當前數(shù)據(jù)源的對應的key,

    DataSource determineTargetDataSource(){

    Object lookupKey=this. determineCurrentLookupkey();

    DataSource dataSource=(DataSource) this. resolvedDataSources. get(lookupkey); if(dataSource== null &&(this. lenientFallback II lookupkey ==null)){

    dataSource=this. resolvedDefaultDataSource;

    if(datasource ==nul1){throw new IllegalStateException("Cannot determine target Datasource for lookup key ["+lookupkey+"]");

    } else{return dataSource;}

    根據(jù)determineCurrentLookupKey獲取的key,在resolvedDataSources這個Map中查找對應的datasource。

    3) AfterPropertiesSet它在bean實例已經(jīng)創(chuàng)建好,且屬性值和依賴的其他bean實例都已經(jīng)注入以后執(zhí)行,也就是說調(diào)用,targetDataSources,defaultTargetDataSource的賦值一定要在afterPropertiesSet前邊執(zhí)行;

    Override public void AfterPropertiesset(){

    if(this. targetDatasourcesum null){

    this.resolvedDatasources = new HashMop(this.targetoatasources.size());for(Hap. Entry

    entry: this. targetDatasources. entryset()){

    object lookupkey=resolveSpecifiedLookupkey(entry. getkey());

    DataSource datasource resolvespecifiedDataSource(entry.getvalue()); this.resolvedDataSources.put(lookupkey, dataSource); }}

    4) DataSourceAOP實現(xiàn)AOP的前置通知,對所有返回值進行校驗以判別對數(shù)據(jù)庫是進行讀操作還是寫操作,使用request的getParameter方法,讓其在返回值的時候檢查提交方式;

    public void DataSourceAOP (ServletRequest request, ServletResponse response, FilterChain chain)

    throws IOException, ServletException {

    response.setCharacterEncoding(code);

    response.setContentType("text/html;charset=" + code);

    MyHttpServletRequest myRequest = new MyHttpServletRequest((HttpServletRequest));

    chain.doFilter(myRequest, response);}

    通過上面介紹的相關(guān)類,便可高效快捷實現(xiàn)本理財系統(tǒng)數(shù)據(jù)庫讀寫分離。此外,當用戶數(shù)量增多,遇到性能瓶頸時,這種結(jié)構(gòu)便于進行多方面擴展,例如添加數(shù)據(jù)源、添加數(shù)據(jù)庫、負責均衡等,根據(jù)需求動態(tài)收縮,以實現(xiàn)系統(tǒng)升級迭代,實現(xiàn)示意圖如圖5所示:

    圖5 SpringBoot讀寫分離實現(xiàn)示意圖

    4 系統(tǒng)測試運行

    用戶在理財系統(tǒng)上的網(wǎng)頁請求會被控制器轉(zhuǎn)移給與之對應的模型進行處理,控制器只是選擇適當?shù)哪P瓦M行處理,處理完成后控制器再調(diào)用相應的視圖來顯示返回的數(shù)據(jù)。當我們需要對理財系統(tǒng)的用戶體驗進行改進時,不需要再次進行邏輯的編寫,不需要再次編輯業(yè)務(wù)邏輯,以此減少項目編輯時長,提高項目開發(fā)的效率。

    4.1 登錄界面

    該部分主要通過Shiro框架來實現(xiàn)。為了系統(tǒng)用戶能順利登入本理財系統(tǒng)(如圖6),需要Shiro攔截器對URL進行攔截。Shiro Config配置首先設(shè)置安全管理器,再添加Shiro的內(nèi)置過濾器并設(shè)置過濾器規(guī)則。在Realm可以增加驗證碼校驗,當驗證失敗時拋出異常,Shiro認為登錄失敗,則記錄異常信息并執(zhí)行登錄失敗邏輯。

    圖6 登錄界面

    4.2 系統(tǒng)首頁

    該部分通過控制器controller實現(xiàn)。其作用是先根據(jù)不同的用戶請求分配URL,再根據(jù)URL匹配不同的接收器,再分別進行處理,最后向用戶返回結(jié)果。本部分與數(shù)據(jù)庫匹配,管理員可以在數(shù)據(jù)庫中對該部分內(nèi)容進行修改。

    系統(tǒng)首頁包含了理財系統(tǒng)的大部分功能模塊,如果在代碼編寫過程中不注意代碼結(jié)構(gòu),很容易引發(fā)高耦合。若此時不對代碼層進行調(diào)整,將會導致系統(tǒng)各功能模塊產(chǎn)生混亂。我們可以通過代碼解耦合來解決這一問題。

    首先,抽象系統(tǒng)模塊得到模塊以及類之間的關(guān)系,通過模塊依賴關(guān)系初步判斷是否需要進行解耦合,如果依賴關(guān)系混亂,再結(jié)合參考間接衡量標準進行綜合判斷,若代碼結(jié)構(gòu)在可讀性以及可維護性確實存在缺陷,則需要進行解耦合。

    解耦合可分為三步,首先進行封裝,其次進行中間層處理,最后進行模塊化。常見的解耦合方式有以下幾種:

    Spring Aop(面向切片編程),主要實現(xiàn)業(yè)務(wù)代碼以及非業(yè)務(wù)代碼之間的解耦合。其中業(yè)務(wù)代碼指直接實現(xiàn)響應用戶需求的代碼,非業(yè)務(wù)代碼指脫離業(yè)務(wù)存在的代碼,也被稱之為輔助業(yè)務(wù)代碼。

    Ioc(控制反轉(zhuǎn)),主要實現(xiàn)服務(wù)創(chuàng)建者與服務(wù)對象之間的解耦。

    消息隊列,實現(xiàn)觀察者與被觀察者之間的解耦合。

    4.3 個人理財

    管理員可以通過理財產(chǎn)品管理界面(如圖7)進行系統(tǒng)理財產(chǎn)品的更新,通過Change Money Controller、Pay Money Controller、Term Financial Controller、Fund Product Controller、Bank Controller五個控制器來實現(xiàn)。使用Request Mapping來處理請求地址映射的注解,把WEB請求映射到相應的處理函數(shù)。Request Mapping的變體形式包括Get Mapping和Put Mapping,均用于向服務(wù)器提交信息。

    圖7 零錢理財界面

    4.4 金融工具

    金融工具頁面包括資金記錄和安全網(wǎng)貸。用戶可以在資金記錄界面(如圖8)查詢到賬戶資金的流向明細。該部分通過Recorder Controller控制器實現(xiàn)。為了跳轉(zhuǎn)到資金記錄界面,首先引入Page Helper插件,在查詢之前使用Start Page方法,來傳入頁碼以及每頁大小。再使用Page Info打包查詢后的結(jié)果,并移交給頁面進行下一步處理。

    圖8 資金記錄界面

    4.5 個人中心

    該部分由My Finance Controller、Loan Controller、Bank Card Controller、User Controller控制器實現(xiàn),根據(jù)理財類別對用戶已購買的理財產(chǎn)品進行明細顯示(如圖9)。

    圖9 我的理財界面

    用戶輸入借貸金額以及借貸期限,即可進行貸款申請,管理員可以對申請進行審核。

    5 結(jié)語

    針對目前市面上理財系統(tǒng)存在的一些不足,分析并設(shè)計了一種讀寫分離的理財管理系統(tǒng)。系統(tǒng)開發(fā)基于SpringBoot微架構(gòu),其中Spring Boot使用Java構(gòu)建微服務(wù),利用Spring Boot + Mybatis框架搭建理財管理系統(tǒng),本文重點描述了微服務(wù)系統(tǒng)讀寫分離功能原理以及相關(guān)實現(xiàn)的過程,通過實際運行測試,系統(tǒng)穩(wěn)定性以及實用性符合設(shè)計要求,為理財新手提供一種更易上手的理財方式。

    Design and implementation of financial management system with read-write separation based on Spring Boot

    ZHU Wen-jie1,YAO Yu-chen1,F(xiàn)U Sheng-yang1,WANG Yang2

    猜你喜歡
    管理員代碼耦合
    非Lipschitz條件下超前帶跳倒向耦合隨機微分方程的Wong-Zakai逼近
    我是小小午餐管理員
    我是圖書管理員
    少先隊活動(2020年8期)2020-12-18 02:32:07
    我是圖書管理員
    少先隊活動(2020年7期)2020-12-18 01:48:39
    可疑的管理員
    創(chuàng)世代碼
    動漫星空(2018年11期)2018-10-26 02:24:02
    創(chuàng)世代碼
    動漫星空(2018年2期)2018-10-26 02:11:00
    創(chuàng)世代碼
    動漫星空(2018年9期)2018-10-26 01:16:48
    創(chuàng)世代碼
    動漫星空(2018年5期)2018-10-26 01:15:02
    基于“殼-固”耦合方法模擬焊接裝配
    大型鑄鍛件(2015年5期)2015-12-16 11:43:20
    丰原市| 宜都市| 塔城市| 乐安县| 古丈县| 广南县| 蕉岭县| 凤翔县| 新营市| 土默特左旗| 石狮市| 栾川县| 商河县| 万安县| 九江县| 景泰县| 佛学| 石阡县| 嘉鱼县| 清丰县| 遂川县| 湟源县| 雷山县| 竹山县| 新巴尔虎右旗| 呼和浩特市| 西畴县| 南和县| 洛川县| 洮南市| 贵德县| 益阳市| 金堂县| 鄂伦春自治旗| 凤冈县| 辉南县| 米易县| 元谋县| 长子县| 确山县| 安岳县|