版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
..軟件各種系統(tǒng)架構(gòu)圖發(fā)布一企業(yè)技術(shù)架構(gòu)圖,供大家參考。該技術(shù)架構(gòu)圖是本人根據(jù)多年企業(yè)技術(shù)架構(gòu)經(jīng)歷而制定,是企業(yè)技術(shù)的總架構(gòu)圖,希望對(duì)CTO們有所借鑒。簡(jiǎn)單說(shuō)明:1.中間件根底運(yùn)行環(huán)境是經(jīng)過(guò)統(tǒng)一規(guī)劃的以WebLogic、OSS為主的集群環(huán)境2.企業(yè)集成平臺(tái)是以根底業(yè)務(wù)應(yīng)用為根底效勞于上層平臺(tái)和根底業(yè)務(wù)應(yīng)用的高度集成平臺(tái)3.數(shù)據(jù)中心是企業(yè)公共數(shù)據(jù)的集中管理比方用戶數(shù)據(jù)、企業(yè)編碼,可以通過(guò)數(shù)據(jù)集成平臺(tái)或效勞集成平臺(tái)分發(fā)給其他應(yīng)用工程做了不少,都沒(méi)畫過(guò)架構(gòu)圖,這次被要求畫圖,畫的很丑,請(qǐng)大家看圖本身包含的系統(tǒng)架構(gòu)信息一、架構(gòu)整體圖1、核心是兩庫(kù)一線1.1接口總線所有算法功能抽象成接口,其局部接口的方法都是泛型方法,是為了解決某一大類問(wèn)題的1.2代碼庫(kù)代碼庫(kù)包含現(xiàn)接口總線中接口的各種實(shí)現(xiàn)1.3應(yīng)用庫(kù)提供用戶的界面或者提供給外部的效勞是通過(guò)容器配置調(diào)用算法庫(kù)中的代碼來(lái)實(shí)現(xiàn)的各種應(yīng)用二、應(yīng)用關(guān)系圖1、應(yīng)用通過(guò)配置從應(yīng)用庫(kù)中組裝出自己的應(yīng)用系統(tǒng)2、應(yīng)用本身之外的東西盡量使用攔截器處理(授權(quán)訪問(wèn)、權(quán)限數(shù)據(jù)推送、異常處理、緩存、日志等)3、使用消息隊(duì)列做高并發(fā)應(yīng)用支撐(秒殺類似應(yīng)用)4、使用分布式任務(wù)系統(tǒng)做周期作業(yè)、數(shù)據(jù)維護(hù)、數(shù)據(jù)計(jì)算等ENode架構(gòu)圖什么是ENodeENode是一個(gè).NET平臺(tái)下,純C#開發(fā)的,基于DDD,CQRS,ES,EDA,In-Memory架構(gòu)風(fēng)格的,可以幫助開發(fā)者開發(fā)高并發(fā)、高吞吐、可伸縮、可擴(kuò)展的應(yīng)用程序的一個(gè)應(yīng)用開發(fā)框架。開源工程地址:s://github./tangxuehua/enode作者博客地址:.blogs./netfocus/category/496012.htmlQQ交流群號(hào):185916873微信公眾號(hào):ENodeENode框架特色一個(gè)DDD開發(fā)框架,完美支持基于六邊形架構(gòu)思想的開發(fā)實(shí)現(xiàn)CQRS架構(gòu)思想,并且框架提供C端命令的處理結(jié)果的返回,支持同步返回和異步返回置EventSourcing〔ES〕架構(gòu)模式,讓C端的數(shù)據(jù)持久化變得通用化聚合根常駐存,in-memorydomainmodel聚合根的處理基于mandMailbox,EventMailbox的思想,類似ActorModel,ActorMailbox嚴(yán)格遵守聚合強(qiáng)一致性、聚合之間最終一致性的原那么GroupmitDomainevent基于聚合根ID+事件版本號(hào)的唯一索引,實(shí)現(xiàn)聚合根的樂(lè)觀并發(fā)控制框架保證mand的冪等處理通過(guò)聚合根ID對(duì)命令或事件進(jìn)展路由,做到最小的并發(fā)沖突、最大的并行處理消息發(fā)送和接收基于分布式消息隊(duì)列EQueue,支持分布式部署基于事件驅(qū)動(dòng)架構(gòu)式〔EDA,Event-DrivenArchitecture〕基于隊(duì)列的動(dòng)態(tài)擴(kuò)容/縮容EventDB中因?yàn)榇娣诺亩际遣豢勺兊氖录?,所以水平擴(kuò)展非常容易,框架可置支持支持ProcessManager〔Saga〕,以支持一個(gè)用戶操作跨多個(gè)聚合根的業(yè)務(wù)場(chǎng)景,如訂單處理,從而防止分布式事務(wù)的使用ENode實(shí)現(xiàn)了CQRS架構(gòu)面臨的大局部技術(shù)問(wèn)題,讓開發(fā)者可以專注于業(yè)務(wù)邏輯和業(yè)務(wù)流程的開發(fā),而無(wú)需關(guān)心純技術(shù)問(wèn)題晚上把公司應(yīng)用的架構(gòu)結(jié)合之前研究的東西梳理了下,整理了一架構(gòu)規(guī)劃圖,貼在這里備份下面是個(gè)人理解的做架構(gòu)的幾個(gè)要點(diǎn):1、系統(tǒng)平安這是首要考慮的,以這圖為例,網(wǎng)絡(luò)劃分為3個(gè)區(qū):a)DMZ區(qū)可以直接公網(wǎng)訪問(wèn),也可以與AppCore區(qū)互通,但不能直接與DBCore區(qū)互通(通常這里放置反向代理Web效勞器)b)AppCore區(qū)能與DMZ區(qū)、DBCore區(qū)互通,但是無(wú)法直接從公網(wǎng)訪問(wèn)(通常這里放置應(yīng)用效勞器、中間件效勞器之類)c)DBCore區(qū)僅與AppCore區(qū)互通(通常這里放置核心數(shù)據(jù)庫(kù))2、盡量消除單點(diǎn)故障上圖中,除了"硬件負(fù)載均衡〞節(jié)點(diǎn)外,其它節(jié)點(diǎn)都可以部署成集群〔DB有點(diǎn)特殊,傳統(tǒng)RDBMS要實(shí)現(xiàn)分布式/集群還是比擬困難的,要看具體采用的數(shù)據(jù)庫(kù)產(chǎn)品,并非所有數(shù)據(jù)庫(kù)都能方便的做Sharding〕,oss本身可以通過(guò)Domain模式+mod_cluster實(shí)現(xiàn)集群、Redis通過(guò)Master/Slave以Sentinel方式可以實(shí)現(xiàn)HA、IBMMQ本身就支持集群、FTPServer配合底層儲(chǔ)存陣列也可以做到HA、Nginx靜態(tài)資源效勞器自不必說(shuō)3、本錢盡量采用開源成熟產(chǎn)品,oss、redis、nginx、apache、mysql、rabbitMQ都是很好的選擇。硬件負(fù)載均衡通常本錢不低,但是效果明顯,如果實(shí)在沒(méi)錢,域名解析采用DNS輪詢策略,也能到達(dá)類似效果,只不過(guò)可靠性略差。4、Database問(wèn)題常規(guī)企業(yè)應(yīng)用中,傳統(tǒng)關(guān)系型數(shù)據(jù)仍然是主流,但是no-sql經(jīng)過(guò)這幾年開展,技術(shù)也日漸成熟了,一些非關(guān)鍵數(shù)據(jù)可以適當(dāng)采用no-sql數(shù)據(jù)庫(kù),比方:系統(tǒng)日志、報(bào)文歷史記錄這類相比照擬獨(dú)立,而且增長(zhǎng)迅速的數(shù)據(jù),可以考慮存儲(chǔ)到no-sqldb甚至HDFS、TFS等分布式開源文件系統(tǒng)中。如果系統(tǒng)數(shù)據(jù)量級(jí)到達(dá)單機(jī)RDBMS的上限,盡早考慮Sharding方案,目前mysql在這方面比擬成熟,其它數(shù)據(jù)庫(kù)就不好說(shuō)了。5、性能webserver、appserver這些一般都可以通過(guò)集群實(shí)現(xiàn)橫向擴(kuò),滿足性能日常增長(zhǎng)的需求。最大的障礙還是DB,如果規(guī)模真到達(dá)了DB的上限,還是考慮換分布式DB或者遷移到"云〞上吧。HBase系統(tǒng)架構(gòu)圖組成部件說(shuō)明Client:使用HBaseRPC機(jī)制與HMaster和HRegionServer進(jìn)展通信Client與HMaster進(jìn)展通信進(jìn)展管理類操作Client與HRegionServer進(jìn)展數(shù)據(jù)讀寫類操作Zookeeper:ZookeeperQuorum存儲(chǔ)-ROOT-表地址、HMaster地址HRegionServer把自己以Ephedral方式注冊(cè)到Zookeeper中,HMaster隨時(shí)感知各個(gè)HRegionServer的安康狀況Zookeeper防止HMaster單點(diǎn)問(wèn)題HMaster:HMaster沒(méi)有單點(diǎn)問(wèn)題,HBase中可以啟動(dòng)多個(gè)HMaster,通過(guò)Zookeeper的MasterElection機(jī)制保證總有一個(gè)Master在運(yùn)行主要負(fù)責(zé)Table和Region的管理工作:1管理用戶對(duì)表的增刪改查操作2管理HRegionServer的負(fù)載均衡,調(diào)整Region分布3RegionSplit后,負(fù)責(zé)新Region的分布4在HRegionServer停機(jī)后,負(fù)責(zé)失效HRegionServer上Region遷移HRegionServer:HBase中最核心的模塊,主要負(fù)責(zé)響應(yīng)用戶I/O請(qǐng)求,向HDFS文件系統(tǒng)中讀寫數(shù)據(jù)HRegionServer管理一些列HRegion對(duì)象;每個(gè)HRegion對(duì)應(yīng)Table中一個(gè)Region,HRegion由多個(gè)HStore組成;每個(gè)HStore對(duì)應(yīng)Table中一個(gè)ColumnFamily的存儲(chǔ);ColumnFamily就是一個(gè)集中的存儲(chǔ)單元,故將具有一樣IO特性的Column放在一個(gè)ColumnFamily會(huì)更高效HStore:HBase存儲(chǔ)的核心。由MemStore和StoreFile組成。MemStore是SortedMemoryBuffer。用戶寫入數(shù)據(jù)的流程:Client寫入->存入MemStore,一直到MemStore滿->Flush成一個(gè)StoreFile,直至增長(zhǎng)到一定閾值->觸發(fā)pact合并操作->多個(gè)StoreFile合并成一個(gè)StoreFile,同時(shí)進(jìn)展版本合并和數(shù)據(jù)刪除->當(dāng)StoreFilespact后,逐步形成越來(lái)越大的StoreFile->單個(gè)StoreFile大小超過(guò)一定閾值后,觸發(fā)Split操作,把當(dāng)前RegionSplit成2個(gè)Region,Region會(huì)下線,新Split出的2個(gè)孩子Region會(huì)被HMaster分配到相應(yīng)的HRegionServer上,使得原先1個(gè)Region的壓力得以分流到2個(gè)Region上。由此過(guò)程可知,HBase只是增加數(shù)據(jù),有所得更新和刪除操作,都是在pact階段做的,所以,用戶寫操作只需要進(jìn)入到存即可立即返回,從而保證I/O高性能。HLog引入HLog原因:在分布式系統(tǒng)環(huán)境中,無(wú)法防止系統(tǒng)出錯(cuò)或者宕機(jī),一旦HRegionServer意外退出,MemStore中的存數(shù)據(jù)就會(huì)喪失,引入HLog就是防止這種情況工作機(jī)制:每個(gè)HRegionServer中都會(huì)有一個(gè)HLog對(duì)象,HLog是一個(gè)實(shí)現(xiàn)WriteAheadLog的類,每次用戶操作寫入Memstore的同時(shí),也會(huì)寫一份數(shù)據(jù)到HLog文件,HLog文件定期會(huì)滾動(dòng)出新,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))。當(dāng)HRegionServer意外終止后,HMaster會(huì)通過(guò)Zookeeper感知,HMaster首先處理遺留的HLog文件,將不同region的log數(shù)據(jù)拆分,分別放到相應(yīng)region目錄下,然后再將失效的region重新分配,領(lǐng)取到這些region的HRegionServer在LoadRegion的過(guò)程中,會(huì)發(fā)現(xiàn)有歷史HLog需要處理,因此會(huì)ReplayHLog中的數(shù)據(jù)到MemStore中,然后flush到StoreFiles,完成數(shù)據(jù)恢復(fù)。HBase存儲(chǔ)格式HBase中的所有數(shù)據(jù)文件都存儲(chǔ)在HadoopHDFS文件系統(tǒng)上,格式主要有兩種:1HFileHBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式,HFile是Hadoop的二進(jìn)制格式文件,實(shí)際上StoreFile就是對(duì)HFile做了輕量級(jí)包裝,即StoreFile底層就是HFile2HLogFile,HBase中WAL〔WriteAheadLog〕的存儲(chǔ)格式,物理上是Hadoop的SequenceFileHFile圖片解釋:HFile文件不定長(zhǎng),長(zhǎng)度固定的塊只有兩個(gè):Trailer和FileInfoTrailer中指針指向其他數(shù)據(jù)塊的起始點(diǎn)FileInfo中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN,AVG_VALUE_LEN,LAST_KEY,PARATOR,MAX_SEQ_ID_KEY等DataIndex和MetaIndex塊記錄了每個(gè)Data塊和Meta塊的起始點(diǎn)DataBlock是HBaseI/O的根本單元,為了提高效率,HRegionServer中有基于LRU的BlockCache機(jī)制每個(gè)Data塊的大小可以在創(chuàng)立一個(gè)Table的時(shí)候通過(guò)參數(shù)指定,大號(hào)的Block有利于順序Scan,小號(hào)Block利于隨機(jī)查詢每個(gè)Data塊除了開頭的Magic以外就是一個(gè)個(gè)KeyValue對(duì)拼接而成,Magic容就是一些隨機(jī)數(shù)字,目的是防止數(shù)據(jù)損壞HFile里面的每個(gè)KeyValue對(duì)就是一個(gè)簡(jiǎn)單的byte數(shù)組。這個(gè)byte數(shù)組里面包含了很多項(xiàng),并且有固定的構(gòu)造。KeyLength和ValueLength:兩個(gè)固定的長(zhǎng)度,分別代表Key和Value的長(zhǎng)度Key局部:RowLength是固定長(zhǎng)度的數(shù)值,表示RowKey的長(zhǎng)度,Row就是RowKeyColumnFamilyLength是固定長(zhǎng)度的數(shù)值,表示Family的長(zhǎng)度接著就是ColumnFamily,再接著是Qualifier,然后是兩個(gè)固定長(zhǎng)度的數(shù)值,表示TimeStamp和KeyType〔Put/Delete〕Value局部沒(méi)有這么復(fù)雜的構(gòu)造,就是純粹的二進(jìn)制數(shù)據(jù)HLogFileHLog文件就是一個(gè)普通的HadoopSequenceFile,SequenceFile的Key是HLogKey對(duì)象,HLogKey中記錄了寫入數(shù)據(jù)的歸屬信息,除了table和region名字外,同時(shí)還包括sequencenumber和timestamp,timestamp是"寫入時(shí)間〞,sequencenumber的起始值為0,或者是最近一次存入文件系統(tǒng)中sequencenumber。HLogSequeceFile的Value是HBase的KeyValue對(duì)象,即對(duì)應(yīng)HFile中的KeyValue完畢語(yǔ):這篇文章是我專門在網(wǎng)上弄下來(lái)的,算是hbase局部的終極篇吧,我的效勞端的源碼系列也要基于這個(gè)順序來(lái)開展。一.三層架構(gòu)圖二.系統(tǒng)各層次職責(zé)1.UI〔UserInterface〕層的職責(zé)是數(shù)據(jù)的展現(xiàn)和采集,數(shù)據(jù)采集的結(jié)果通常以Entityobject提交給BL層處理。ServiceInterface側(cè)層用于將業(yè)務(wù)或數(shù)據(jù)資源發(fā)布為效勞〔如WebServices〕。2.BL〔BusinessLogic〕層的職責(zé)是按預(yù)定的業(yè)務(wù)邏輯處理UI層提交的請(qǐng)求?!?〕BusinessFunction子層負(fù)責(zé)根本業(yè)務(wù)功能的實(shí)現(xiàn)。〔2〕BusinessFlow子層負(fù)責(zé)將BusinessFunction子層提供的多個(gè)根本業(yè)務(wù)功能組織成一個(gè)完整的業(yè)務(wù)流?!睺ransaction只能在BusinessFlow子層開啟?!?.ResourceAccess層的職責(zé)是提供全面的資源訪問(wèn)功能支持,并向上層屏蔽資源的來(lái)源?!?〕BEM〔BusinessEntityManager〕子層采用DataAccess子層和ServiceAccess子層來(lái)提供業(yè)務(wù)需要的根底數(shù)據(jù)/資源訪問(wèn)能力?!?〕DataAccess子層負(fù)責(zé)從數(shù)據(jù)庫(kù)中存取資源,并向BEM子層屏蔽所有的SQL語(yǔ)句以及數(shù)據(jù)庫(kù)類型差異。DBAdapter子層負(fù)責(zé)屏蔽數(shù)據(jù)庫(kù)類型的差異。ORM子層負(fù)責(zé)提供對(duì)象-關(guān)系映射的功能。Relation子層提供ORM無(wú)法完成的基于關(guān)系〔Relation〕的數(shù)據(jù)訪問(wèn)功能。〔3〕ServiceAccess子層用于以SOA的方式從外部系統(tǒng)獲取資源。注:ServiceEntrance用于簡(jiǎn)化對(duì)Service的訪問(wèn),它相當(dāng)于Service的代理,客戶直接使用ServiceEntrance就可以訪問(wèn)系統(tǒng)發(fā)布的效勞。ServiceEntrance為特定的平臺(tái)〔如Java、.Net〕提供強(qiáng)類型的接口,部可能隱藏了復(fù)雜的參數(shù)類型轉(zhuǎn)換?!?〕ConfigAccess子層用于從配置文件中獲取配置object或?qū)⑴渲胦bject保存倒配置文件。4.Entity側(cè)層跨越UI/BEM/ResourceManager層,在這些層之間傳遞數(shù)據(jù)。Entity側(cè)層中包含三類Entity,如下列圖所示:三.AspectAspect貫穿于系統(tǒng)各層,是系統(tǒng)的橫切關(guān)注點(diǎn)。通常采用AOP技術(shù)來(lái)對(duì)橫切關(guān)注點(diǎn)進(jìn)展建模和實(shí)現(xiàn)。1.SecurtiyAspect:用于對(duì)整個(gè)系統(tǒng)的Security提供支持。2.ErrorHandlingAspect:整個(gè)系統(tǒng)采用一致的錯(cuò)誤/異常處理方式。3.LogAspect:用于系統(tǒng)異常、日志記錄、業(yè)務(wù)操作記錄等。四.規(guī)那么1.系統(tǒng)各層次及層部子層次之間都不得跨層調(diào)用。2.Entityobject在各個(gè)層之間傳遞數(shù)據(jù)。3.需要在UI層綁定到列表的數(shù)據(jù)采用基于關(guān)系的DataSet傳遞,除此之外,應(yīng)該使用Entityobject傳遞數(shù)據(jù)。4.對(duì)于每一個(gè)數(shù)據(jù)庫(kù)表〔Table〕都有一個(gè)DBEntityclass與之對(duì)應(yīng),針對(duì)每一個(gè)Entityclass都會(huì)有一個(gè)BEMClass與之對(duì)應(yīng)。5.有些跨數(shù)據(jù)庫(kù)或跨表的操作〔如復(fù)雜的聯(lián)合查詢〕也需要由相應(yīng)的BEMClass來(lái)提供支持。6.對(duì)于相對(duì)簡(jiǎn)單的系統(tǒng),可以考慮將BusinessFunction子層和BusinessFlow子層合并為一個(gè)。7.UI層和BL層制止出現(xiàn)任何SQL語(yǔ)句。五.錯(cuò)誤與異常異??梢苑譃橄到y(tǒng)異?!踩缇W(wǎng)絡(luò)突然斷開〕和業(yè)務(wù)異常〔如用戶的輸入值超出最大圍〕,業(yè)務(wù)異常必須被轉(zhuǎn)化為業(yè)務(wù)執(zhí)行的結(jié)果。1.DataAccess層不得向上層隱藏任何異?!苍搶訏伋龅漠惓缀醵际窍到y(tǒng)異常〕。2.要明確區(qū)分業(yè)務(wù)執(zhí)行的結(jié)果和系統(tǒng)異常。比方驗(yàn)證用戶的合法性,如果對(duì)應(yīng)的用戶ID不存在,不應(yīng)該拋出異常,而是返回〔或通過(guò)out參數(shù)〕一個(gè)表示驗(yàn)證結(jié)果的枚舉值,這屬于業(yè)務(wù)執(zhí)行的結(jié)果。但是,如果在從數(shù)據(jù)庫(kù)中提取用戶信息時(shí),數(shù)據(jù)庫(kù)連接突然斷開,那么應(yīng)該拋出系統(tǒng)異常。3.在有些情況下,BL層應(yīng)根據(jù)業(yè)務(wù)的需要捕獲某些系統(tǒng)異常,并將其轉(zhuǎn)化為業(yè)務(wù)執(zhí)行的結(jié)果。比方,某個(gè)業(yè)務(wù)要求試探指定的數(shù)據(jù)庫(kù)是否可連接,這時(shí)BL就需要將數(shù)據(jù)庫(kù)連接失敗的系統(tǒng)異常轉(zhuǎn)換為業(yè)務(wù)執(zhí)行的結(jié)果。4.UI層(包括Service層)除了從調(diào)用BL層的API獲取的返回值來(lái)查看業(yè)務(wù)的執(zhí)行結(jié)果外,還需要截獲所有的系統(tǒng)異常,并將其解釋為友好的錯(cuò)誤信息呈現(xiàn)給用戶。六.工程組織目構(gòu)造以BAS系統(tǒng)為例。1.主目錄構(gòu)造:2.命名空間命名:每個(gè)dll的根命名空間即是該dll的名字,如EAS.BL.dll的根命名空間就是EAS.BL。每個(gè)根命名空間下面可以根據(jù)需求的分類而增加子命名空間,比方,EAS.BL的子空間EAS.BL.Order與EAS.BL.Permission分別處理不同的業(yè)務(wù)邏輯。3.包含眾多子工程的龐大工程的物理組織:核心子工程Core的位置:Core子工程中包含一些公共的根底設(shè)施,如錯(cuò)誤處理、權(quán)限控制方面等。七.發(fā)布效勞與效勞回調(diào)以EAS系統(tǒng)為例。1.同UI層的Page一樣,效勞也不允許拋出任何異常,而是應(yīng)該以返回錯(cuò)誤碼(int型,1表示成功,其它值表示失敗)的形式來(lái)說(shuō)明效勞調(diào)用出現(xiàn)了錯(cuò)誤,如果方法有返回值,那么返回值以out參數(shù)提供。2.如果BAS系統(tǒng)提供了WebService〔Remoting〕效勞,那么BAS必須提供BAS.Entrance.dll。BAS.Entrance.dll封裝了與BAS效勞交換信息的通信機(jī)制,客戶系統(tǒng)只要通過(guò)BAS.Entrance.dll就可以非常簡(jiǎn)便地訪問(wèn)BAS提供的效勞。3.如果BAS需要通過(guò)WebService〔Remoting〕回調(diào)客戶系統(tǒng),那么必須提供僅僅定義了接口的BAS.CallBack.dll,客戶系統(tǒng)將引用該dll,實(shí)現(xiàn)其中的接口,并將其發(fā)布為效勞,供BAS回調(diào)。4.當(dāng)WebService的參數(shù)或返回值需要是復(fù)雜類型――即架構(gòu)圖中的ServiceEntity,那么ServiceEntity應(yīng)該在對(duì)應(yīng)的BAS.EntranceParaDef.dll或BAS.CallBackParaDef.dll中定義。WebService定義的方法中的復(fù)雜類型應(yīng)該使用Xml字符串代替〔注意,Entrance和CallBack接口對(duì)應(yīng)效勞的方法的參數(shù)是強(qiáng)類型的〕,而Xml字符串和復(fù)雜類型對(duì)象之間的轉(zhuǎn)換應(yīng)當(dāng)在BAS.Entrance.dll或BAS.CallBack.dll中實(shí)現(xiàn)。從上圖中可以看出,Android系統(tǒng)架構(gòu)為四層構(gòu)造,從上層到下層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層以及Linux核層,分別介紹如下:1〕應(yīng)用程序?qū)覣ndroid平臺(tái)不僅僅是操作系統(tǒng),也包含了許多應(yīng)用程序,諸如SMS短信客戶端程序、撥號(hào)程序、圖片瀏覽器、Web瀏覽器等應(yīng)用程序。這些應(yīng)用程序都是用Java語(yǔ)言編寫的,并且這些應(yīng)用程序都是可以被開發(fā)人員開發(fā)的其他應(yīng)用程序所替換,這點(diǎn)不同于其他手機(jī)操作系統(tǒng)固化在系統(tǒng)部的系統(tǒng)軟件,更加靈活和個(gè)性化。2〕應(yīng)用程序框架層應(yīng)用程序框架層是我們從事Android開發(fā)的根底,很多核心應(yīng)用程序也是通過(guò)這一層來(lái)實(shí)現(xiàn)其核心功能的,該層簡(jiǎn)化了組件的重用,開發(fā)人員可以直接使用其提供的組件來(lái)進(jìn)展快速的應(yīng)用程序開發(fā),也可以通過(guò)繼承而實(shí)現(xiàn)個(gè)性化的拓展。a〕ActivityManager〔活動(dòng)管理器〕管理各個(gè)應(yīng)用程序生命周期以及通常的導(dǎo)航回退功能b〕WindowManager〔窗口管理器〕管理所有的窗口程序c〕ContentProvider〔容提供器〕使得不同應(yīng)用程序之間存取或者分享數(shù)據(jù)d〕ViewSystem〔視圖系統(tǒng)〕構(gòu)建應(yīng)用程序的根本組件e〕NotificationManager(通告管理器)使得應(yīng)用程序可以在狀態(tài)欄中顯示自定義的提示信息f〕PackageManager〔包管理器〕Android系統(tǒng)的程序管理g〕TelephonyManager(管理器)管理所有的移動(dòng)設(shè)備功能h〕ResourceManager〔資源管理器〕提供給用程序使用的各種非代碼資源,如本地化字符串、圖片、布局文件、顏色文件等i〕LocationManager(位置管理器)提供位置效勞j〕XMPPService〔XMPP效勞〕提供GoogleTalk效勞3〕系統(tǒng)運(yùn)行庫(kù)層從圖中可以看出,系統(tǒng)運(yùn)行庫(kù)層可以分成兩局部,分別是系統(tǒng)庫(kù)和Android運(yùn)行時(shí),分別介紹如下:a〕系統(tǒng)庫(kù)系統(tǒng)庫(kù)是應(yīng)用程序框架的支撐,是連接應(yīng)用程序框架層與Linux核層的重要紐帶。其主要分為如下幾個(gè):"SurfaceManager:執(zhí)行多個(gè)應(yīng)用程序時(shí)候,負(fù)責(zé)管理顯示與存取操作間的互動(dòng),另外也負(fù)責(zé)2D繪圖與3D繪圖進(jìn)展顯示合成。"MediaFramework:多媒體庫(kù),基于PacketVideoOpenCore;支持多種常用的音頻、視頻格式錄制和回放,編碼格式包括MPEG4、MP3、H.264、AAC、ARM。"SQLite:小型的關(guān)系型數(shù)據(jù)庫(kù)引擎"OpenGL|ES:根據(jù)OpenGLES1.0API標(biāo)準(zhǔn)實(shí)現(xiàn)的3D繪圖函數(shù)庫(kù)"FreeType:提供點(diǎn)陣字與向量字的描繪與顯示"WebKit:一套網(wǎng)頁(yè)瀏覽器的軟件引擎"SGL:底層的2D圖形渲染引擎"SSL:在Andorid上通信過(guò)程中實(shí)現(xiàn)握手"Libc:從BSD繼承來(lái)的標(biāo)準(zhǔn)C系統(tǒng)函數(shù)庫(kù),專門為基于embeddedlinux的設(shè)備定制b〕Android運(yùn)行時(shí)Android應(yīng)用程序時(shí)采用Java語(yǔ)言編寫,程序在Android運(yùn)行時(shí)中執(zhí)行,其運(yùn)行時(shí)分為核心庫(kù)和Dalvik虛擬機(jī)兩局部。"核心庫(kù)核心庫(kù)提供了Java語(yǔ)言API中的大多數(shù)功能,同時(shí)也包含了Android的一些核心API,如android.os、、android.media等等。"Dalvik虛擬機(jī)Android程序不同于J2me程序,每個(gè)Android應(yīng)用程序都有一個(gè)專有的進(jìn)程,并且不是多個(gè)程序運(yùn)行在一個(gè)虛擬機(jī)中,而是每個(gè)Android程序都有一個(gè)Dalivik虛擬機(jī)的實(shí)例,并在該實(shí)例中執(zhí)行。Dalvik虛擬機(jī)是一種基于存放器的Java虛擬機(jī),而不是傳統(tǒng)的基于棧的虛擬機(jī),并進(jìn)展了存資源使用的優(yōu)化以及支持多個(gè)虛擬機(jī)的特點(diǎn)。需要注意的是,不同于J2me,Android程序在虛擬機(jī)中執(zhí)行的并非編譯后的字節(jié)碼,而是通過(guò)轉(zhuǎn)換工具dx將Java字節(jié)碼轉(zhuǎn)成dex格式的中間碼。4〕Linux核層Android是基于Linux2.6核,其核心系統(tǒng)效勞如平安性、存管理、進(jìn)程管理、網(wǎng)路協(xié)議以及驅(qū)動(dòng)模型都依賴于Linux核。EntityFramework的全稱是ADO.NETEntityFramework,是微軟開發(fā)的基于ADO.NET的ORM(Object/RelationalMapping)框架。EntityFramework的主要特點(diǎn):1.支持多種數(shù)據(jù)庫(kù)〔MicrosoftSQLServer,Oracle,andDB2〕;2.強(qiáng)勁的映射引擎,能很好地支持存儲(chǔ)過(guò)程;3.提供VisualStudio集成工具,進(jìn)展可視化操作;4.能夠與ASP.NET,WPF,WCF,WCFDataServices進(jìn)展很好的集成。架構(gòu)圖一架構(gòu)圖2剛剛來(lái)到一家新公司,首先會(huì)對(duì)工程進(jìn)展一個(gè)大致了解,研究了兩天了,有了個(gè)總體的把握了,下面就是我這個(gè)小菜鳥畫的簡(jiǎn)單系統(tǒng)架構(gòu)圖!有的時(shí)候架構(gòu)龐大的嚇人,有的時(shí)候架構(gòu)一眼看穿,但里面卻暗藏殺機(jī),真的需要我們?nèi)フJ(rèn)真學(xué)習(xí),揣摩!不久前在園子里面看過(guò)一篇文章其中說(shuō)道,設(shè)計(jì)架構(gòu)無(wú)非就是一個(gè)字→"拆〞,當(dāng)時(shí)看到這個(gè)字,想起來(lái)還真的是這么一回事,不過(guò)這里面去包含了很多的東西,我們現(xiàn)在就是不知道怎么拆,這個(gè)也不是一時(shí)半會(huì)能夠了解的,需要我們認(rèn)認(rèn)真真的做,慢慢的積累,到時(shí)候就知道怎么拆了,而且還拆的很到位,所以加油!對(duì)于這個(gè)拆字園友們也給出了很多的理解,這是只是個(gè)人看法!Struts2架構(gòu)圖Struts2架構(gòu)圖請(qǐng)求首先通過(guò)Filterchain,F(xiàn)ilter主要包括ActionContextCleanUp,它主要清理當(dāng)前線程的ActionContext和Dispatcher;FilterDispatcher主要通過(guò)AcionMapper來(lái)決定需要調(diào)用哪個(gè)Action。ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里創(chuàng)立ActionProxy,ActionProxy創(chuàng)立ActionInvocation,然后ActionInvocation調(diào)用Interceptors,執(zhí)行Action本身,創(chuàng)立Result并返回,當(dāng)然,如果要在返回之前做些什么,可以實(shí)現(xiàn)PreResultListener。Struts2局部類介紹這局部從Struts2參考文檔中翻譯就可以了。ActionMapperActionMapper其實(shí)是ServletRequest和Action調(diào)用請(qǐng)求的一個(gè)映射,它屏蔽了Action對(duì)于Request等javaServlet類的依賴。Struts2中它的默認(rèn)實(shí)現(xiàn)類是DefaultActionMapper,ActionMapper很大的用處可以根據(jù)自己的需要來(lái)設(shè)計(jì)url格式,它自己也有Restful的實(shí)現(xiàn),具體可以參考文檔的docs\actionmapper.html。ActionProxy&ActionInvocationAction的一個(gè)代理,由ActionProxyFactory創(chuàng)立,它本身不包括Action實(shí)例,默認(rèn)實(shí)現(xiàn)DefaultActionProxy是由ActionInvocation持有Action實(shí)例。ActionProxy作用是如何取得Action,無(wú)論是本地還是遠(yuǎn)程。而ActionInvocation的作用是如何執(zhí)行Action,攔截器的功能就是在ActionInvocation中實(shí)現(xiàn)的。ConfigurationProvider&ConfigurationConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其實(shí)現(xiàn)類XmlConfigurationProvider及其子類StrutsXmlConfigurationProvider來(lái)解析,Struts2請(qǐng)求流程1、客戶端發(fā)送請(qǐng)求2、請(qǐng)求先通過(guò)ActionContextCleanUp-->FilterDispatcher3、FilterDispatcher通過(guò)ActionMapper來(lái)決定這個(gè)Request需要調(diào)用哪個(gè)Action4、如果ActionMapper決定調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy,這兒已經(jīng)轉(zhuǎn)到它的Delegate--Dispatcher來(lái)執(zhí)行5、ActionProxy根據(jù)ActionMapping和ConfigurationManager找到需要調(diào)用的Action類6、ActionProxy創(chuàng)立一個(gè)ActionInvocation的實(shí)例7、ActionInvocation調(diào)用真正的Action,當(dāng)然這涉及到相關(guān)攔截器的調(diào)用8、Action執(zhí)行完畢,ActionInvocation創(chuàng)立Result并返回,當(dāng)然,如果要在返回之前做些什么,可以實(shí)現(xiàn)PreResultListener。添加PreResultListener可以在Interceptor中實(shí)現(xiàn),不知道其它還有什么方式?短連接聊天效勞,每半分鐘刷新一次..客戶端可切換3種渲染模式,全位圖blit傳輸:sprite區(qū)塊和MC架構(gòu)圖:模塊與模塊之間的通信也通過(guò)sendNotifcation發(fā)送消息。神仙道尋路方法:1.2點(diǎn)是否可以直接到達(dá),可以,那么不走尋路,直接行進(jìn)2.2點(diǎn)不能直接到達(dá),進(jìn)展尋路,找不到結(jié)果,尋找替代點(diǎn)3.正常尋路關(guān)于flash共享庫(kù):如果a的庫(kù)里的資源設(shè)置了共享資源并設(shè)置了一個(gè)url把a(bǔ)發(fā)布的swf放到設(shè)置的url的位置b引入a的庫(kù)里共享的資源..再發(fā)布b..這時(shí)b會(huì)自動(dòng)從那個(gè)設(shè)置的url加載a瀏覽器緩存地址:C:\DocumentsandSettings\Administrator\LocalSettings\TemporaryInternetFiles網(wǎng)頁(yè)游戲的swf都加載到這里了。<深度排序>那就不停的遍歷更具顯示對(duì)象的Y設(shè)置它們?cè)偃萜骼锩娴纳疃炔恢腊淹溜@示對(duì)象的Y再數(shù)組里面排序好再設(shè)置深度速度快還是變排序邊設(shè)置深度快并且在數(shù)組里面排序好這種方法要速度很好把圖層封裝成一個(gè)類。和NPC和玩家都共同繼承一個(gè)接口iworldObject加一個(gè)屬性depth.創(chuàng)立的時(shí)候設(shè)置這個(gè)屬性。然后sortOn("depth");Array.Numberic啊默認(rèn)都是從小到大排序的depth是他的一個(gè)屬性npc也統(tǒng)一有這個(gè)屬性然后就不用y軸排序了,看你的y+height挺糾結(jié)的統(tǒng)一用depth這個(gè)屬性排序這里判斷這個(gè)玩家的深度如果已經(jīng)符合,就不要排序。setChildIndex消耗挺大的詳解三層架構(gòu)圖PS:在看三層架構(gòu)的時(shí)候,找的了一個(gè)我感覺(jué)不錯(cuò)的材料,里面有如下一圖,打算詳細(xì)的解釋一下這圖,也總結(jié)一下三層的知識(shí)一、系統(tǒng)各層次職責(zé)1.UI〔UserInterface〕層的職責(zé)是數(shù)據(jù)的展現(xiàn)和采集,數(shù)據(jù)采集的結(jié)果通常以Entityobject提交給BL層處理ServiceInterface側(cè)層用于將業(yè)務(wù)或數(shù)據(jù)資源發(fā)布為效勞〔如WebServices〕。2.BL〔BusinessLogic〕層的職責(zé)是按預(yù)定的業(yè)務(wù)邏輯處理UI層提交的請(qǐng)求?!?〕BusinessFunction子層負(fù)責(zé)根本業(yè)務(wù)功能的實(shí)現(xiàn)。〔2〕BusinessFlow子層負(fù)責(zé)將BusinessFunction子層提供的多個(gè)根本業(yè)務(wù)功能組織成一個(gè)完整的業(yè)務(wù)流〔Transaction只能在BusinessFlow子層開啟?!?.ResourceAccess層的職責(zé)是提供全面的資源訪問(wèn)功能支持,并向上層屏蔽資源的來(lái)源?!?〕BEM〔BusinessEntityManager〕子層采用DataAccess子層和ServiceAccess子層來(lái)提供業(yè)務(wù)需要的根底數(shù)據(jù)/資源訪問(wèn)能力。〔2〕DataAccess子層負(fù)責(zé)從數(shù)據(jù)庫(kù)中存取資源,并向BEM子層屏蔽所有的SQL語(yǔ)句以及數(shù)據(jù)庫(kù)類型差異。DBAdapter子層負(fù)責(zé)屏蔽數(shù)據(jù)庫(kù)類型的差異。ORM子層負(fù)責(zé)提供對(duì)象-關(guān)系映射的功能。Relation子層提供ORM無(wú)法完成的基于關(guān)系〔Relation〕的數(shù)據(jù)訪問(wèn)功能?!?〕ServiceAccess子層用于以SOA的方式從外部系統(tǒng)獲取資源。注:ServiceEntrance用于簡(jiǎn)化對(duì)Service的訪問(wèn),它相當(dāng)于Service的代理,客戶直接使用ServiceEntrance就可以訪問(wèn)系統(tǒng)發(fā)布的效勞。ServiceEntrance為特定的平臺(tái)〔如Java、.Net〕提供強(qiáng)類型的接口,部可能隱藏了復(fù)雜的參數(shù)類型轉(zhuǎn)換?!?〕ConfigAccess子層用于從配置文件中獲取配置object或?qū)⑴渲胦bject保存倒配置文件。4.Entity側(cè)層跨越UI/BEM/ResourceManager層,在這些層之間傳遞數(shù)據(jù)。Entity側(cè)層中包含三類Entity,如下列圖所示:二、AspectAspect貫穿于系統(tǒng)各層,是系統(tǒng)的橫切關(guān)注點(diǎn)。通常采用AOP技術(shù)來(lái)對(duì)橫切關(guān)注點(diǎn)進(jìn)展建模和實(shí)現(xiàn)。1.SecurtiyAspect:用于對(duì)整個(gè)系統(tǒng)的Security提供支持。2.ErrorHandlingAspect:整個(gè)系統(tǒng)采用一致的錯(cuò)誤/異常處理方式。3.LogAspect:用于系統(tǒng)異常、日志記錄、業(yè)務(wù)操作記錄等。三、規(guī)那么1.系統(tǒng)各層次及層部子層次之間都不得跨層調(diào)用。2.Entityobject在各個(gè)層之間傳遞數(shù)據(jù)。3.需要在UI層綁定到列表的數(shù)據(jù)采用基于關(guān)系的DataSet傳遞,除此之外,應(yīng)該使用Entityobject傳遞數(shù)據(jù)。4.對(duì)于每一個(gè)數(shù)據(jù)庫(kù)表〔Table〕都有一個(gè)DBEntityclass與之對(duì)應(yīng),針對(duì)每一個(gè)Entityclass都會(huì)有一個(gè)BEMClass與之對(duì)應(yīng)。5.有些跨數(shù)據(jù)庫(kù)或跨表的操作〔如復(fù)雜的聯(lián)合查詢〕也需要由相應(yīng)的BEMClass來(lái)提供支持。6.對(duì)于相對(duì)簡(jiǎn)單的系統(tǒng),可以考慮將BusinessFunction子層和BusinessFlow子層合并為一個(gè)。7.UI層和BL層制止出現(xiàn)任何SQL語(yǔ)句。四、錯(cuò)誤與異常異??梢苑譃橄到y(tǒng)異?!踩缇W(wǎng)絡(luò)突然斷開〕和業(yè)務(wù)異常〔如用戶的輸入值超出最大圍〕,業(yè)務(wù)異常必須被轉(zhuǎn)化為業(yè)務(wù)執(zhí)行的結(jié)果。1.DataAccess層不得向上層隱藏任何異常〔該層拋出的異常幾乎都是系統(tǒng)異?!?。2.要明確區(qū)分業(yè)務(wù)執(zhí)行的結(jié)果和系統(tǒng)異常。比方驗(yàn)證用戶的合法性,如果對(duì)應(yīng)的用戶ID不存在,不應(yīng)該拋出異常,而是返回〔或通過(guò)out參數(shù)〕一個(gè)表示驗(yàn)證結(jié)果的枚舉值,這屬于業(yè)務(wù)執(zhí)行的結(jié)果。但是,如果在從數(shù)據(jù)庫(kù)中提取用戶信息時(shí),數(shù)據(jù)庫(kù)連接突然斷開,那么應(yīng)該拋出系統(tǒng)異常。3.在有些情況下,BL層應(yīng)根據(jù)業(yè)務(wù)的需要捕獲某些系統(tǒng)異常,并將其轉(zhuǎn)化為業(yè)務(wù)執(zhí)行的結(jié)果。比方,某個(gè)業(yè)務(wù)要求試探指定的數(shù)據(jù)庫(kù)是否可連接,這時(shí)BL就需要將數(shù)據(jù)庫(kù)連接失敗的系統(tǒng)異常轉(zhuǎn)換為業(yè)務(wù)執(zhí)行的結(jié)果。4.UI層(包括Service層)除了從調(diào)用BL層的API獲取的返回值來(lái)查看業(yè)務(wù)的執(zhí)行結(jié)果外,還需要截獲所有的系統(tǒng)異常,并將其解釋為友好的錯(cuò)誤信息呈現(xiàn)給用戶。五、工程組織目構(gòu)造以BAS系統(tǒng)為例。1.主目錄構(gòu)造:2.命名空間命名:每個(gè)dll的根命名空間即是該dll的名字,如EAS.BL.dll的根命名空間就是EAS.BL。每個(gè)根命名空間下面可以根據(jù)需求的分類而增加子命名空間,比方,EAS.BL的子空間EAS.BL.Order與EAS.BL.Permission分別處理不同的業(yè)務(wù)邏輯。3.包含眾多子工程的龐大工程的物理組織:核心子工程Core的位置:Core子工程中
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽(yáng)理工大學(xué)《產(chǎn)品創(chuàng)新設(shè)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- 合同到期了單位不續(xù)簽通知模板
- 2024年拉薩駕駛員客運(yùn)資格證模擬考試題及答案詳解
- 2024簡(jiǎn)單版機(jī)動(dòng)車借款抵押合同
- 2024服裝制作合同
- 2024防水材料采購(gòu)合同
- 2024深圳建設(shè)工程技術(shù)咨詢合同樣本
- 2024光伏發(fā)電安裝合同范本光伏發(fā)電安裝合同范本
- 2024教師聘用合同
- 2024幼兒園裝修改造工程施工合同
- 幼兒園繪本故事:《老虎拔牙》 課件
- 2021年上半年《系統(tǒng)集成項(xiàng)目管理工程師》真題
- 一個(gè)冬天的童話 遇羅錦
- GB/T 706-2008熱軋型鋼
- 實(shí)驗(yàn)六 雙子葉植物莖的初生結(jié)構(gòu)和單子葉植物莖的結(jié)構(gòu)
- GB/T 25032-2010生活垃圾焚燒爐渣集料
- GB/T 13610-2020天然氣的組成分析氣相色譜法
- 《彩虹》教案 省賽一等獎(jiǎng)
- 2023年湖南建筑工程初中級(jí)職稱考試基礎(chǔ)知識(shí)
- 沈陽(yáng)機(jī)場(chǎng)航站樓擴(kuò)建工程安裝施工組織設(shè)計(jì)
- 司法考試:證據(jù)法
評(píng)論
0/150
提交評(píng)論