系统架构图

转载自:http://www.javashuo.com/article/p-tmtsknaz-ht.html    做者:有梦就能实现html

发布一企业技术架构图,供你们参考。java

 

该技术架构图是本人根据多年企业技术架构经验而制定,是企业技术的总架构图,但愿对CTO们有所借鉴。node

 简单说明:mysql

1.中间件基础运行环境是通过统一规划的以WebLogic、JBOSS为主的集群环境                            linux

2.企业集成平台是以基础业务应用为基础服务于上层平台和基础业务应用的高度集成平台         android

3.数据中心是企业公共数据的集中管理好比用户数据、企业编码,能够经过数据集成平台或服务集成平台分发给其余应用     nginx

 

项目作了很多,都没画过架构图,此次被要求画图,画的很丑,请你们看图自己包含的系统架构信息git

1、架构总体图程序员

  

   一、核心是两库一线github

  1.1 接口总线

    全部算法功能抽象成接口,其中大部分接口的方法都是泛型方法,是为了解决某一大类问题的

  1.2 代码库

    代码库包含现接口总线中接口的各类实现

  1.3 应用库

    提供用户的界面或者提供给外部的服务

    是经过容器配置调用算法库中的代码来实现的各类应用          

 

2、应用关系图

       一、应用经过配置从应用库中组装出本身的应用系统

       二、应用自己以外的东西尽可能使用拦截器处理(受权访问、权限数据推送、异常处理、缓存、日志等)

       三、使用消息队列作高并发应用支撑(秒杀相似应用)

       四、使用分布式任务系统作周期做业、数据维护、数据计算等

 

 

ENode架构图

 

什么是ENode

ENode是一个.NET平台下,纯C#开发的,基于DDD,CQRS,ES,EDA,In-Memory架构风格的,能够帮助开发者开发高并发、高吞吐、可伸缩、可扩展的应用程序的一个应用开发框架。

  • 开源项目地址:https://github.com/tangxuehua/enode
  • 做者博客地址:http://www.cnblogs.com/netfocus/category/496012.html
  • QQ交流群号:185916873
  • 微信公众号:ENode

ENode框架特点

  1. 一个DDD开发框架,完美支持基于六边形架构思想的开发
  2. 实现CQRS架构思想,而且框架提供C端命令的处理结果的返回,支持同步返回和异步返回
  3. 内置Event Sourcing(ES)架构模式,让C端的数据持久化变得通用化
  4. 聚合根常驻内存,in-memory domain model
  5. 聚合根的处理基于Command Mailbox, Event Mailbox的思想,相似Actor Model, Actor Mailbox
  6. 严格遵照聚合内强一致性、聚合之间最终一致性的原则
  7. Group Commit Domain event
  8. 基于聚合根ID+事件版本号的惟一索引,实现聚合根的乐观并发控制
  9. 框架保证Command的幂等处理
  10. 经过聚合根ID对命令或事件进行路由,作到最小的并发冲突、最大的并行处理
  11. 消息发送和接收基于分布式消息队列EQueue,支持分布式部署
  12. 基于事件驱动架构范式(EDA,Event-Driven Architecture)
  13. 基于队列的动态扩容/缩容
  14. EventDB中由于存放的都是不可变的事件,因此水平扩展很是容易,框架可内置支持
  15. 支持Process Manager(Saga),以支持一个用户操做跨多个聚合根的业务场景,如订单处理,从而避免分布式事务的使用
  16. ENode实现了CQRS架构面临的大部分技术问题,让开发者能够专一于业务逻辑和业务流程的开发,而无需关心纯技术问题

晚上把公司应用的架构结合以前研究的东西梳理了下,整理了一张架构规划图,贴在这里备份

下面是我的理解的作架构的几个要点:

一、系统安全

这是首要考虑的,以这张图为例,网络划分为3个区:

a) DMZ区能够直接公网访问,也能够 与App Core区互通,但不能直接与DB Core区互通 (一般这里放置 反向代理Web服务器)

