文档章节

架构知识整理

古城痴人
 古城痴人
发布于 2015/08/19 09:41
字数 2404
阅读 144
收藏 15
点赞 0
评论 0

架构概念

一套系统的软件架构就是这个系统所需的结构体的集合,包括:软件元素软件元素之间的关系,以及二者的属性

从视角不同一般分为:

  • 逻辑架构

关注于各个组件之间的关系,如:用户界面、数据库、外部系统接口

如流行的N层架构:表现层,业务逻辑层,数据层

  • 物理架构

关注于如何将软件元素放到物理设备上,如:代理服务器、Web服务器,缓存服务器、数据库服务器、NoSQL服务器、队列服务器、搜索服务器。

  • 系统架构

性能、可扩展性、伸缩性、可用性、安全性

有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。

在平衡性能、扩展性、伸缩性、可用性、安全性这5个系统架构要素下,实现系统功能需求。

架构模式

为了应对高并发访问、海量数据处理、高可靠运行等一系列问题,大型互联网公司在实战提了许多解决方案,以实现网站的高性能、高可用、易伸缩、可扩展、安全等各种技术架构目标,这些解决方案可以被重复使用,从而被抽炼成为大型网站的架构模式

分层

应用层 - 服务层 - 数据层

应用层:视图层 业务逻辑层

服务层:数据接口层 逻辑处理层

分层是逻辑上的,物理布署上根据规模决定

从一开始就要分层,因为分层对网站日后向分布式方向发展至关重要

分割

也就是纵切,把不同功能的服务分割开,包装成高内聚低偶合的模块单元,一方面有助于软件的开发和维护,一方面,便于不同模块的分布式布署。 分割粒度根据网站规模来决定,如:用户,搜索,反作弊,消息

分布式

将不同的模块布署到不同的服务器上,服务器越多,CPU,内存,存储空间资源就越多 分布式遇到的问题:

  • 性能:通过网络
  • 可用性:服务器多,宕机
  • 一致性:多台机器数据保持同步,分布式事务
  • 可维护性:机器多,网络依赖复杂

分布式分类:

  • 分布式应用和服务 将分层和分割后的模块布署到不同的服务器上。
  • 分布式静态资源 将JS、CSS、图片独立分布式布署
  • 分布式数据和存储 将产生和处理的海量数据存放到多台机器上面,MySQL,NoSQL
  • 分布式计算 后台业务,如:搜索引擎的索引构建,数据仓库的计算,Hadoop、Mapreduce
  • 分布式配置、分布式锁、分布式文件系统。。。。

集群

** 将多台服务器布署相同的应用,这一堆服务器叫集群。** 使用集群的目的:

  • 高可用
  • 高性能

缓存

将数据放到离计算最近的位置,可以提高访问速度,缓存后端的计算压力

本机缓存由远而近是:一级缓存,二级缓存、三级缓存、内存

** 缓存种类:**

  • CDN
  • 反向代理
  • 本地缓存
  • 分布式缓存

** 使用缓存的前提:**

  • 数据访问热点不均衡,部分数据会被频繁访问,需要使用缓存:HTML的最新20条动态
  • 数据不会很快过期,否则会产生脏数据

** 数据库的设计都是按照有缓存的负载前提下设计的。**

异步

主要是为了解耦,使用队列

类和类之间解偶:接口

模块与模块之间解偶:队列

异步的好处:

  • 提高可用性

  • 增高响应速度

  • 消除并发访问高峰

** 问题:可能会对用户体验、业务流程造成影响 **

冗余

高可用的手段:冗余

应用服务:集群

数据:定期备份、主从结构对数据实时热备、灾备数据中心

自动化

开发:

  • 自动化代码管理

  • 自动化测试

  • 自动化代码审查

  • 自动化布署

  • 自动化安全检查

运维:

  • 自动化监控

  • 自动化报警

  • 自动化失效转移

  • 自动化失效恢复

  • 自动化降级

  • 自动化分配资源

安全

程序实现安全:XSS、SQL注入、编码转换

  • 通过密码、手机检验码进行身份认证;

  • 登录交易对通信数据加密

  • 验证码防止机器人程序对网站攻击

  • 敏感信息过滤:反作弊

架构指标

性能

响应时间

** 执行一个操作需要的时间 **

