什么是软件架构
维基百科定义:软件架构是指有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
软件架构5大要素:
扩容的时候,将新加入的节点的Hash放入一致性Hash环中,由于Key是顺时针查找距离最近的节点,因此新加入的节点只影响整个换中的一小段。
解决一致性Hash算法带来的负载不均衡的问题
将每台物理缓存服务器虚拟为一组虚拟缓存服务器,将虚拟服务器的Hash值放置在Hash环上,Key在换上先找到虚拟服务器节点,在得到物理服务器的信息。这样新加入的物理服务器节点是一组虚拟节点,如果虚拟节点足够多的,这组虚拟节点将会影响同样多数目的已经在环上存在的虚拟节点。
物理节点对应的虚拟节点越多,各个物理节点之间的负载越均衡,新加入物理服务器对原有的物理服务器的影响越保持一致。
根据经验,一台物理服务器虚拟为150个虚拟服务器节点。
数据存储服务器集群的伸缩性设计
数据存储层必须保证数据的可靠存储,任何情况下都必须保证数据的 可用性 和 正确性。
1. 关系数据库集群的伸缩性设计
架构设计:主从架构、主从读写分离、主从复制、分库
分库:不同业务数据表部署在不同的数据库集群上。缺点:夸库不能Join。
2. NoSQL数据库的伸缩性设计
NoSQL数据库产品都放弃了关键数据库的两大重要基础:
-
以关系代数为基础的结构化查询语言(SQL)
-
事务一致性保证(ACID)
NoSQL更关注:高可用性 和 可伸缩性
可扩展
软件设计的终极目标:低耦合 系统。
低耦合系统更容易扩展,低耦合模块更容易复用,低耦合的系统设计会让开发过程和维护变得更加轻松和容易管理。
主要目的: 站的架构能够快速响应需求变化。
可扩展架构的核心思想:模块化,并在此基础之上,降低模块间的耦合性,提高模块的复用性。
衡量标准: 站增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或者很少钙能既有业务功能就可以上线新产品。不同产品之间低耦合。
站可伸缩架构主要手段是事件驱动架构和分布式服务。
利用分布消息队列降低系统耦合性
事件驱动架构
事件驱动架构(Event Driven Architecture):通过在低耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作。如生产者消费者模式。
常用的事件驱动架构:分布式消息队列。
利用消息队列,将用户请求和其他业务事件构造成消息发布到消息队列,消息的处理者作为消费者从消息队列中获取消息进行处理。通过这种方式将消息产生和消息处理分离开来,可以透明地增加新的消息生产者任务或者新的消息消费者任务。
分布式消息队列
消息 生产者 应用程序通过远程访问接口将消息 推送 给 消息队列服务器,消息队列服务器将消息写入本地内存队列后即立即返回成功响应给消息生产者。消息队列服务器根据消息订阅列表查找订阅该消息的消息消费者应用程序,将消息队列中的消息按照 先进先出 的原则将 消息 通过远程通信接口发送给消息 消费者 程序。
利用分布式服务打造可复用的业务平台
将业务和可复用服务分离开来,通过分布式服务框架调用。
巨无霸应用存在问题:
-
编译、部署困难
-
代码分支管理困难
-
数据库连接耗尽
-
新增业务困难
解决方案就是 拆分,将模块独立部署,降低系统耦合性。
-
纵向拆分:将一个大应用拆分为多个小应用,如果新增业务比较独立,那么就直接将其部署为一个独立的应用系统。
-
横向拆分:将复用的业务拆分开来,独立部署为分布式服务,新增业务只需调用这些分布式服务,不需要依赖具体的模块代码。
大型 站分布式服务的需求和特点
-
服务注册与发现
-
服务调用
-
负载均衡
-
失效转移
-
高效的远程通信
-
整合异构系统
-
对应用最少侵入
-
版本管理
-
实时监控
利用开放平台建设 站生态圈
-
API接口:Restful、WebService、RPC等
-
协议转换:将各种API输入转换成内部服务可以识别的形式,并将内部服务的返回封装成API的格式。
-
安全:身份识别、权限控制、分级的访问带宽限制。
-
审计:记录第三方应用的访问情况,并进行监控、计费等。
-
路由:将开放平台的耕种访问路由映射到具体的内部服务。
-
流程:将一组离散的服务组织成一个上下文相关的新服务,隐藏服务细节,提供统一接口供开发者调用。
安全性
安全性是指保护 站不受恶意访问和攻击,保护 站的重要数据不被窃取。
衡量标准:针对现存和潜在的各种攻击与窃密手段,是否有可靠的应对策略。
站攻击和防御
XSS攻击
XSS攻击即 跨站点脚本攻击(Cross Site Script),指黑客通过篡改 页,注入恶意HTML脚本,在用户浏览 页时,控制用户浏览器进行恶意操作的一种攻击方式。常见攻击类型有:
-
反射型:攻击者诱使用户点击一个嵌入恶意脚本的连接,达到攻击目的。
-
持久型:黑客提交含有恶意脚本的请求,保存在被攻击的Web站点的数据库中,用户浏览 页时,恶意脚本被包含在正常页面中,达到攻击的目的。
XSS防攻击手段:
-
消毒:对html危险字符进行转义。消毒几乎是所有 站最必备的XSS防攻击手段。
-
HttpOnly:浏览器进制页面JavaScript访问带有HttpOnly属性的Cookie。HttpOnly主要是防止XSS攻击者窃取Cookie。
注入攻击
注入攻击主要由 SQL注入攻击 和 OS注入攻击 两种。
SQL注入攻击
攻击者在HTTP请求中注入恶意SQL命令,服务器用请求参数构造数据库SQL命令(如删除数据库表)时,恶意SQL被一起构造,并在数据库中执行。
SQL注入攻击前提:攻击者需要对要攻击的数据库结构有所了解。
攻击者获取数据库表结构信息手段:
-
开源:开源软件搭建的 站数据结构是公开的。
-
错误回显:攻击者可以通过服务端返回的异常信息,猜测数据库表结构。
-
盲注:攻击者根据页面变化情况判断SQL语句的执行情况,猜测数据库表结构。
防御
首先应避免被攻击者猜测到表名等数据库表结构信息。
除此之外还有以下两种方式:
-
消毒:通过正则匹配过滤请求数据中可能注入的SQL。请求参数消毒是一种比较简单粗暴又有效的手段。
-
参数绑定:使用预编译手段,绑定参数是最好的防SQL注入方法。
CSRF攻击
CSRF(Cross Site Request Forgery,跨站点请求伪造),指的是攻击者通过跨站请求,以合法用户的身份进行非法操作,如转账交易、发表评论等。
CSRF攻击的主要手法:利用跨站请求,在用户不知情的情况下,以用户的身份伪造请求。
核心是利用了浏览器Cookie或服务器Session策略,盗取用户身份。
CSRF攻击防御主要手段是识别请求者身份。主要有下面几种方法:
-
表单Token:通过在请求参数中增加随机数的方法来阻止攻击者获得所有请求参数。正常请求会包含token随机数,每次请求都不一样,伪造请求无法获得该值,服务器检查请求参数中token的值是否存在并且正确以确定请求提交者是否合法。
-
验证码:在请求提交时,需要用户输入验证码,以避免在用户不知情的情况下被攻击者伪造请求。但是输入验证码是一个很糟糕的用户体验。
其他攻击和漏洞
1. Error Code
错误回显,指的是服务器端未处理异常堆栈信息直接输出到客户端浏览器。
防御:配置web服务器参数,跳转500页面到指定的错误页面,避免将异常堆栈信息直接返回给用户。
2. HTML注释
在浏览器中是可以看到HTML代码中注释的部分,这样会给黑客造成攻击便利。
防御:程序在最终发布前需要进行代码review或自动扫描,避免HTML注释漏洞。
3. 文件上传
攻击方式:上传一个可执行的程序,并通过该程序获得服务器端命令执行能力。
防御:设置上传文件白名单,只允许上传可靠的文件类型。此外还可以修改文件名、使用专门的存储等手段,保护服务器免受上传文件攻击。
4. 路径遍历
攻击方式:攻击者在请求的URL中使用相对路径,遍历系统为开放的目录和文件。
防御:将JS、CSS等资源文件部署在独立服务器,使用独立域名,其他文件不适用静态URL访问,动态参数不包含文件路径信息。
信息加密技术及密钥安全管理
为了保护 站的敏感数据,需要对这些敏感数据进行加密处理,信息加密技术分为三类:
单向散列加密
通过对不同输入长度的信息进行散列计算,得到固定长度的输出,散列计算是单向的,即不能对固定长度的输出进行计算从而获得输入信息。
使用场景:密码加密保存,生成信息摘要,计算具有高离散程度的随机数等。
常用单向散列算法:MD5、SHA等。
对称加密
加密和解密使用的密钥是同一密钥(或者可以互相推算)。
使用场景:Cookie加密,通信加密等。
优缺点:
-
优点:算法简单,加密效率高,系统开销小,适合对大量数据加密。
-
缺点:加解密使用同一个密钥。
常用对称加密算法:DES、RC算法。
非对称加密
加密和解密使用的密钥不同,其中一个对外界公开,叫做,另一个只有所有者知道,被称为。用公钥加密的信息必须用私钥才能解开,反之,用私钥加密的信息只有公钥才能解开。理论上不可能通过公钥计算获得私钥。
使用场景:信息安全传输,数字签名等。
常用非对称加密算法:RSA算法。
HTTPS传输中浏览器使用的数字证书就是经过权威机构认证的非对称加密的公钥。
信息过滤与反垃圾
常用的信息过滤与反垃圾手段有以下几种:
文本匹配
主要用来解决敏感词过滤问题。
快速判断信息中是否包含敏感词方法:
-
正则匹配:适用于敏感词较少,信息文本较短场景。正则表达式的效率一般较差。
-
Trie树及变种:算法本质是确定一个有限状态的自动机,根据输入数据进行状态转移。
分类算法
算法原理:先将批量已经分好类的样本数据输入分类算法进行训练,可以得到一个分类模型,然后再利用分类算法结合分类模型对待处理邮件进行识别。
简单实用的分类算法:贝叶斯分类
实用场景:反垃圾、信息自动分类等
黑名单
将需要过滤的内容加入到黑名单中,然后从黑名单中进行查找,如果找到,就过滤掉。
常用数据结构:Hash表、BloomFilter。
电子商务风险控制
交易安全是电子商务 站的底线。
风险
主要风险:
-
账户风险:如账户被黑客盗用、恶意注册账 等。
-
买家风险:买家恶意下单占用库存进行不正当竞争;黄牛利用促销抢购低价商品。
-
卖家风险:不良卖家进行恶意欺诈。
-
交易风险:信用卡盗刷、支付欺诈、洗钱套现等。
风控
风控手段包括 自动 和 人工 两种。
自动风控技术:
-
规则引擎:将 业务规则 和 规则处理逻辑 分离的技术。缺点:规则冲突,难以维护,规则越多性能越差。
-
统计模型:使用统计模型进行风险控制。分类算法或者更复杂的机器学习算法。
分享一张 大型 站技术架构知识图谱,只有对每一个知识点仔细梳理并深入理解,才能打造出一个高可用、高性能、以扩展、可伸缩且安全的 站。

好文推荐:
-
一篇文章带你快速搞懂HBase RowKey设计
-
带你快速上手HBase | HBase读写性能优化
-
福利!入门HBase的正确姿势
-
Spark快速入门 | Spark任务调度
-
Spark快速入门 | Spark执行过程
-
Spark快速入门 | RDD操作手册
-
Spark快速入门 | RDD介绍
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92916 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!