b) App Core区能与DMZ区、DB Core区互通,可是没法直接从公网访问 (一般这里放置 应用服务器、中间件服务器之类)

c) DB Core区仅与App Core区互通 (一般这里放置 核心数据库)

二、尽可能消除单点故障

上图中,除了“硬件负载均衡”节点外,其它节点均可以部署成集群(DB有点特殊,传统RDBMS要实现分布式/集群仍是比较困难的,要看具体采用的数据库产品,并不是全部数据库都能方便的作Sharding),Jboss自己能够经过Domain模式+mod_cluster实现集群、Redis经过Master/Slave以Sentinel方式能够实现HA、IBM MQ自己就支持集群、FTP Server配合底层储存阵列也能够作到HA、Nginx静态资源服务器自没必要说

三、成本

尽可能采用开源成熟产品,jboss、redis、nginx、apache、mysql、rabbit MQ都是很好的选择。硬件负载均衡一般成本不低,可是效果明显,若是实在没钱,域名解析采用DNS轮询策略,也能达到相似效果,只不过可靠性略差。

四、Database问题

常规企业应用中,传统关系型数据仍然是主流,可是no-sql通过这几年发展,技术也日渐成熟了,一些非关键数据能够适当采用no-sql数据库,好比:系统日志、报文历史记录这类相对比较独立,并且增加迅速的数据,能够考虑存储到no-sql db甚至HDFS、TFS等分布式开源文件系统中。

若是系统数据量级达到单机RDBMS的上限,尽早考虑Sharding方案,目前mysql在这方面比较成熟,其它数据库就很差说了。

五、性能

web server、app server这些通常均可以经过集群实现横向扩张,知足性能平常增加的需求。最大的障碍仍是DB,若是规模真达到了DB的上限,仍是考虑换分布式DB或者迁移到“云”上吧。

 

HBase 系统架构图

  

  组成部件说明   Client:      使用HBase RPC机制与HMaster和HRegionServer进行通讯      Client与HMaster进行通讯进行管理类操做      Client与HRegionServer进行数据读写类操做      Zookeeper:      Zookeeper Quorum存储-ROOT-表地址、HMaster地址      HRegionServer把本身以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康情况      Zookeeper避免HMaster单点问题      HMaster:      HMaster没有单点问题,HBase中能够启动多个HMaster,经过Zookeeper的Master Election机制保证总有一个Master在运行      主要负责Table和Region的管理工做:      1 管理用户对表的增删改查操做      2 管理HRegionServer的负载均衡,调整Region分布      3 Region Split后,负责新Region的分布      4 在HRegionServer停机后,负责失效HRegionServer上Region迁移      HRegionServer:      HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据

  

  HRegionServer管理一些列HRegion对象;     每一个HRegion对应Table中一个Region,HRegion由多个HStore组成;    每一个HStore对应Table中一个Column Family的存储;      Column Family就是一个集中的存储单元,故将具备相同IO特性的Column放在一个Column Family会更高效

  HStore:      HBase存储的核心。由MemStore和StoreFile组成。      MemStore是Sorted Memory Buffer。用户写入数据的流程:

  

  Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增加到必定阈值 -> 触发Compact合并操做 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步造成愈来愈大的StoreFile -> 单个StoreFile大小超过必定阈值后,触发Split操做,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。 由此过程可知,HBase只是增长数据,有所得更新和删除操做,都是在Compact阶段作的,因此,用户写操做只须要进入到内存便可当即返回,从而保证I/O高性能。

  HLog      引入HLog缘由:      在分布式系统环境中,没法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种状况      工做机制:      每一个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操做写入Memstore的同时,也会写一份数据到HLog文件,HLog文件按期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会经过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不一样region的log数据拆分,分别放到相应region目录下,而后再将失效的region从新分配,领取到这些region的HRegionServer在Load Region的过程当中,会发现有历史HLog须要处理,所以会Replay HLog中的数据到MemStore中,而后flush到StoreFiles,完成数据恢复。

  HBase存储格式      HBase中的全部数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:      1 HFile HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile作了轻量级包装,即StoreFile底层就是HFile      2 HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File

  HFile

  

  图片解释:     HFile文件不定长,长度固定的块只有两个:Trailer和FileInfo      Trailer中指针指向其余数据块的起始点      File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等      Data Index和Meta Index块记录了每一个Data块和Meta块的起始点      Data Block是HBase I/O的基本单元,为了提升效率,HRegionServer中有基于LRU的Block Cache机制      每一个Data块的大小能够在建立一个Table的时候经过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询      每一个Data块除了开头的Magic之外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏

  HFile里面的每一个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了不少项,而且有固定的结构。

  

  KeyLength和ValueLength:两个固定的长度,分别表明Key和Value的长度     Key部分:Row Length是固定长度的数值,表示RowKey的长度,Row 就是RowKey      Column Family Length是固定长度的数值,表示Family的长度      接着就是Column Family,再接着是Qualifier,而后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)      Value部分没有这么复杂的结构,就是纯粹的二进制数据

  HLog File

  

  HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。     HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue

  

  结束语:这篇文章是我专门在网上弄下来的,算是hbase部分的终极篇吧,个人服务端的源码系列也要基于这个顺序来开展。

 

 

