技術(shù)框架篇--第4篇
用日志記錄“開源軟件”的誕生
赤龍ERP開源地址:
點亮星標(biāo),感謝支持,加微信與開發(fā)者交流 kzca2000
準備工作
搭建基礎(chǔ)框架前,一定要準備好開發(fā)環(huán)境。先安裝軟件(以我本地環(huán)境為例),包括:
1、IDE(Eclipse最新版)
2、JDK1.8
3、Tomcat8.5
4、MySQL8.0
5、Redis最新版
6、SVN、Git
安裝流程不做詳細說明。說幾個需要注意的地方:
(1)Tomcat安裝好后需要對server.xml做一些配置和優(yōu)化(端口、應(yīng)用、域名、NIO、線程池、SSL等)
(2)對JVM做必要的內(nèi)存配置優(yōu)化
(3)MySQL安裝時注意編碼UTF-8
(4)Redis需要配置密碼和持久化(AOF)
框架的基本要求
搭建應(yīng)用的底層框架,總是要或多或少的根據(jù)情景考慮一些問題,而不能是框架和技術(shù)的簡單堆砌。那么搭建框架要滿足哪些要求呢?
(1)安全性:由于是信息化管理系統(tǒng),使用的用戶是企業(yè)內(nèi)部的職員和高管,那么對于安全性和權(quán)限的考慮就要提升一個層次了。比如:誰能訪問哪些功能、誰能做哪些操作,誰能看到什么數(shù)據(jù)、又使用什么方式可以更便捷的實現(xiàn)各種安全性的考慮。
(2)降低信息流的復(fù)雜性:簡單解釋一下,ERP系統(tǒng)是一個很特殊的系統(tǒng),因為它是企業(yè)中復(fù)雜管理流程、業(yè)務(wù)流程、財務(wù)流程的實現(xiàn)。所以它有著嚴密的邏輯與流程,系統(tǒng)中幾乎沒有獨立的模塊或功能,系統(tǒng)內(nèi)部各部分互相依賴的復(fù)雜程度難以想象。如何降低這些依賴關(guān)系的復(fù)雜度,就是框架中迫不及待解決的問題。
(3)提高開發(fā)效率:信息化系統(tǒng)開發(fā)時的一大特點就是代碼復(fù)用程度高,無論是重復(fù)的增刪改查,還是表單處理,設(shè)置是各種報表,太多的重復(fù)工作會浪費太多的時間。開發(fā)人員應(yīng)該把工作集中在邏輯和算法上面,而不是這些簡單的復(fù)制粘貼修改上。
(4)靈活的可配置可擴展:信息化系統(tǒng)的另一個特色就是個性化需求非常高,即使對于一個簡單的流程,也可能出現(xiàn)多樣化的各種要求。這往往根據(jù)企業(yè)的管理情況而定。如何竭盡所能在減少客戶化開發(fā)的前提下,滿足更多的需求是我們要考慮的問題。
(5)降低學(xué)習(xí)成本和維護成本:由于這是一款開源軟件,我們要考慮的不能僅僅是高大上的技術(shù)使用,而是要能讓更多的開發(fā)者和使用者,可以快速部署,并進行個性化開發(fā)。無論在展示層、控制層、持久層,還是在各第三方組件的使用中都要盡量考慮到如何讓更多的人可以使用我們的軟件。
如何解決問題
針對以上的要求,我們?nèi)绾卧O(shè)計系統(tǒng),解決問題,并最終搭建滿足我們需求的底層框架呢?我們一起來嘗試摸索一下。
1、說到安全性,就離不開登陸、權(quán)限、加密這些場景。
(1)登陸我使用了cas,它是一個SSO框架,采用票據(jù)驗證機制保證了,認證的安全。
(2)授權(quán)我采用了shiro框架與cas無縫整合,根據(jù)三類權(quán)限的設(shè)置,保證了菜單、按鈕、數(shù)據(jù)的精細控制
(3)加密包括對HTTP頭的加密(SSL),對關(guān)鍵業(yè)務(wù)數(shù)據(jù)的加密(AES、SHA1)
2、降低信息流的復(fù)雜性,最核心的是如何梳理,如何切分業(yè)務(wù),模塊之間如何互相調(diào)用。
(1)梳理和切分業(yè)務(wù)其實更多的是經(jīng)驗問題,但有個通用的大原則,高內(nèi)聚;也就是把關(guān)聯(lián)性極高的功能放在一起,而對外暴露必要的接口供調(diào)用即可。其中還要考慮到一些基礎(chǔ)數(shù)據(jù)的通用化設(shè)計。比如:組織信息、職員信息、主數(shù)據(jù)、數(shù)據(jù)字典等,單獨設(shè)計并對外提供有雙層緩存的接口。(其中也要考慮到緩存的更新策略)
(2)模塊間我用Maven父子項目做了劃分,也為直接的接口調(diào)用和REST風(fēng)格的API調(diào)用做了不同方式的設(shè)計
3、如何提高開發(fā)效率,應(yīng)該是我們認真思考的話題。因為這真的很重要。如果處理得當(dāng)甚至?xí)?jié)省30%-40%的研發(fā)時間。
(1)代碼自動生成工具:我研發(fā)了一套可以自動生成Controller、Service、Dao、Model以及所有配置及注解的工具。當(dāng)前這是基于我指定的代碼規(guī)范。只需要修改兩到三個配置項,即可一鍵在項目下生成我們所需的代碼。本來至少要編寫半小時的代碼,現(xiàn)在只需要10秒鐘。
(2)可復(fù)用的工具包:十幾年積累的所有工具類可提供快速的靜態(tài)調(diào)用方式
(3)抽絲剝繭,獨立的功能設(shè)計:很多常用的第三方組件或技術(shù)的處理方式,抽象出來,加以復(fù)用。比如:線程、Redis、JMS、Socket、Json、Groovy、Mongo等。
(4)多功能的AOP處理:基本思路是通過AOP及自定義注解靈活加入各種輔助處理功能。比如:方法緩存、自動set基礎(chǔ)字段值、日志處理、數(shù)據(jù)權(quán)限控制等。
(5)必要的通用功能:通過Spring提供的技術(shù),實現(xiàn)異常處理、類型轉(zhuǎn)換、數(shù)據(jù)驗證、API請求攔截等各種處理要求。
4、可配置可擴展其實說起來簡單做起來難。可能很多軟件都是這么宣傳的,但真正做到的并不多。其實我認為主要做到如下幾點就可以了:
(1)字段的可擴展,即可以通過配置的方式增加輔助字段,并且能實現(xiàn)1對1結(jié)構(gòu),和1對多結(jié)構(gòu)的兩種方式。
(2)流程的靈活處理。軟件往往設(shè)計上會固定某一主流程,只要設(shè)計上讓這一流程的組織不固定,而相對松散的實現(xiàn)即可。
(3)功能性模塊的高度可配:比如權(quán)限系統(tǒng)、報表系統(tǒng)、工作流、數(shù)據(jù)字典
5、最后一個是有關(guān)降低學(xué)習(xí)成本和維護成本的問題。我覺得這更多是因為要匹配開源的要求,開源的使用者多數(shù)是個人或小團體,這對于普及一款開源產(chǎn)品顯得尤為重要。怎么做呢?
(1)用最普及的技術(shù)、最少的技術(shù)種類、實現(xiàn)更多的需求。
(2)提供最簡單的配置文檔以實現(xiàn)程序部署。
對未來的考慮
為了考慮單體需求的激增,不得不應(yīng)對高并發(fā)以及高可用的情景。所以現(xiàn)在技術(shù)選擇以及底層搭建時就一定要有所考量。當(dāng)前框架一定要可以快速引入新技術(shù)并可以高效整合。我認為Springboot一定是Java語言當(dāng)下是最優(yōu)的選擇,也為SpringCloud的升級做了足夠準備。
當(dāng)然其中還有很多要考慮的內(nèi)容,比如:負載均衡、消息隊列、數(shù)據(jù)總線、讀寫分離、異步并發(fā)、降級限流等。在此不展開討論,如果有興趣可與開發(fā)者直接溝通。
后記
今天的日志寫的比較長,但還沒有包括很多中間件的優(yōu)化和配置說明,為了給開源軟件的使用者簡化他們的部署工作,我會在后面附加一個技術(shù)補充文章。
希望您讀完本文可以幫助筆者進入【碼云】或【GitHub】點點星標(biāo)。感謝大家的支持!