【PaPaPa】系统架构搭建浅析 - 人人可以搭架构
| 声明 |
【PaPaPa】这个项目是以技术分享与研究为目的而做的,并非商业项目,所以更多的是提供一种思路,请勿直接在项目中使用。
上一篇隐藏开源项目地址实属无奈,为了寻找一起做这件事的同伴不得已刷了一天推荐,在此希望大家能够理解。
从此篇开始将完全公开项目地址以及所有项目中涉及到的细节,包括文档、讨论过程、设计思路、实现方法全部整理出来写成一个系列,这个将在后续文章中一一揭开,敬请期待。
本项目与博文系列将秉承着“授人以渔”的方式写作,尽自己绵薄之力为C#出一份力以回馈我从C#中得到的快乐和生活上的改善。
同时因为本项目不涉及分布式和大数据方面的内容,所以本博文系列也不会有这方面的内容,即便是应用了Redis,也只是以缓存的方式来使用。
最后本着不想误人子弟的想法,欢迎各位同行斧正错误!
| 什么是软件架构 |
软件架构分逻辑架构、物理架构、系统架构。
一般情况下系统架构师会出起码包含以上3个部分的文档,而部分分工明细的公司,物理架构关于服务器配置与网络的章节由运维部(或其他类似职责部门)来补充或修改。
有此可以看出一个合格的系统架构师,他/她的知识广度是很恐怖的。
当然本文并不是一个维基百科或百度百科,所以只是浅谈即止。
| 系统架构如何产生 |
首先明确一点的,万能是因为它是一个兼顾与取舍的博弈,没有一个系统架构可以拍着胸脯说:我可以应用到任何场景。
系统架构与业务有着强烈的依赖关系,业务左右系统架构,而系统架构有时在特殊情况下也可能会影响业务做适当调整。
既然说到业务左右系统架构,那么很明显,要先有业务才有系统架构。
| 需求文档 |
需求文档是业务的可视化输出。正常情况下此文档由产品经理或需求专员来撰写,用来描述软件所包含的业务。
下面我们只简单的拿个【PaPaPa】项目在建立时‘老虎’随手画的2个脑图,现在的需求文档已经从v0.1-v0.4了,目前正在整理新版中,预计下周会出。


上面2副只是其中讨论过程中出现的比较典型的而已,当然正式的需求文档肯定不会是这个样子了。
| 系统架构搭建过程 |
| 浅析业务模块 |
从上面图中可以看出大概分为Web端和移动端两个大的部分,
由于急着赶出一个雏形,我们当时确定了移动端的放到后面再做,所以暂时仅仅考虑了扩展而没有规划。
虽然延期了,但是系统架构搭建时必然是要考虑到这点的,否则后面的修改会让你很是头疼。
| 解决方案文件夹 |
解决方案文件夹有助于帮助我们将类库进行归类,比较常见的是类似下面这样

当然,根据每个人的喜好命名会有所不同,有的项目需要可能会没有Test,也有的可能会把Business和Core合并等等。
而我们的划分则是上图这样,区分业务和核心是因为核心层提供了底层的数据操作。业务来组装这些操作来满足业务需求。
而这一块则是配合上面说到的,将来要做移动端,而移动端业务跟Web端是有一些差别的,不论是从接口数量还是接口内容都会有出入。
| 类库命名 |
以业务层为例,PaPaPa.Web.* 为一组。
其中PaPaPa则是项目名称,Web则是分属哪一个业务模块,那么移动端的命名呼之欲出的方式则可能是 PaPaPa.Mobile.*

| 如何区分核心层、业务层、基础设施层 |
由于其他分层并没有什么可想说的内容,所以其他的就忽略了。有疑问可单独提出。
我们先简单了解一下:
核心层:被业务层包围,给业务层提供底层操作支持,如DB、缓存等。
业务层:借助核心层提供的功能封装不同模块的业务。
基础设施层:给所有的层提供最基础的底层支持(不包含任何业务逻辑),以PaPaPa项目为例,包括但不限于:通用缓存操作(缓存监控)、通用类库、DB操作、通用的模型与实体映射、缓存操作。此层还应该有很高的移植性,在创建新项目时,此层可直接拷贝使用是一个隐含的标准。
在创建新的类库时,根据当前类库所承担的责任将其放到对应的层级中是对一个类库在系统中所处角色的一个重要的标识。
如果你不小心把一个处于核心层的类库放到业务层,后果则是出现各种冗余代码,因为不同业务模块间按理说是不允许互相重用的,除非你再创建一个 PaPaPa.BasicBusiness.* 类似这样的一个专门归类基础业务的模块。
当然这只是从合理角度来说的,如果设计者到后期无法维护自己心目中的系统架构时,则会出现各层级交叉调用的一种混乱局面,而那时,项目的维护成本将会很高!
| 类库职责划分 |
有不少同行看到我的类库后觉得类库数量太多,有些类库内没几个类表示不解。
其实类库内类的数量多少不是关键,关键是类库的职责是否有明确划分,否则就会变成各个功能放在同一个类库。
一方面是会导致类库内文件夹层级过深,另外一方面则是升级时不相关业务会因为升级而中断,最最总要的一方面则是加大系统分层的难度,因为一个功能庞大的类库很可能会跨多个层级。
下面是PaPaPa项目中每个类库所担任的职责,这只是众多分类方式的一种。
只要你在做类库划分时,按照一定的规则来归类即可。
这能让开发者更明确的知道系统搭建者的意图。