一.三层架构图

 

二.系统各层次职责
1.UI(User Interface)层的职责是数据的展示和采集,数据采集的结果一般以Entity object提交给BL层处理。Service Interface侧层用于将业务或数据资源发布为服务(如WebServices)。
2.BL(Business Logic)层的职责是按预约的业务逻辑处理UI层提交的请求。
(1)Business Function 子层负责基本业务功能的实现。
(2)Business Flow 子层负责将Business Function子层提供的多个基本业务功能组织成一个完整的业务流。(Transaction只能在Business Flow 子层开启。)
3.ResourceAccess层的职责是提供全面的资源访问功能支持,并向上层屏蔽资源的来源。
(1)BEM(Business Entity Manager)子层采用DataAccess子层和ServiceAccess子层来提供业务须要的基础数据/资源访问能力。
(2)DataAccess子层负责从数据库中存取资源,并向BEM子层屏蔽全部的SQL语句以及数据库类型差别。
DB Adapter子层负责屏蔽数据库类型的差别。
ORM子层负责提供对象-关系映射的功能。
Relation子层提供ORM没法完成的基于关系(Relation)的数据访问功能。
(3)ServiceAccess子层用于以SOA的方式从外部系统获取资源。
注: Service Entrance用于简化对Service的访问,它至关于Service的代理,客户直接使用Service Entrance就能够访问系统发布的服务。Service     Entrance为特定的平台(如Java、.Net)提供强类型的接口,内部可能隐藏了复杂的参数类型转换。
(4)ConfigAccess子层用于从配置文件中获取配置object或将配置object保存倒配置文件。
4.Entity侧层跨越UI/BEM/ResourceManager层,在这些层之间传递数据。Entity侧层中包含三类Entity,以下图所示:

 
三.Aspect
 Aspect贯穿于系统各层,是系统的横切关注点。一般采用AOP技术来对横切关注点进行建模和实现。
1.Securtiy Aspect:用于对整个系统的Security提供支持。
2.ErrorHandling Aspect:整个系统采用一致的错误/异常处理方式。
3.Log Aspect:用于系统异常、日志记录、业务操做记录等。

四.规则
1.系统各层次及层内部子层次之间都不得跨层调用。
2.Entity object 在各个层之间传递数据。
3.须要在UI层绑定到列表的数据采用基于关系的DataSet传递,除此以外,应该使用Entity object传递数据。
4.对于每个数据库表(Table)都有一个DB Entity class与之对应,针对每个Entity class都会有一个BEM Class与之对应。
5.有些跨数据库或跨表的操做(如复杂的联合查询)也须要由相应的BEM Class来提供支持。
6.对于相对简单的系统,能够考虑将Business Function子层和Business Flow 子层合并为一个。
7.UI层和BL层禁止出现任何SQL语句。

