做了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>
将项目按模块,一一区分开,并且将不同技术更灵活的集成在一起
代码生成器--包括配置文件的生成,和模块项目的生成。
只需要配置一次,允许脱机运行,支持多种数据库且基于项目,并随着项目的发展,模板,备注也会相应跟进,更适合团队开发