打开一个网站  几秒

数据查查询一次 10毫秒

机械硬盘一次寻址定位 4毫秒

机械硬盘顺序读1M数据  2毫秒

SSD顺序读1M数据  0.3毫秒

从Redis读一个数据  0.5毫秒

从内存读1M数据  10多微秒

Java程序本地方法调用  几微秒

** CPU操作时间 **

从CPU到	大约需要的CPU周期	大约需要的时间(单位ns)

寄存器	1 cycle	

L1 Cache	~3-4 cycles	~0.5-1 ns

L2 Cache	~10-20 cycles	~3-7 ns

L3 Cache	~40-45 cycles	~15 ns

跨槽传输		~20 ns

内存	~120-240 cycles	~60-120ns

网络传输2K数据   1微秒

** 并发数 **

同时处理请求的数目

** 吞吐量 **

单位时间内系统处理的请求数量,如请求数/秒,页面数每秒,访问人数每天,

一些高大上的指标:

  • TPS:每秒处理事务数

  • HPS:每秒HTTP请求数

  • QPS:每秒的查询数

** 性能计数器 **

运维人员关注的指标,服务器或操作系统的性能指标,如:系统负载(top命令),对象与线程数、内存使用情况、CPU使用情况,磁盘IO,网络IO。这些指标超出阈值后,系统都可能会出问题。

优化:

** 前端优化 **

  • 减少http请求/使用浏览器缓存/压缩/CSS放上面,JS放下面/减少Cookie传统

  • CDN加速/反向代理

  • 缓存优化

  • 异步队列

  • 集群

** 代码优化 **

  • 多线程/内存/

  • 存储优化

  • SSD/分布式文件系统

扩展性

对现有系统影响最小的情况下,系统功能可以持续扩展和提升的能力。

高扩展性的关键是:高内聚,低耦合 -> 模块拆分

  • 分布式消息队列

  • 分布式服务

** 大型网站遇到的问题:**

  • 编译、布署困难:代码多,编译时间长,布署机器多

  • 代码分支管理困难:复用代码的修改经常会造成冲突

  • 数据库连接耗尽:

  • 新增业务困难:在一个乱如麻的系统中增加新业务,维护旧功能异常痛苦,一脚全是雷,大家干的热火朝天,就是问题多多。

** 解决方法:拆、拆、拆 (重要的事情要说3遍) **

  • 拆成低耦合的模块,独立布署。

  • 纵拆:将大应用拆为多个小应用独立布署

  • 横拆:将复用的业务拆分出来,独立布署,对外提供稳定的接口。

服务提供者启动后在服务注册中心注册,服务消费者想使用某项服务时,先从服务注册中心获取服务提供者列表,找到服务的接口,然后根据负载均衡策略将服务请求发送到对应的服务器上。

** 可扩展的数据结构 **

NOSQL:CouchBase、MongoDB、HBase

** 利用开放平台建设网站生态圈 **

OpenAPI

伸缩性

不需要改变软件的软硬件设计,只需要布署服务器数量就可以扩大或缩小服务处理能力。

根据功能进行物理分离实现伸缩:横向分离:不同的业务模块分离布署、纵向分离:业务流程分离布署

单一功能通过集群来实现伸缩:一头牛拉不动时,不找更强壮的牛,而是找两头牛

** 应用服务器集群的伸缩性设计 **

  • Http重定向:302

  • DNS域名解析:二级域名

  • 反向代理负载:Nginx

  • IP负载均衡

  • 数据链路层负载均衡:LVS

** 分布式缓存集群的伸缩性设计 **

  • 一致性Hash算法

** 数据库伸缩性设计 **

  • 主从架构

  • 读写分离

** NoSQL **

  • HBase的的HRegion的分裂

可用性

可用性就是不出故障。

不可用时间=故障修复时间点-故障发现时间点

** 可用性指标=(1-不可用时间/总时间)*100% **

2个9基本可用,88小时

3个9是较高可用,小于9小时

4个9是高可用,53分钟

5个9是极高可用,5分钟

** 可用性 **

** 业务拆分 **

  • 无状态应用:负载均衡、Session管理

  • 基础服务高可用:分级管理、超时设置、异步调用、服务降级、幂等性设计

  • 数据高可用:数据备份、失效转移