五.错误与异常
        异常能够分为系统异常(如网络忽然断开)和业务异常(如用户的输入值超出最大范围),业务异常必须被转化为业务执行的结果。
1.DataAccess层不得向上层隐藏任何异常(该层抛出的异常几乎都是系统异常)。
2.要明确区分业务执行的结果和系统异常。好比验证用户的合法性,若是对应的用户ID不存在,不该该抛出异常,而是返回(或经过out参数)一个表示验证结果的枚举值,这属于业务执行的结果。可是,若是在从数据库中提取用户信息时,数据库链接忽然断开,则应该抛出系统异常。
3.在有些状况下,BL层应根据业务的须要捕获某些系统异常,并将其转化为业务执行的结果。好比,某个业务要求试探指定的数据库是否可链接,这时BL就须要将数据库链接失败的系统异常转换为业务执行的结果。
4.UI层(包括Service层)除了从调用BL层的API获取的返回值来查看业务的执行结果外,还须要截获全部的系统异常,并将其解释为友好的错误信息呈现给用户。

六.项目组织目结构
 以BAS系统为例。
1.主目录结构:
 
2.命名空间命名:每一个dll的根命名空间便是该dll的名字,如EAS.BL.dll的根命名空间就是EAS.BL。每一个根命名空间下面能够根据需求的分类而增长子命名空间,好比,EAS.BL的子空间EAS.BL.Order与EAS.BL.Permission分别处理不一样的业务逻辑。
3.包含众多子项目的庞大项目的物理组织:
 
核心子项目Core的位置:

 
Core子项目中包含一些公共的基础设施,如错误处理、权限控制方面等。

七.发布服务与服务回调
以EAS系统为例。
 
