- 推荐序一:架构师真正要学会的事情
- 推荐序二
- 译者序 2.0
- 序
- 关于本书
- Part Ⅰ 什么是软件架构
- 第 1 章 什么是架构
- 第 2 章 架构的种类
- 第 3 章 软件架构是什么
- 第 4 章 敏捷软件架构是什么
- 第 5 章 架构对上设计
- 第 6 章 软件架构重要吗
- 第 7 章 问题
- Part Ⅱ 软件架构的角色
- 第 8 章 软件架构的角色
- 第 9 章 软件架构师应该编码吗
- 第 10 章 软件架构师应该是建造大师
- 第 11 章 从开发者到架构师
- 第 12 章 拓展 T
- 第 13 章 软技能
- 第 14 章 软件架构不是接力运动
- 第 15 章 软件架构要引入控制吗
- 第 16 章 小心鸿沟
- 第 17 章 未来的软件架构师在哪里
- 第 18 章 每个人都是架构师,除非他们有其他身份
- 第 19 章 软件架构咨询师
- 第 20 章 问题
- Part Ⅲ 设计软件
- 第 21 章 架构驱动力
- 第 22 章 质量属性(非功能需求)
- 第 23 章 处理非功能需求
- 第 24 章 约束
- 第 25 章 原则
- 第 26 章 技术不是实现细节
- 第 27 章 更多分层等于更高复杂度
- 第 28 章 协同设计是一把双刃剑
- 第 29 章 软件架构是对话的平台
- 第 30 章 SharePoint 项目也需要软件架构
- 第 31 章 问题
- Part Ⅳ 可视化软件
- 第 32 章 沟通障碍
- 第 33 章 对草图的需要
- 第 34 章 无效的草图
- 第 35 章 C4:语境、容器、组件和类
- 第 36 章 语境图
- 第 37 章 容器图
- 第 38 章 组件图
- 第 39 章 是否包含技术选择
- 第 40 章 你会那样编码吗
- 第 41 章 软件架构和编码
- 第 42 章 你不需要 UML 工具
- 第 43 章 有效的草图
- 第 44 章 C4 的常见问题
- 第 45 章 问题
- Part Ⅴ 为软件生成文档
- 第 46 章 代码不会讲述完整的故事
- 第 47 章 软件文档即指南
- 第 48 章 语境
- 第 49 章 功能性概览
- 第 50 章 质量属性
- 第 51 章 约束
- 第 52 章 原则
- 第 53 章 软件架构
- 第 54 章 外部接口
- 第 55 章 代码
- 第 56 章 数据
- 第 57 章 基础设施架构
- 第 58 章 部署
- 第 59 章 运营和支持
- 第 60 章 决策日志
- 第 61 章 问题
- Part Ⅵ 开发生命周期中的软件架构
- 第 62 章 敏捷和架构的冲突:神话还是现实
- 第 63 章 量化风险
- 第 64 章 风险风暴
- 第 65 章 恰如其分的预先设计
- 第 66 章 初识软件架构
- 第 67 章 问题
- Part Ⅶ 金融风险系统
- 第 68 章 金融风险系统
- Part Ⅷ 附录:技术部落 的软件指南
Part Ⅷ 附录:技术部落 的软件指南
这是“技术部落”1网站的软件指南样本,这个网站是我的一个分支项目,为泽西岛提供一个技术、IT和数字领域的焦点。
“技术部落”网站的代码已经开源,可访问GitHub2获取。
2https://github.com/techtribesje/techtribesje
介绍
该软件指南提供了“技术部落”网站的概览,包括对以下内容的总结:
1.网站背后的需求、约束和原则;
2.软件架构,包括高层次的技术选择和软件的结构;
3.基础设施架构以及软件如何部署;
4.网站的运营和支持方面。
语境
“技术部落”网站为在泽西岛和格恩西岛寻找与技术、IT和数字领域相关的人、部落(业务、社区、兴趣组等)和内容提供了一个途径。在最基本的层面上,它是一个本地的微博、新闻、博文、活动、讲座、工作以及更多东西的内容聚合器。这是一个提供可视化总结的语境图:
该网站的目的:
1.聚合和分享本地的内容,帮助其在本地社区内外的推广;
2.在本地社区促进开放、分享和学习的文化。
用户
“技术部落”网站有三类用户。
1.匿名用户:任何人都可以通过Web浏览器查看站点上的内容。
2.认证用户:有内容被聚合到网站的人/部落可以用他们注册的Twitter ID(如果有的话)登入网站,修改他们的基本档案信息。
3.管理用户:拥有网站管理(超级用户)权限的人可以管理网站聚合的人、部落和内容。
外部系统
“技术部落”集成了三种类型的系统,在语境图上用灰色虚线框代表。
1.Twitter:从Twitter取回人/部落的档案信息和微博,聚合到网站。Twitter也用来让人/部落通过他们的Twitter ID登入“技术部落”。
2.GitHub:如果人/部落注册过GitHub的ID,就会从GitHub取回代码仓库的总结信息。
3.博客:通过RSS或Atom订阅取回人/部落写的博客的内容,聚合到网站。
功能性概览
这个部分对“技术部落”网站提供的功能进行了一个总结。
人和部落
“技术部落”的核心是人和部落。
人:本地的技术、数字和IT领域内的人。
部落:一个部落就是一群人。分4种类型。
o 业务:一个业务部落代表一个本地公司。
o 技术:一个技术部落是对一个特定话题(比如,Java、树莓派、SharePoint等)有共同兴趣的一群人。
o 媒体:一个媒体部落是一个发布本地新闻的组织。
o 社区:一个社区部落代表一个本地用户群或其他非盈利性组织。
人和部落有一些基本档案信息,以及一个Twitter ID和“技术部落”用来把内容聚合到网站的一个或多个RSS/Atom订阅链接。
内容
“技术部落”聚合和发布多种不同类型的内容,都和人或部落相关。
博文和微博
“技术部落”的主要功能是聚合人和部落的博文和微博,使网站的用户可以在一个地方找到那些内容。博文和微博可以在网站上以多种方式查看,此外还提供了搜索功能。网站也发布了一个所有博文的统一RSS订阅。
新闻
本地技术新闻条目就是媒体部落的博文。此外,这些可以在网站上以多种方式查看。
讲座
“技术部落”发布本地人在会议、聚会和其他活动上的各种讲座。每个讲座有一些基本信息(即,标题、摘要、日期,再加上活动细节),并关联到一个人。
活动
“技术部落”还发布本地的技术活动、聚会、用户组等信息。每个活动有一些基本信息(即,标题、描述、日期、时间、活动链接等),并关联到一个部落。
工作
最后,“技术部落”列出了本地的技术工作。每个工作有一些基本信息(即,标题、描述、发布日期、更多信息的链接等),也关联到一个部落。
用户
有三种类型的用户。
匿名用户
匿名用户代表了任何访问“技术部落”的人,他们能够以多种方式查看网站上的所有内容。
认证用户
列在“技术部落”上的本地人能够用他们的Twitter ID登入,以便管理一些基本档案信息和他们加入的技术部落的清单。
管理用户
管理用户是一些认证用户,有权运行网站的一些基本管理功能,包括向网站添加人和部落,以及管理部落成员。
博弈引擎
“技术部落”提供的最后一个主要功能是一个简单的博弈引擎,鼓励本地人和部落与社区的其他成员接触,更经常地分享内容。
分数
人和部落发表微博、博文,进行讲座和组织活动,可以得到奖励分数。根据最近七天的分数可以滚动计算出最活跃排行榜。
徽章
除了分数,徽章也会奖励给获得特定成就的人和部落。这包括从发表微博和博文等简单的事,到进入最活跃排行榜前三位,在岛外进行讲座。
质量属性
这个部分提供“技术部落”网站所需的质量属性(非功能需求)的信息。
性能
对于50个当前用户,“技术部落”所有的页面都应该在5秒内加载和渲染。
可伸缩性
“技术部落”网站应该能够伸缩到当前数据量的十倍。如下:
1000个人和部落;
50万条微博;
1万条新闻/博文。
安全性
尽管匿名用户可以查看“技术部落”网站的大部分内容,还是必须提供基于角色的访问,允许人/部落登入并管理他们的档案。为了降低管理用户凭据相关的运营支持开销,所有认证必须通过Twitter、Facebook、Google、OpenID等第三方机制实现。
可用性
因为“技术部落”系统不是一个关键的任务,预算有限,所以并没有严格的可用性目标。
国际化
所有用户界面文字只用英语呈现。
本地化
所有信息都只使用英国英语的格式。
浏览器兼容性
“技术部落”网站应该在以下浏览器中表现一致:
Safari;
Firefox;
Chrome;
Internet Explorer 8(及以上)。
约束
这个部分提供“技术部落”网站开发中强加的约束的信息。
预算
因为“技术部落”网站没有正式的预算,所以使用免费和开源技术是开发中的一个约束。理论上,网站应该运行在托管成本低于20英镑每月的单个服务器上。
原则
这个部分提供“技术部落”网站开发中采用的原则的信息。
组件封装
为了提供一个简单的从软件架构到代码的映射,代码的封装结构反映了“组件封装”的规约,而不是“层封装”。
这意味着把代码库划分为多个组件,每个组件有:
一个定义好的公开接口;
强隔离(即所有实现细节都尽可能封装保护);
名为components.xml的Spring配置文件来进行配置和将组件接入系统其他部分。
自动化测试
自动化测试策略是进行自动化的单元和组件测试。
单元测试:这些是对单个类或孤立方法执行的运行快速,非常小的测试。示例请看techtribes-core的单元测试3。
组件测试:为避免破坏隔离,组件作为单一单元来测试,而不是仿造数据库连接来对组件内部进行测试。示例请看techtribes-core的组件测试4。
3https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/test/unit
4https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/test/component
配置
组件所需的全部配置都放到外部的Java properties文件中,存放在部署文件之外,由构建流程创建。这意味着构建版本无需修改就能从开发、测试迁移到生产环境。
Spring自动装配
只在“技术部落”的Web层部分(techtribes-web5)使用Spring自动装配,将组件注入到Spring MVC控制器。
5https://github.com/techtribesje/techtribesje/tree/master/techtribes-web
软件架构
这个部分提供“技术部落”的软件架构概览。
容器
下图展示了组成“技术部落”系统的逻辑容器。图并不代表容器的实际数量和位置:这个信息请看基础设施和部署部分。
Web服务器:Apache Tomcat 7 Web服务器,从互联网访问“技术部落”网站的单一访问点。
内容更新器:从Twitter、GitHub和博客更新信息的独立的Java 7应用程序。
关系型数据库:存储了“技术部落”网站背后大部分数据的MySQL数据库。
NoSQL数据存储:存储微博和博文的MongoDB数据库。
文件系统:文件系统存储了Lucene搜索索引。
组件:内容更新器
下图展示了组成独立的内容更新器的组件。
techtribes.js-Containers-content Updater:“技术部落”-组件-内容更新器
Standalone Java Process:独立Java进程
除了一些核心组件(稍后详述),独立的内容更新器进程由以下组件构成。
计划内容更新器:该组件安排从Twitter、GitHub和博客的计划(即,每15分钟)信息更新。它还重新计算“最近活跃”,每小时发放一次徽章奖励。它是一个使用Spring调度注释的Spring Bean。代码请看je.techtribes.component.scheduledcontentupdater6。
Twitter连接器:该组件负责连接到Twitter,以便刷新档案信息和取回微博。它是一个使用Twitter4J类库7的Spring Bean。REST8和Streaming API9都采用了。代码请看je.techtribes.component.twitterconnector10。
GitHub连接器:该组件负责连接到GitHub,以便刷新仓库信息。它是一个使用Eclipse Mylyn GitHub连接器11的Spring Bean。代码请看je.techtribes.component.githubconnector12。
新闻订阅连接器:该组件负责连接到RSS/Atom订阅,以便刷新聚合到“技术部落”网站的新闻和博文。它是一个使用ROME类库13的Spring Bean。代码请看je.techtribes.component.newsfeedconnector14。
8https://dev.twitter.com/docs/api——译者注
9https://dev.twitter.com/docs/api/streaming——译者注
11http://www.eclipse.org/mylyn/
13http://rometools.github.io/rome/
组件:核心
下图展示了Web服务器和独立的内容更新器共用的通用组件。
这是对每个核心组件的小结。
内容源组件:该组件提供对MySQL中存储的人和部落(合指“信息源”)信息的访问。代码请看je.techtribes.component.contentsource15。
新闻订阅项组件:该组件提供对MongoDB中存储的新闻和博文的访问。代码请看je.techtribes.component.newsfeedentry16。
微博组件:该组件提供对MongoDB中存储的微博的访问。代码请看je.techtribes.component.tweet17。
讲座组件:该组件提供对MySQL中存储的本地演讲者的讲座信息的访问。代码请看je.techtribes.component.talk18。
活动组件:该组件提供对MySQL中存储的本地活动(比如,聚会、研讨会、代码道场,等)信息的访问。代码请看je.techtribes.component.event19。
工作组件:该组件提供对MySQL中存储的本地工作机会信息的访问。代码请看je.techtribes.component.job20。
GitHub组件:该组件提供对MySQL中存储的属于本地人/部落的代码仓库信息的访问。代码请看je.techtribes.component.github21。
搜索组件:该组件为新闻、博文和微博提供搜索工具。使用Apache Lucene进行索引和搜索。代码请看je.techtribes.component.search22。
活跃度组件:该组件提供对MySQL中存储的,内容更新器计算得到的“最近活跃”信息的访问。代码请看je.techtribes.component.activity23。
徽章组件:该组件提供对人/部落因活跃度而被奖励的徽章的访问。代码请看je.techtribes.component.badge24。
日志组件:该组件只是对Commons Logging25和log4j的包装。所有其他组件都会使用它。代码请看je.techtribes.component.log26。
25Commons Logging提供一个统一的日志接口,从而不依赖于具体的日志实现,http://commons.apache.org/proper/commons-logging/。——译者注
基础设施架构
这个部分提供“技术部落”网站的基础设施架构信息。
线上环境
线上环境非常简单;像下面这样的单个托管在伦敦地区的Rackspace云服务器27。
27http://www.rackspace.com/cloud/servers/
操作系统:Ubuntu 12.04长期支持版(Precise Pangolin28)。
配置:1024 MB内存,40 GB磁盘。
服务器类型:下一代服务器。
28精准的穿山甲。Ubuntu发行版每个正式版本的代号都按字母表顺序依次以动物命名。如12.04为Ubuntu的第16个正式版本,在字母表中对应P,因此选择以P开头的动物Pangolin命名。——译者注
Rackspace仪表盘29的凭据是:
29https://mycloud.rackspace.com
用户名:********
密码:********
部署
这个部分提供软件架构和基础设施架构之间映射的信息。
软件
线上环境是单个Rackspace云服务器,因此下列所有软件都通过Ubuntu高级包管理工具(apt,Advanced Packaging Tool)安装到服务器。
Java 7(OpenJDK30)(这需要加上Java加密扩展JCE的无限强度管辖政策文件31,通过Twitter的认证才能工作)。
Apache Tomcat 7。
MySQL 5.x。
MongoDB 2.2.x。
30Sun公司构建的Java开发环境的开源版本。——译者注
31http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
构建“技术部落”
为了避免“在我这里是好的”综合症,以及确保构建是干净的和可重复的,所有发布都由一个TeamCity32免费版的持续集成服务器构建。build.xml脚本33完成了所有编译、运行自动化测试和创建发布包等繁重的工作。
32一款持续集成工具,包括服务器端和客户端,目前支持Java和.NET项目开发,http://www.jetbrains.com/teamcity/。——译者注
33https://github.com/techtribesje/techtribesje/blob/master/build.xml
如果构建成功,构建脚本的最后一部分,是把发布安全地复制“技术部落”的Rackspace服务器。
部署“技术部落”
“技术部落”所有的软件都安装在~techtribesje/buiulds目录下,每个发布一个子目录34。GitHub上有几个脚本35,用来解压一个发布,通过symlinks36切换版本,最后重启进程。
34https://github.com/techtribesje/techtribesje/releases
35https://github.com/techtribesje/techtribesje-bin
36维护符号连接的工具程序。——译者注
部署一个新版本,或回滚到一个旧版本,只要简单运行:
1 ~/bin/deploy.sh XYZ
(XYZ是TeamCity持续集成服务器创建的构建版本号)
配置
Web服务器和内容更新器的配置文件是: + /etc/techtribesje-web.properties; + /etc/techtribesje-updater.properties。
运营和支持
这个部分提供“技术部落”网站运营和支持方面的信息。
启动MySQL
MySQL是作为服务安装的,应该在服务器重启后运行。你可以使用以下指令检查:
1 sudo netstat -tap | grep mysql
如果需要启动MySQL,你可以使用以下指令:
1 sudo service mysql start
启动MongoDB
MongoDB也是作为服务安装的,应该在服务器重启后运行。你可以使用以下指令检查:
1 sudo netstat -tap | grep mongo 2 tail /var/log/mongodb/mongodb.log
如果需要启动MongoDB,你可以使用以下指令:
1 sudo service mongodb start
启动Web服务器
Apache Tomcat也是作为服务安装的,应该在服务器重启后运行。你可以使用以下指令检查:
1 ps -Af | grep tomcat 2 tail /var/lib/tomcat7/logs/catalina.out
如果需要启动Tomcat,可以使用以下指令:
1 ~techtribesje/bin/start-tomcat.sh
启动内容更新器
内容更新是一个独立的Java进程,需要在服务器重启后手动启动。你可以使用以下指令(XYZ构建版本号):
1 ~techtribesje/bin/start-updater.sh XYZ
你可以使用以下指令检查:
1 ~techtribesje/bin/updater-logs.sh XYZ
监测
“技术部落”网站唯一的监测是Pingdom37,配置为每5分钟测试网站是否可访问。一旦发现Web服务器不可用,就会发送电子邮件。
备份
格林尼治标准时间每天凌晨3点,MySQL和MongoDB数据库都通过计划任务进行备份。你可以使用以下指令检查计划任务:
1 crontab -l
你应该看到这样的东西:
1 0 3 * * * /home/techtribesje/bin/backup-data.sh > /dev/null
这个shell脚本获取MySQL和MongoDB数据库的导出,复制到一个与Dropbox同步的文件夹。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论