| 源码 |
这只是这个系列的一个开篇,后面会把我们在写这个项目过程中的一些比较重要的环节以及实战经验加入到其中。
当然会包括很多人关注的缓存决策,如何在不破坏系统搭建意图的情况下加入新的底层支持。
简单说下,缓存决策又分自动决策和手动决策两部分,底层支持跨了2个层级,且因为灵活性问题部分区域为何放弃自动决策。
当然了,这个说起来名字很高大上,其实也就是普通的C#语法的一个组合罢了。
最后,源码地址:http://git.oschina.net/doddgu/PaPaPa
【PaPaPa】系统架构搭建浅析 - 人人可以搭架构的更多相关文章
- mvc项目架构搭建之UI层的搭建
项目架构搭建之UI层的搭建 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构各部分解析 5.项目创 ...
- mvc项目架构分享系列之架构搭建之Repository和Service
项目架构搭建之Repository和Service的搭建 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4. ...
- mvc项目架构分享系列之架构搭建之Infrastructure
项目架构搭建之Infrastructure的搭建 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构 ...
- mvc项目架构分享系列之架构搭建初步
mvc项目架构分享系列之架构搭建初步 Contents 系列一[架构概览] 0.项目简介 1.项目解决方案分层方案 2.所用到的技术 3.项目引用关系 系列二[架构搭建初步] 4.项目架构各部分解析 ...
- 用c#开发微信 (11) 微统计 - 阅读分享统计系统 1 基础架构搭建
微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...
- Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. The ...
- 企业级LNMP架构搭建实例(基于Centos6.x)
1.1 部署LNMP架构说明 1.1.1 LNMP架构内容 01.部署linux系统 02.部署nginx网站服务 03.部署mysql数据库服务 04.部署php动态解析服务 1.1.2 配置LNM ...
- 美团点评基于MGR的CMDB高可用架构搭建之路【转】
王志朋 美团点评DBA 曾在京东金融担任DBA,目前就职于美团点评,主要负责金融业务线数据库及基础组件数据库的运维. MySQL Group Replication(以下简称MGR),于5.7.17版 ...
- 【转载】Redis Sentinel 高可用服务架构搭建
作者:田园里的蟋蟀 出处:http://www.cnblogs.com/xishuai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 阅读 ...
随机推荐
- (转)透明光照模型与环境贴图之基础理论篇(折射率、色散、fresnel定律) .
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 材质和光的交互除了反射现象,对于透明物 ...
- php 代码编写规范
1 编写目的为了更好的提高技术部的工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范.开发团队根据自己的实际情况,可以对本规范进行补充或裁减. 2 整体要 ...
- javascript unshift()和shift()
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- windows 2012R2 上必须要用sharepoint 2013 sp1.
已经确认. 虽然有人讲以下powershell可以帮助安装sharepoint 2013. 不过不是每次都可以的 Import-Module ServerManager Add-WindowsFeat ...
- PHP设计模式系列 - 单例
单例模式 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景 例如数据库实例,一般都会走单例模式. 单例模式可以减少类的实例化 代码:来源InitPHP框架,先检测类有 ...
- php解决约瑟夫环的问题
php里面解决约瑟夫环还是比较方面的,但是下面的方法太费空间 <?php class SelectKing{ private $m;//幅度 private $n;//总数 public fun ...
- [转]Hadoop 读写数据流
Hadoop文件读取 1)客户端通过调用FileSystem对象中的open()函数来读取它做需要的数据.FileSystem是HDFS中DistributedFileSystem的一个实例. 2)D ...
- BZOJ1434:[ZJOI2009]染色游戏(博弈论)
Description 一共n×m个硬币,摆成n×m的长方形.dongdong和xixi玩一个游戏,每次可以选择一个连通块,并把其中的硬币全部翻转,但是需要满足存在一个硬币属于这个连通块并且所有其他硬 ...
- linux下10款markdown软件
原文:https://linux.cn/article-7623-1.html 在这篇文章中,我们会点评一些可以在 Linux 上安装使用的最好的 Markdown 编辑器. 你可以在 Linux 平 ...
- robotframwork接口测试(五)—接口分层测试粗解
个人小结,仅供参考. 接口测试很简单,但是很重要. 可以写代码,也可以用工具进行测试.工具说说就很多了,简单介绍一下我目前用过的几个能够测试接口的工具, Burpsuite:这类偏请求攻击类软件 Fi ...