1.同UI层的Page同样,服务也不容许抛出任何异常,而是应该以返回错误码(int型,1表示成功,其它值表示失败)的形式来代表服务调用出现了错误,若是方法有返回值,则返回值以out参数提供。
2. 若是BAS系统提供了WebService(Remoting)服务,则BAS必须提供BAS.Entrance.dll。 BAS.Entrance.dll封装了与BAS服务交换信息的通讯机制,客户系统只要经过BAS.Entrance.dll就能够很是简便地访问BAS 提供的服务。
3.若是BAS须要经过WebService(Remoting)回调客户系统,则必须提供仅仅定义了接口的BAS.CallBack.dll,客户系统将引用该dll,实现其中的接口,并将其发布为服务,供BAS回调。
4.当WebService的参数或返回值须要是复杂类型――即架构图中的Service Entity,则Service Entity应该在对应的BAS.EntranceParaDef.dll或BAS.CallBackParaDef.dll中定义。 WebService定义的方法中的复杂类型应该使用Xml字符串代替(注意,Entrance和CallBack接口对应服务的方法的参数是强类型的),而Xml字符串和复杂类型对象之间的转换应当在BAS.Entrance.dll或BAS.CallBack.dll中实现。

 

 

    从上图中能够看出,Android系统架构为四层结构,从上层到下层分别是应用程序层、应用程序框架层、系统运行库层以及Linux内核层,分别介绍以下:

    1)应用程序层

         Android平台不只仅是操做系统,也包含了许多应用程序,诸如SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等应用程序。这些应用程序都是       用Java语言编写的,而且这些应用程序都是能够被开发人员开发的其余应用程序所替换,这点不一样于其余手机操做系统固化在系统内部的系统软件,更加灵活和个    性化。

    2)应用程序框架层

         应用程序框架层是咱们从事Android开发的基础,不少核心应用程序也是经过这一层来实现其核心功能的,该层简化了组件的重用,开发人员能够直接使用其提    供的组件来进行快速的应用程序开发,也能够经过继承而实现个性化的拓展。

         a) Activity Manager(活动管理器)

              管理各个应用程序生命周期以及一般的导航回退功能

         b) Window Manager(窗口管理器)

              管理全部的窗口程序

         c)  Content Provider(内容提供器)

              使得不一样应用程序之间存取或者分享数据

        d) View System(视图系统)

              构建应用程序的基本组件

         e) Notification Manager(通告管理器)

              使得应用程序能够在状态栏中显示自定义的提示信息

         f) Package Manager(包管理器) 

              Android系统内的程序管理

         g)Telephony Manager(电话管理器)

              管理全部的移动设备功能

         h)Resource Manager(资源管理器)

              提供应用程序使用的各类非代码资源,如本地化字符串、图片、布局文件、颜色文件等

         i)Location Manager(位置管理器)

             提供位置服务

         j)XMPP Service(XMPP服务)

             提供Google Talk服务 

    3)系统运行库层

         从图中能够看出,系统运行库层能够分红两部分,分别是系统库和Android运行时,分别介绍以下:

         a)系统库

              系统库是应用程序框架的支撑,是链接应用程序框架层与Linux内核层的重要纽带。其主要分为以下几个:

              Ø  Surface Manager:

                  执行多个应用程序时候,负责管理显示与存取操做间的互动,另外也负责2D绘图与3D绘图进行显示合成。 

     Ø  Media Framework: 

                  多媒体库,基于PacketVideo OpenCore;支持多种经常使用的音频、视频格式录制和回放,编码格式包括MPEG四、MP三、H.26四、AAC、ARM。

              Ø  SQLite:

                  小型的关系型数据库引擎 

              Ø  OpenGL|ES:

                 根据OpenGL ES 1.0API标准实现的3D绘图函数库 

              Ø  FreeType:

                  提供点阵字与向量字的描绘与显示 

              Ø  WebKit:

                  一套网页浏览器的软件引擎

              Ø  SGL:

                  底层的2D图形渲染引擎 

              Ø  SSL:

                  在Andorid上通讯过程当中实现握手 

              Ø  Libc:

             从BSD继承来的标准C系统函数库,专门为基于embedded linux的设备定制

         b)Android运行时

             Android应用程序时采用Java语言编写,程序在Android运行时中执行,其运行时分为核心库和Dalvik虚拟机两部分。

             Ø  核心库

                 核心库提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如android.os、android.net、android.media等等。

             Ø  Dalvik虚拟机

                 Android程序不一样于J2me程序,每一个Android应用程序都有一个专有的进程,而且不是多个程序运行在一个虚拟机中,而是每一个Android程序都有一                个Dalivik虚拟机的实例,并在该实例中执行。Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化          以及支持多个虚拟机的特色。须要注意的是,不一样于J2me,Android程序在虚拟机中执行的并不是编译后的字节码,而是经过转换工具dx将Java字节码转成dex格          式的中间码。

    4)Linux内核层 

        Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。

 

 

Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架。

Entity Framework的主要特色:

1. 支持多种数据库(Microsoft SQL Server, Oracle, and DB2);

2. 强劲的映射引擎,能很好地支持存储过程;

3. 提供Visual Studio集成工具,进行可视化操做;

4. 可以与ASP.NET, WPF, WCF, WCF Data Services进行很好的集成。

架构图一

架构图2

 

 

 

  刚刚来到一家新公司,首先会对项目进行一个大体了解,研究了两天了,有了个整体的把握了,下面就是我这个小菜鸟画的简单系统架构图!  

  有的时候架构庞大的吓人,有的时候架构一眼看穿,但里面却暗藏杀机,真的须要咱们去认真学习,揣摩!

  不久前在园子里面看过一篇文章其中说道,设计架构无非就是一个字 → “”,当时看到这个字,想起来还真的是这么一回事,不过这里面去包含了不少的东西,咱们如今就是不知道怎么拆,这个也不是一时半会可以了解的,须要咱们认认真真的作,慢慢的积累,到时候就知道怎么拆了,并且还拆的很到位,因此加油!

  对于这个拆字园友们也给出了不少的理解,这是只是我的见解!

 

 

 

