做了7年的開發了,時間越久越是發現自己需要一個像標題寫的那樣的一個架構做為整個平台的支撐。
我的技術種類又是.net開發,總覺得.net技術人才容易出現瓶頸;其實這種瓶頸更像是這種環境造成的。簡單快捷的開發本來就是.net所追求的,而這種追求導致整個語言平台在技術上都喜歡用最直接簡單的方法解決問題,至於架構,可維護,持續升級,還是等項目上線或是出了問題之后再說。成熟、穩健並被公認的技術架構似乎每個做技術的都是見仁見智,都有自己獨立的理解,而像java一樣ssh等成熟公認的架構在業界基本寥寥無幾,也許你會把三層架構拿出來說事,但是我個人覺得,三層只適合做中小型項目。
廢話少說,直接切入主題,分布式,在我的理解看來,要解決幾個問題(注:很多核心主鍵我將不限)數據庫、會話、緩存、項目之間的通信、跨語言、同步等等。而這些問題在java環境中有各種各樣的核心組件可以解決。而組件之間似乎大家都統一用spring做為中間的調和劑。而.net 這方面相對要欠缺一些,所以數據訪問層需要自己實現支持訪問不同數據庫,支持分表,支持虛擬表訪問,借助taobao的tddl,自己准備開發一個ddl.net,.net版的分布式數據訪問層,借助.net 的異步訪問,實現分庫分表的多線訪問並合並數據集。項目之間的通信我選擇thrift,這樣解決了跨語言和項目的目的。而緩存選擇memcached,它也是我分布式會話的核心只是會話存儲的內容是json數據格式,這樣也解決了不同語言開發時候會話數據的統一格式。消息隊列messagequeue,選用MSMQ。.net 的中間調和劑比較豐富,而且特點各一。最終我還是選擇了spring.net畢竟是java比較成熟的產品,在.net平台下也不會差到哪里去。而且spring.net也自帶了和mvc、wcf、windowservices等無縫集成的事例代碼,可以說是完美的了,唯一的確定就是配置有點多,這個時候肯定要選擇一個比較好的代碼生成器,在現有的代碼生成器中我沒有找到好用的於是自己在已有大代碼中改了一個,代碼生成基於項目配置,基礎數據由數據庫中產生,支持sqlserver、mysql、oracle單代碼生成和數據庫無關只與配置相關,所以代碼生成器可以離線工作。模塊文件也是以項目為獨立單元,所以一個代碼生成器可以配置各種項目類型,並且模版也是相互獨立的。這樣也比較適合團隊開發和代碼規范。這樣由於架構的靈活造成的大量代碼問題也得以解決。然后是文件服務器,我現在的考慮是由thrift直接存儲到對應的服務器中,再由文件服務器中的自動同步代碼同步到不同服務器中。搜索也是獨立的模塊,Lucene.net 是基礎庫,ZoieNet(由java的項目修改過來,現在還沒有發布)做real time index。當然做為行業垂直搜索引擎,在搜索的數據結構上根據不同的需要來做相應的調整。前端現在的工作量也是呈現爆炸式的增長。於是乎我選擇了Combo.Net(自己開發的中間件),這樣讓組件方式的封裝前端成為可能。
這是按照這個架構搭建的項目
下面附上部分代碼:
ddl.net --配置不同的數據源
<atom-datasource name="group_test_3_001" provider="sqlServer4.0" property="sqlServer" connectionString="data source=${datasource};database=${database};user id=${userid};password=${password};connection reset=false;connection lifetime=5; min pool size=1; max pool size=50" /> <atom-datasource name="group_test_4" provider="MySql" property="MySql" connectionString="data source=${datasource};database=${database};user id=${userid};password=${password};connection reset=false;connection lifetime=5; min pool size=1; max pool size=50" />
--數據庫分組,讀寫分離配置 及相關權重配置
<group-datasource name="ds_1_001" type="sqlserver"> <settings> <atom name="group_test_1_001" weight="r10w10p0q0"/> <atom name="group_test_2_001" weight="r10w10p0q0"/> <atom name="group_test_3_001" weight="r10w10p0q0"/> </settings> </group-datasource>
combo.net 前端解決方案-主要解決前端頁面套用時候的代碼整合
駕馭 metronic 前端輕輕松松
http://www.hxteservices.com 這只是案例網站不為推廣,只希望瀏覽者有個直觀的感受
這個網站就是由它做的。生成好的前端代碼絕對好看。而且它的功能還遠不止這些。
@using Combo; @using Combo.Mvc; --在插件內應用相應的js @{ Html //<!-- BEGIN CORE PLUGINS --> .RequiresJs("jquery.min.js", HomeGlobal.ScriptCorePlugin, 101) //<!-- END CORE PLUGINS --> //<!-- BEGIN PAGE LEVEL SCRIPTS --> .RequiresJs("frontend/layout/scripts/layout.js", HomeGlobal.ScriptPageLevel, 10006) //<!-- END PAGE LEVEL SCRIPTS --> ; } <!--html 插件要用的html--> --插件需要寫入的html段 @{ Html.RequiresScript(@" jQuery(document).ready(function () { Layout.initFixHeaderWithPreHeader(); /* Switch On Header Fixing (only if you have pre-header) */ Layout.initNavScrolling(); });" , 100); }
生成好的代碼
<script src="http://jac.hxteservices.com/combo.axd/assets/global/plugins/??jquery.min.js,jquery-migrate.min.js,bootstrap/js/bootstrap.min.js?v=1004.js" type="text/javascript"></script>
<script src="http://jac.hxteservices.com/combo.axd/assets/global/plugins/??fancybox/source/jquery.fancybox.pack.js,carousel-owl-carousel/owl-carousel/owl.carousel.min.js,slider-revolution-slider/rs-plugin/js/jquery.themepunch.revolution.js,slider-revolution-slider/rs-plugin/js/jquery.themepunch.tools.min.js?v=1004.js" type="text/javascript"></script>
<script src="http://jac.hxteservices.com/combo.axd/assets/??frontend/layout/scripts/back-to-top.js,global/scripts/fromserialize.js,global/scripts/mvcparammatch.js,frontend/pages/scripts/revo-slider-init.js,frontend/layout/scripts/layout.js?v=1004.js" type="text/javascript"></script> <script type="text/javascript"> jQuery(document).ready(function () { Layout.init(); }); </script>
--spring.net 配置文件
<context> <resource uri="file://~/App_Data/Config/Spring/thrift.config"/> <!--thrift 集成--> <resource uri="file://~/App_Data/Config/Spring/controller.config"/><!--MVC --> <resource uri="file://~/App_Data/Config/Spring/persistence.campus.config"/> <!--數據庫--> <resource uri="file://~/App_Data/Config/Spring/controller.campus.config"/> <resource uri="file://~/App_Data/Config/Spring/persistence.classify.config"/> <resource uri="file://~/App_Data/Config/Spring/controller.classify.config"/> <resource uri="file://~/App_Data/Config/Spring/persistence.ccenter.config"/> <resource uri="file://~/App_Data/Config/Spring/controller.ccenter.config"/> <resource uri="file://~/App_Data/Config/Spring/persistence.ucenter.config"/> <resource uri="file://~/App_Data/Config/Spring/controller.ucenter.config"/> </context>
將項目按模塊,一一區分開,並且將不同技術更靈活的集成在一起
代碼生成器--包括配置文件的生成,和模塊項目的生成。
只需要配置一次,允許脫機運行,支持多種數據庫且基於項目,並隨着項目的發展,模板,備注也會相應跟進,更適合團隊開發