Adhesive框架是为了满足公司内部项目需要开发的一套基础框架。Adhesive这个单词是胶水的意思,这个名字有几层含义:
1、框架其本身的组件像胶水一样相互配合,旨在为一个中型的互联网网站提供一套基于.NET 4.0的开发基础平台,实现灵活性、性能、伸缩性等。
2、框架对微软提供的既有技术进行粘合和扩展使它们可以更好发挥作用,比如ADO.NET EF4、ASP.NET MVC3、.NET WCF等。
框架基于.NET 4.0开发,可以用于ASP.NET (MVC)网站、控制台应用程序或Windows服务应用程序等,提供的主要功能包括:
1、基础组件:Bootstrapper模式、本地配置服务、本地服务定位、本地日志服务、邮件服务、短信服务、FastReflection、一堆小工具和扩展方法。这个组件是所有组件的基础。
2、配置服务:支持自定义配置实体(支持枚举、字典和列表以及无限级内嵌自定义类等),提供行版本控制和增量同步,二级数据缓存提供了高性能,并配以编辑后台。对于一个复杂的系统来说必定有很多配置,如果使用配置文件更新非常不方便,如果使用数据库,需要为每一套程序的配置写大量重复代码,并且需要自己处理缓存和数据同步的问题,配置服务正是解决这个问题的。关键词集中。
3、Mongodb数据服务:对于一个互联网网站来说,必定有许多对可靠行要求不是特别高,但数据量非常大的的业务数据、日志数据、统计数据、监控数据需要存储。对于这样的数据,使用Mongodb存储比关系型数据库合适许多,单个数据库可以承受每秒万级的插入量和,数千级的索引数据查询。但是带来的问题是,我们需要针对每一个业务开发一套入库的程序和查询后台,并且需要实现索引建立、分库、队列等等功能。Mongodb数据服务提供了一套通用的模式来解决大量数据的存储和查询功能。关键词通用。
4、应用程序信息中心:随着应用数量增多,访问量的增加,网站很容易出现问题,并且由于分布式服务以及外部依赖、大量的服务器等问题,往往在出现问题的时候很难定位问题和排查问题。应用程序信息中心关注横切关注点,在日志、异常、性能和状态几个维度提供网站健康状态的记录。这个组件需要用到大量的配置和数据存储以及数据查询,这里就使用了配置服务和Mongodb数据服务。关键词保障。
5、分布式组件客户端:公司内部使用了Memcached、Redis等很多分布式组件,它们的特点是使用一致性哈希对数据进行1/N,分布在各个节点上。客户端基于开源实现,难以管理,希望通过这个组件实现一套统一的客户端。首先我们实现的是基于二进制协议的Memcached客户端,并且提供了非常高的性能和丰富的接口,也实现了节点不可用的时的故障转移等特性。关键词整合。
6、WCF分布式服务:我们使用.NET WCF作为分布式通讯的框架,在此之上进行一些扩展。提供了4(启动、调用、异常、消息)×2(服务端和客户端)种日志的记录;使用配置服务进行集中化的服务配置(取代了原先使用配置文件的方式),集中化的配置也方便了服务的管理;实现了调用的密码验证;实现了ServiceLocator方便进行基于接口的服务调用;实现了基于版本号的路由等等功能。关键词治理。
7、ASP.NET MVC扩展:实现IOC、FluentHtml等特性,也提供了许多ActionFilter实现各种横切特性,在MVC中很重要的一点就是把业务和非业务的部分剥离,通过注入横切组件消除重复。关键词重用。
8、ADO.NET EF扩展和领域驱动实现:对ADO.NET EF进行扩展,实现链接字符串加密等特性,并且实现了领域驱动中的资源库、工作单元、对象工厂、值对象等理念。
9、其它:还有一些组件包括基于内存的队列、基于数据量和状态的报警服务等等。
框架解决方案结构如下:
1、Core就是核心组件
2、Host是几个组件服务端的控制台承载和Windows服务承载
3、Test是一些单元测试和测试项目
4、Web是一些服务的后台,比如配置服务和Mongodb数据服务
下图是一张逻辑架构图:
此图体现了几个设计理念:
1、Adhesive作为一个基础框架提供横切和扩展两个方面的服务。
2、充分解偶:每一个层之间都使用依赖注入实现依赖,正因为了有了依赖注入使得相互引用变为可能。
3、可测试性:正因为解偶,使得Mockup成为可能,也就使得复杂项目可以独立测试。每一个层都应该具有自己的测试项目。
在本系列文章中将在两个方便分别介绍每一个组件:
1、使用:如何把组件应用到项目中去。需要注意的是,由于这是一个框架,其中很多组件无法独立使用,因此使用的对象很可能本身就是程序员而不是最终用户,需要把组件用到项目中去才可以发挥作用。
2、实现:会讲述一些理念,并不会有过多的代码。理念包括三部分,首先是设计的理念,比如模块之间如何组织如何重用;其次是抽象的理念,比如很多时候我们在做重复劳动的原因就是因为暂时无法对一个模型进行抽象,或者很难抽象,一旦相通了那么就会很通用;最后是技巧,比如如何实现某个功能,或是.NET中某点需要关注。这些理念往往比其实现更重要,明白了这些道理要实现就不难了。