Struts2 架构图

Struts2架构图 


        请求首先经过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher;FilterDispatcher主要经过AcionMapper来决定须要调用哪一个Action。 
        ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里建立ActionProxy,ActionProxy建立ActionInvocation,而后ActionInvocation调用Interceptors,执行Action自己,建立Result并返回,固然,若是要在返回以前作些什么,能够实现PreResultListener。 


Struts2部分类介绍 
这部分从Struts2参考文档中翻译就能够了。 
ActionMapper 
        ActionMapper实际上是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等java Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处能够根据本身的须要来设计url格式,它本身也有Restful的实现,具体能够参考文档的docs\actionmapper.html。 
ActionProxy&ActionInvocation 
        Action的一个代理,由ActionProxyFactory建立,它自己不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy做用是如何取得Action,不管是本地仍是远程。而ActionInvocation的做用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。 
ConfigurationProvider&Configuration 
        ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤为实现类XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析, 


Struts2请求流程 
一、客户端发送请求 
二、请求先经过ActionContextCleanUp-->FilterDispatcher 
三、FilterDispatcher经过ActionMapper来决定这个Request须要调用哪一个Action 
四、若是ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行 
五、ActionProxy根据ActionMapping和ConfigurationManager找到须要调用的Action类 
六、ActionProxy建立一个ActionInvocation的实例 
七、ActionInvocation调用真正的Action,固然这涉及到相关拦截器的调用 
八、Action执行完毕,ActionInvocation建立Result并返回,固然,若是要在返回以前作些什么,能够实现PreResultListener。添加PreResultListener能够在Interceptor中实现,不知道其它还有什么方式? 

 

短链接聊天服务 ,每半分钟刷新一次..

客户端可切换3种渲染模式,全位图blit传输:sprite区块和MC

 

 

架构图:

模块与模块之间的通讯也经过sendNotifcation发送消息。

 

神仙道寻路方法:

1. 2点是否能够直接到达,能够,则不走寻路,直接行进 2. 2点不能直接到达,进行寻路,找不到结果,寻找替代点 3. 正常寻路

关于flash共享库:

若是a的库里的资源设置了共享资源并设置了一个url 把a发布的swf放到设置的url的位置 b引入a的库里共享的资源..再发布b..这时b会自动从那个设置的url加载a

浏览器缓存地址:C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files

网页游戏的swf都加载到这里了。

<深度排序>

那就不停的 遍历 更具显示对象的Y 设置它们再容器里面的深度  不知道把同屏显示对象的Y再数组里面排序好 再设置深度 速度快  仍是变排序边设置深度快 而且在数组里面排序好 这种方法要速度很好

把图层封装成一个类。 和NPC和玩家都共同继承一个接口 iworldObject 加一个属性 depth. 建立的时候设置 这个属性。而后sortOn("depth");

Array.Numberic 啊 默认都是 从小到大排序的 depth 是他的一个属性 npc 也统一有这个属性 而后就不用y轴排序了,看你的 y+height 挺纠结的 统一用 depth 这个属性排序

这里判断这个 玩家的深度若是已经符合,就不要排序。 setChildIndex 消耗挺大的

 

 

详解三层架构图

 PS: 在看三层架构的时候,找的了一个我感受不错的材料,里面有以下一张图,打算详细的解释一下这张图,也总结一下三层的知识

  

