返回介绍

Part Ⅷ 附录:技术部落 的软件指南

发布于 2024-08-18 00:06:34 字数 15748 浏览 0 评论 0 收藏 0

这是“技术部落”1网站的软件指南样本,这个网站是我的一个分支项目,为泽西岛提供一个技术、IT和数字领域的焦点。

1http://techtribes.je

“技术部落”网站的代码已经开源,可访问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。

6https://github.com/techtribesje/techtribesje/tree/master/techtribes-updater/src/je/techtribes/component/scheduledcontentupdater

7http://twitter4j.org

8https://dev.twitter.com/docs/api——译者注

9https://dev.twitter.com/docs/api/streaming——译者注

10https://github.com/techtribesje/techtribesje/tree/master/techtribes-updater/src/je/techtribes/component/twitterconnector

11http://www.eclipse.org/mylyn/

12https://github.com/techtribesje/techtribesje/tree/master/techtribes-updater/src/je/techtribes/component/githubconnector

13http://rometools.github.io/rome/

14https://github.com/techtribesje/techtribesje/tree/master/techtribes-updater/src/je/techtribes/component/newsfeedconnector

组件:核心

下图展示了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。

15https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/contentsource

16https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/newsfeedentry

17https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/tweet

18https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/talk

19https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/event

20https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/job

21https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/github

22https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/search

23https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/activity

24https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/badge

25Commons Logging提供一个统一的日志接口,从而不依赖于具体的日志实现,http://commons.apache.org/proper/commons-logging/。——译者注

26https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component/log

基础设施架构

这个部分提供“技术部落”网站的基础设施架构信息。

线上环境

线上环境非常简单;像下面这样的单个托管在伦敦地区的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服务器不可用,就会发送电子邮件。

37https://www.pingdom.com/

备份

格林尼治标准时间每天凌晨3点,MySQL和MongoDB数据库都通过计划任务进行备份。你可以使用以下指令检查计划任务:

1 crontab -l

你应该看到这样的东西:

1 0 3 * * * /home/techtribesje/bin/backup-data.sh > /dev/null

这个shell脚本获取MySQL和MongoDB数据库的导出,复制到一个与Dropbox同步的文件夹。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文