安全性

XSS(跨站点脚本攻击):消毒

注入攻击:请求参数消毒,参数绑定

CSRF(跨站点请求伪造):表单Token、验证码、Referer检查

加密:

单向散列加密:Md5 SHA   使用彩虹表

对称加密:交换密钥是难题

非对称加密:公钥加密,私钥解密

© 著作权归作者所有

共有 人打赏支持
古城痴人
粉丝 16
博文 16
码字总数 19276
作品 0
朝阳
高级程序员
自考总结--爱恨交加的计算机网络

第五次自考,这次是最后一科,计算机网络。接下来,可能是一大篇励志鸡汤。不喜欢喝的可以看其他博客,需要的继续读下去下面有惊喜。 由于项目和个人问题,计算机网络在考试一周之前并没有好...

weienjun ⋅ 04/15 ⋅ 0

要做好性能测试,该掌握些什么?

今天有同行在blog上留言,问“想从功能测试转向性能测试,但不知道需要哪些了解哪些知识,及怎样进行一个系统的学习”。这类问题之前也被问到很多次了,所以这次干脆整理一下,发个主题供同行...

不最醉不龟归 ⋅ 2016/09/29 ⋅ 0

【网络知识点】网络基本架构

最近都在整理系统相关知识,网络方面的知识还没有开始整理,但赶紧网络这分类有点空,今天就分享一下网络的基础知识--网络基本架构 网络基本架构算是最最最基础的知识点,对于这个基本架构,...

xierex ⋅ 2016/12/13 ⋅ 0

iOS开发专题分类大全(简书iOS学习资源大收录!)

序言 系统的整理iOS开发常用的第三方库、架构、进阶、面试学习书籍资源等,如果有更好的三方库、没有整理到、可以评论留言,我会在及时更新的,还不赶快mark~ 多看书!毕竟看一本适合自己的...

_小迷糊 ⋅ 06/08 ⋅ 0

【干货合集】项目管理、需求快速迭代如何实现?17篇文章搞懂敏捷开发!

为了让大家get到研发效能有关的敏捷开发和架构的相关知识,现将云栖社区2017年度与之相关的前沿技术理念及实践技术成果资料整理出来,供大家学习。 【敏捷开发】 敏捷个人和敏捷开发 敏捷开发...

Mr_zebra ⋅ 05/10 ⋅ 0

iOS开发专题分类大全(iOS学习资源大收录!)

序言 系统的整理iOS开发常用的第三方库、架构、进阶、面试学习书籍资源等,如果有更好的三方库、没有整理到、可以评论留言,我会在及时更新的,还不赶快mark~ 多看书!毕竟看一本适合自己的...

_小迷糊 ⋅ 06/08 ⋅ 0

敏捷项目管理:基础知识与应用实务

 拜读许秀影博士的《敏捷项目管理:基础知识与应用实务》一书,收获满满的,干货满满的,无论是对传统项目管理还是对互联网项目管理,都有了较深入的理解。基于对本书的阅读和摘录,为了系统...

技术mix呢 ⋅ 2017/10/11 ⋅ 0

笨鸟Linux学习连载之 - 万事开头难

我下定决心系统学习Linux是半年之前,因为被公司派到西安工作,有足够的闲暇时间来听课,所以就在网上报了个Linux云计算架构师的培训班,其培训课程主要分四个阶段,第一阶段学习Linux常用基...

望云眷属 ⋅ 2017/02/17 ⋅ 0

知识图谱的独特之处——深度学习无法解决的人工智能

知识图谱的独特之处——深度学习无法解决的人工智能 摘要:2018云栖大会上海峰会,阿里云高级算法专家林奈对特定领域知识图谱的构建及应用案例进行讲述,最近几年知识图谱有一些过气,但是由于...

云迹九州 ⋅ 昨天 ⋅ 0

Jetty源码学习1-前言

如果你想大致了解下Jetty的结构和工作原理,可以参照 应用服务器架构,Jetty架构及基本原理; 如果你想深入了解下Jetty的运作细节,可以参照 NIO架构网络服务器,Handler详解; 如果你想对J...

项籍20130121 ⋅ 2013/02/05 ⋅ 6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 31分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 35分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 40分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 42分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 52分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 今天 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 今天 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 今天 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部