1、系统各层次职责

     1.UI(User Interface)层的职责是数据的展示和采集,数据采集的结果一般以Entity object提交给BL层处理Service Interface侧层用于将业务或数据资源发布为服务(如WebServices)。

    2.BL(Business Logic)层的职责是按预约的业务逻辑处理UI层提交的请求。

    (1)Business Function 子层负责基本业务功能的实现。

    (2)Business Flow 子层负责将Business Function子层提供的多个基本业务功能组织成一个完整的业务流(Transaction只能在Business Flow 子层开启。)

    3.ResourceAccess层的职责是提供全面的资源访问功能支持,并向上层屏蔽资源的来源。

  (1)BEM(Business Entity Manager)子层采用DataAccess子层和ServiceAccess子层来提供业务须要的基础数据/资源访问能力。

  (2)DataAccess子层负责从数据库中存取资源,并向BEM子层屏蔽全部的SQL语句以及数据库类型差别。

    DB Adapter子层负责屏蔽数据库类型的差别。

    ORM子层负责提供对象-关系映射的功能。

    Relation子层提供ORM没法完成的基于关系(Relation)的数据访问功能。

  (3)ServiceAccess子层用于以SOA的方式从外部系统获取资源。

         注:Service Entrance用于简化对Service的访问,它至关于Service的代理,客户直接使用Service Entrance就能够访问系统发布的服务。Service      Entrance为特定的平台(如Java、.Net)提供强类型的接口,内部可能隐藏了复杂的参数类型转换。

  (4)ConfigAccess子层用于从配置文件中获取配置object或将配置object保存倒配置文件。

    4.Entity侧层跨越UI/BEM/ResourceManager层,在这些层之间传递数据。Entity侧层中包含三类Entity,以下图所示:

  

2、Aspect

    Aspect贯穿于系统各层,是系统的横切关注点。一般采用AOP技术来对横切关注点进行建模和实现。

    1.Securtiy Aspect:用于对整个系统的Security提供支持。

    2.ErrorHandling Aspect:整个系统采用一致的错误/异常处理方式。

    3.Log Aspect:用于系统异常、日志记录、业务操做记录等。

 

3、规则

    1.系统各层次及层内部子层次之间都不得跨层调用。

    2.Entity object 在各个层之间传递数据。

    3.须要在UI层绑定到列表的数据采用基于关系的DataSet传递,除此以外,应该使用Entity object传递数据。

    4.对于每个数据库表(Table)都有一个DB Entity class与之对应,针对每个Entity class都会有一个BEM Class与之对应。

    5.有些跨数据库或跨表的操做(如复杂的联合查询)也须要由相应的BEM Class来提供支持。

    6.对于相对简单的系统,能够考虑将Business Function子层和Business Flow 子层合并为一个。

    7.UI层和BL层禁止出现任何SQL语句。

 

4、错误与异常

         异常能够分为系统异常(如网络忽然断开)和业务异常(如用户的输入值超出最大范围),业务异常必须被转化为业务执行的结果。

    1.DataAccess层不得向上层隐藏任何异常(该层抛出的异常几乎都是系统异常)。

    2.要明确区分业务执行的结果和系统异常。好比验证用户的合法性,若是对应的用户ID不存在,不该该抛出异常,而是返回(或经过out参数)一个表示验证 结果的枚举值,这属于业务执行的结果。可是,若是在从数据库中提取用户信息时,数据库链接忽然断开,则应该抛出系统异常。

    3.在有些状况下,BL层应根据业务的须要捕获某些系统异常,并将其转化为业务执行的结果。好比,某个业务要求试探指定的数据库是否可链接,这时BL就须要将数据库链接失败的系统异常转换为业务执行的结果。

    4.UI层(包括Service层)除了从调用BL层的API获取的返回值来查看业务的执行结果外,还须要截获全部的系统异常,并将其解释为友好的错误信息呈现给用户。

 

5、项目组织目结构

    以BAS系统为例。

     1.主目录结构:

 

     2.命名空间命名:每一个dll的根命名空间便是该dll的名字,如EAS.BL.dll的根命名空间就是EAS.BL。每一个根命名空间下面能够根据需求的 分类而增长子命名空间,好比,EAS.BL的子空间EAS.BL.Order与EAS.BL.Permission分别处理不一样的业务逻辑。

    3.包含众多子项目的庞大项目的物理组织:

 

核心子项目Core的位置:

 

 

Core子项目中包含一些公共的基础设施,如错误处理、权限控制方面等。

6、发布服务与服务回调

以EAS系统为例。

 

     1.同UI层的Page同样,服务也不容许抛出任何异常,而是应该以返回错误码(int型,1表示成功,其它值表示失败)的形式来代表服务调用出现了错误,若是方法有返回值,则返回值以out参数提供。

     2.若是BAS系统提供了WebService(Remoting)服务,则BAS必须提供BAS.Entrance.dll。 BAS.Entrance.dll封装了与BAS服务交换信息的通讯机制,客户系统只要经过BAS.Entrance.dll就能够很是简便地访问BAS 提供的服务。

     3.若是BAS须要经过WebService(Remoting)回调客户系统,则必须提供仅仅定义了接口的BAS.CallBack.dll,客户系统将引用该dll,实现其中的接口,并将其发布为服务,供BAS回调。

     4.当WebService的参数或返回值须要是复杂类型――即架构图中的Service Entity,则Service Entity应该在对应的BAS.EntranceParaDef.dll或BAS.CallBackParaDef.dll中定义。 WebService定义的方法中的复杂类型应该使用Xml字符串代替(注意,Entrance和CallBack接口对应服务的方法的参数是强类型 的),而Xml字符串和复杂类型对象之间的转换应当在BAS.Entrance.dll或BAS.CallBack.dll中实现。

 

 

 

  以前用一张图分析了Google给出的MVP架构,可是在Google给出的全部案例里面除了基本的MVP架构还有其它几种架构,今天就来分析其中的Clean架构。一样的,网上介绍Clean架构的文章不少,我也就不用文字过多叙述了,仍是用一张类图来分析一下Clean架构的这个案例吧。好了,先直接上图!

 

  

 

  上完图,再说一说我对Clean架构的一个理解吧。对比前一篇文章的MVP架构图能够看出,clean在必定程度上继承了mvp的设计思想,可是其抽象程度比mvp更高。初次看这个demo的时候,确实被震撼了一下——原来用Java能够这样写代码!!!跟以前用的一些项目框架和我本身平时写的一些代码对比一下,只能感叹clean的这种设计思想真不是通常的程序员能够想出来的。它对接口、抽象类和实现类之间的实现、继承、调用关系发挥到了一个比较高的层次,它并非像咱们平时写代码那样很直白地写下来,而是充分利用了面向对象的封装性、继承性和多态性,是对面向对象思想的一个高度理解。其实,要说clean复杂,它确实有些难理解,但是若是你真的理解了面向对象思想,那么又会以为这样的设计彻底在情理之中。

 

 

      最近几个月都没有整理Blog,都忙着整理总结以前一段时间作的项目和学习的内容,而后想到把这些东西融合在一块儿,设计一个开发框架。

这个框架用到了一些.NET社区比较前沿的技术,好比ORM, IOC容器, AOP拦截等,在.NET 2.0的基础上构建了一个.NET Remoting的分布式开发框架。

项目开发最关注的就是开发效率,其次是项目的可管理可控性,最后是架构的可扩展性。我但愿在个人框架设计中可以将这三者很好的整合在一块儿。

大体的思路是:

一、可扩展性:经过IOC容器的使用下降项目中各个模块之间的依赖性;用领域模式来设计业务核心层,下降业务层对数据层和界面层的耦合度;分布式选择Remoting为主,能够再包装为WebService或者直接发布为WebService。

二、将敏捷的项目管理思路引入到框架中,框架充分支持TDD测试驱动和运行日志驱动,为敏捷管理提供技术支持。

三、初步经过AOP技术减小和核心业务无关的系统级代码:如事务处理、异常处理、日志记录等;并在未来为架构提供可视化的代码配置生成工具,以最快的速度构建项目的主体结构,并尽量大的增大灵活性。

      目前框架的主体已经完成,也从新整理VSS上的项目结构,并从新命名为LightningFramework。正在作细节调整,接下来的时间会逐步完成相关文档和演示程序。下面是主架构图:

Framework总体架构设计图.jpg