Spiga

构建高可用应用(四):架构分隔

2017-07-26 18:07:02

摘要:什么是架构分隔 单体 单体:是把系统部署到一台服务器上,所有的请求业务都由这台服务器处理 优点:适合小型系统,节省资源 缺点:安全性低,一旦有突发压力, 整个系统都会面临崩溃 分层—隔离效果 分层:分层架构的一个突出特性是组件间关注点分离 (separation of concerns)。一个层中的组件只会处理本层的逻辑。 比如说,展示层的组件只会处理展示逻辑,业务层中的组件只会去处理业务逻辑 组件分离,让我们更容易构造有效的角色和强力的模型。这样应用变的更好开发,测试,管理和维护。 忌:分层使架构变得复杂,我们不能为了分层而分层 纵向分层是为了什么 整体灵活性 分析:总体灵活性是响应环境变化的能力。尽管分层模式中的变化可以隔绝起来,想在这种架构中做一些也改变也是并且费时费力的。分层模式的笨重以及经常出现的组件之间的紧耦合是导致灵活性降低的原因。 易于部署 分析:这取决于你怎么发布这种模式,发布程序可能比较麻烦,尤其是很大的项目。一个组件的小小改动可能会影响到整个程序的发布(或者程序的大部分)。发布必须是按照计划,在非工作时间或者周末进行发布。因此。分层模式导致应用发布一点也不流畅,在发布上降低了灵活性。 可测试性 分析:因为组件都处于各自的层次中,可以模拟其他的层,或者说直接去掉层,所以分层模式很容易测试。开发者可以单独模拟一个展示组件,对业务组件进行隔绝测试。还可以模拟业务层来测试某个展示功能。 性能 分析:尽管某些分层架构的性能表现的确不错,但是这个模式的特点导致它无法带来高性能。因为一次业务请求要穿越所有的架构层,做了很多不必要的工作。 伸缩性 评级:低 分析:由于这种模式以紧密耦合的趋势在发展,规模也比较大,用分层架构构建的程序都比较难以扩展。你可以把各个层分成单独的物理模块或者干脆把整个程序分成多个节点来扩展分层架构,但是总体的关系过于紧密,这样很难扩展。 易开发性 分析:在开发难度上面,分层架构得到了比较高的分数。因为这种架构对大家来说很熟悉,不难实现。大部分公司在开发项目的都是通过层来区分技术的,这种模式对于大多数的商业项目开发来说都很合适。公司的组织架构和他们软件架构之间的联系被戏称为”Conway’s law”。你可以Google一下查查这个有趣的联系。 隔离设计原则 1,第一个依据是基于目的划分层次。 以领域驱…… 阅读全文

构建高可用应用(三):架构冗余

2017-07-16 10:44:40

摘要:什么架构冗余 单体 单体:是把系统部署到一台服务器上,所有的请求业务都由这台服务器处理 优点:适合小型系统,节省资源 缺点:安全性低,一旦有突发压力, 整个系统都会面临崩溃 集群 集群:把系统的各个功能拆分成不同的小系统,主要是分散能力 优点:资源利用率高,可以承担部分压力,降低耦合度,易于扩展 缺点:安全性低,如果其中一台服务器出现问题整个系统就会崩塌 忌:服务器架构单点,集成必须解决单点问题 冗余是什么 多余的重复或啰嗦内容(包括信息、语言、代码、结构、服务、软件、硬件等等)均称为冗余。冗余有两层含义,第一层含义是指多余的不需要的部分,第二层含义是指人为增加重复部分,其目的是用来对原本的单一部分进行备份,以达到增强其安全性的目的,这在信息通信系统当中有着较为广泛的应用。 我们可以从两方面理解: 第一层:表示多余的不需要的部分,举个例子:一个数据库可以存储100万条数据,但是我们可以设置最多存储80万条,剩余的20万就是冗余,这样就提高一定的读写性能。那如果达到80万之后还要增加数据怎么办?可以通过更换硬件、增加数据库数量、分库分表等方式来解决! 第二层:是说增加重复部分,上面所说的集群可以说是一种冗余 总结:集群是一种冗余,但是冗余可不一定是集群! 冗余能够给我们架构带来什么 解决服务器架构单点! ! ! 具体表现:实现架构的高并发[多客户场景],实现系统高可用[安全场景] 一个好的系统设计应该是分布式和集群的结合,先分布式再集群,设置适当的冗余, 具体实现就是业务拆分成很多子业务,然后针对每个子业务进行集群部署,这样某个子业务如果出了问题, 整个系统完全不会受影响。 冗余设计原则 1,平衡主节点故障允许时间T1和主备节点切换时间T2。 由于对于整个系统而言,需求被定位在节点的故障允许时间T。 当T1太长、T2太短时,系统用来监视主备节点运行状态的消耗就少些, 但对主备节点的切换性能要求高,这只有在主备节点间数据同步很充分的时候, 才能做到,所以就提高了对数据同步要求。 2,减少需要同步的数据量。一方面,对构件信息进行良好归类,分离出静态信息和可以自行获得的信息, 不需要对这些信息进行同步。另一方面,增大构件的尺寸,把内部联系紧密的构件聚合成较大的构件, 这样就减少了需要跟外部交换的信息,也可以减少需要同步的数据量。 被动式冗余架构 基于失败重试原理,在…… 阅读全文

构建高可用应用(二):分层实例 nginx实现keeplived

2017-07-05 19:37:27

摘要:高可用负载均衡: haproxy+keepalived 正文: 企业业务量比较小的时候,单台服务器就可以满足业务需要了。但是随着业务发展,单服务器的问题就凸显出来了: ·当服务器挂掉时,业务就会中断 ·当业务量增加,单台服务器性能变差,如何透明的扩展服务器和带宽,增加服务器吞吐量 负载均衡器可以解决以上问题 1 负载均衡器拓扑图 本文会根据拓扑图,用haproxy和keepalived搭建一个负载均衡器 2 准备 2.1 准备环境 准备5台CentOS7.3主机和一个VIP地址: ·准备一个可用IP用作虚拟IP(VIP): VIP: 192.168.1.100 ·负载均衡器会用到2台主机,一主一备的架构 lb1(默认为主): 192.168.1.101 lb2(默认为备): 192.168.1.102 ·后端服务器集群中主机的IP地址 s1: 192.168.1.2 s2: 192.168.1.3 s3: 192.168.1.4 2.2 主机配置 2.2.1 所有主机上关闭防火墙 systemctl stop firewalld systemctl disable firewalld 2.2.2 所有主机关闭selinux setenforce 0 vi /etc/selinux/config SELINUX=disabled 2.3 安装haproxy和keepalived lb1和lb2上安装haproxy和keepalived yum install haproxy keepalived -y 2.4 安装nginx(有其他后端测程序,可省略此步) s1 s2 s3上安装nginx,目的是把nginx作为后端,如果有其他后端程序,这一步可以省略 yum install epel-release -y yum install nginx -y 2.3 配置keepalived KeepAlived是基于VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)实现的一个高可用方案,通过VIP(虚拟IP)和心跳检测来实现高可用 Keepalived有两个角色,Master和Backup。一般会是1个Master,多个Backup。 Master会绑定VIP到自己网卡上,对外提供服务。Master和Backup会…… 阅读全文

构建高可用应用(一):架构分层

2017-06-29 23:06:29

摘要:什么是架构分层 架构的原理,分层的意义所在 富士康工厂10000人以上规模,目标:每天百万级的手机产出。如何实现呢? 角色分类,节点分离,在管理上面很常见。同理,架构也不外乎如此。 分层是表示将功能进行有序的分组:应用程序专用功能位于上层,跨越应用程序领域的功能位于中层,而配置环境专用功能位于低层。分层从逻辑上将子系统划分成许多集合,而层间关系的形成要遵循一定的规则。通过分层,可以限制子系统间的依赖关系,使系统以更松散的方式耦合,从而更易于维护。子系统的分组标准包含以下几条规则可见度。各子系统只能与同一层及其下一层的子系统存在依赖关系 为什么要架构分层 分层为什么在高可用/高并发场景必不可少 分层结构将应用系统正交地划分为若干层,每一层只解决问题的一部分,通过各层的协作提供整体解决方案。大的问题被分解为一系列相对独立的子问题,局部化在每一层中,这样就有效的降低了单个问题的规模和复杂度,实现了复杂系统的第一步也是最为关键的一步分解。 分层结构具有良好的可扩展性,为应用系统的演化增长提供了一个灵活的框架,具有良好的可扩展性。增加新的功能时,无须对现有的代码做修改,业务逻辑可以得到最大限度的重用。同时,层与层之间可以方便地插入新的层来扩展应用。 分层架构易于维护。在对系统进行分解后,不同的功能被封装在不同的层中,层与层之间的耦合显著降低。因此在修改某个层的代码时,只要不涉及层与层之间的接口,就不会对其他层造成严重影响。 反例,过度设计,分层会给我们带来哪些弊端 功能上线后,用户不关心 资源浪费 迭代速度慢,失去业务拓展的好时机 使用场景 分层在高可用使用场景 服务器架构keeolived 服务器架构脑裂场景 分层在高并发使用场景 服务器弹性伸缩 nginx反向代理 分层案例 反向代理同步架构 http://nginx.org CQRS异步架构 http://liuy.com/files/NiuNiuCQRs.zip 微服务中台架构 经典服务器分层架构图 阅读全文

IL指令详细解析

2016-10-02 22:49:24

摘要: 名称 说明 Add 将两个值相加并将结果推送到计算堆栈上。 Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上。 Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且将结果推送到计算堆栈上。 And 计算两个值的按位“与”并将结果推送到计算堆栈上。 Arglist 返回指向当前方法的参数列表的非托管指针。 Beq 如果两个值相等,则将控制转移到目标指令。 Beq.S 如果两个值相等,则将控制转移到目标指令(短格式)。 Bge 如果第一个值大于或等于第二个值,则将控制转移到目标指令。 Bge.S 如果第一个值大于或等于第二个值,则将控制转移到目标指令(短格式)。 Bge.Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令。 Bge.Un.S 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。 Bgt 如果第一个值大于第二个值,则将控制转移到目标指令。 Bgt.S 如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。 Bgt.Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令。 Bgt.Un.S 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。 Ble 如果第一个值小于或等于第二个值,则将控制转移到目标指令。 Ble.S 如果第一个值小于或等于第二个值,则将控制转移到目标指令(短格式)。 Ble.Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值小于或等于第二个值,则将控制转移到目标指令。 Ble.Un.S 当比较无符号整数值或不可排序的浮点值时,如果第一个值小于或等于第二个值,则将控制权转移到目标指令(短格式)。 Blt 如果第一个值小于第二个值,则将控制转移到目标指令。 Blt.S 如果第一个值小于第二个值,则将控制转移到目标指令(短格式)。 Blt.Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值小于第二个值,则将控制转移到目标指令。 Blt.Un.S 当比较无符号整数值或不可排序的浮点型值时,如果第一…… 阅读全文

CLR核心机制

2016-10-01 14:56:38

摘要:.NET CLR核心机制学习笔记 一、堆(Heap)与栈(Stack)的区别 1. 基本概念 栈(Stack):像叠盘子,后进先出。线程创建时由系统自动分配,存储值类型(如int、float、struct) 堆(Heap):像大仓库,需要时申请空间。存储引用类型(如class对象),由GC管理 2. 核心差异 特性 栈 堆 存储内容 值类型 引用类型 管理方式 自动维护(自动清理) GC垃圾回收 空间大小 较小(默认1MB) 较大(GB级) 访问速度 快(直接访问) 稍慢(通过指针) 二、内存分配实战 1. 值类型分配 int num = 42; // 直接分配在栈上 2. 引用类型分配 class Person {} var p = new Person(); // 实际对象在堆,p是栈上的引用 3. 混合情况 值类型中的引用类型:值类型在栈,内部的引用类型数据在堆 引用类型中的值类型:随对象整体存放在堆中 三、GC垃圾回收机制 1. 为什么要GC? 内存是有上限的,不可能无止境的分配空间,因此就产生了GC(Garbage Collector)的需求 . 1. 提高了软件开发的抽象度; 2. 程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题; 3. 可以使模块的接口更加的清晰,减小模块间的偶合; 4. 大大减少了内存人为管理不当所带来的Bug; 5. 使内存管理更加高效。 总的说来就是GC可以使程序员可以从复杂的内存问题中摆脱出来,从而提高了软件开发的速度、质量和安全性。 什么样的对象需要垃圾回收 托管资源 存在堆里(含值类型+引用类型) 托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等,大部分对象都是托管资源。 非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源,需要调用Dispose方法。 2. 回收算法(Mark-Compact) 标记阶段:从根对象出发,标记所有可达对象 清除阶段:回收未标记对象的内存 压缩阶段:整理内存碎片(像整理衣柜) 阶段1: Mark-Sweep 标记清除阶段,先假设heap中所有对象都可以回收,然后找出不能回收的对象,给这些对象打上标…… 阅读全文

WebApi

2016-09-04 18:22:21

摘要:webapi:使用asp.net core使用c#创建的Restful服务,就是webapi, webapi中的控制器是派生自ControllerBase的类, ControllerBase类 不要通过从 Controller 类派生来创建 Web API 控制器。 Controller 派生自 ControllerBase,并添加对视图的支持,因此它用于处理 Web 页面,而不是 Web API 请求。 此规则有一个例外:如果打算为视图和 Web API 使用相同的控制器,则从 Controller 派生控制器。 ControllerBase 类提供了很多用于处理 HTTP 请求的属性和方法。 例如,ControllerBase.CreatedAtAction 返回 201 状态代码: 下面是 ControllerBase 提供的方法的更多示例。 方法 说明 BadRequest 返回 400 状态代码。 NotFound 返回 404 状态代码。 PhysicalFile 返回文件。 TryUpdateModelAsync 调用模型绑定。 TryValidateModel 调用模型验证。 特性 Microsoft.AspNetCore.Mvc 命名空间提供可用于配置 Web API 控制器的行为和操作方法的属性。 下述示例使用属性来指定受支持的 HTTP 操作动作和所有可返回的已知 HTTP 状态代码: HttpPost [ProducesResponseType(StatusCodes.Status400BadRequest)] public ActionResult Create(Pet pet) { pet.Id = _petsInMemoryStore.Any() ? _petsInMemoryStore.Max(p = p.Id) + 1 : 1; _petsInMemoryStore.Add(pet); return CreatedAtAction(nameof(GetById), new , pet); } 特性 说明 [[Route\]] 指定控制器或操作的 URL 模式。 [[Bind\]] 指定要包含的前缀和属性,以进行模型绑定。 [[HttpGet\]] 标识支持 HTTP GE…… 阅读全文

Restful

2016-09-02 22:09:52

摘要:什么是API API全称Aplication Programming Itererface即应用程序编程接口, 我们在开发应用程序时经常用到。API作为接口,用来“连接”两个不同的系统,并使其中一方为另一 方提供服务,比如在操作系统上运行的应用程序能够访问操作系统所提供的API,并通过这些API来调用操,作系统的各种功能。因此,API 是一个系统向外暴露或公开的一套接口, 通过这些接口,外部应用程序能够访问该系统。在Web应用程序中,Web API具有同样的特性,它作为一个Web应用程序,向外提供了,在Web应用程序中,Web API具有同样的特性,它作为一个Web应用程序,向外提供了一些接口, 这些接口的功能通常是对数据进行操作,一些接口, 这些接口的功能通常是对数据进行操作(如获取或修改数据等),它们能够被外部应用程序,比如桌面应用程序、手机应用甚至其他Web应用程序(如ASP.NET Core MVC视图应用、单页Web应用)等访问并调用。WebAPI能够实现不同应用程序之间的访问,它与平台或编程语言无关,可以使用不同的技术来构建Web API,如Java、.NET等; 什么是REST REST(Representational State Transfer) 表述性传递状态,Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格,作为一种web服务的设计与开发方式,Rest可以降低开发的复杂性,提高系统的可伸缩性。 REST是一种基于资源的架构风格,在REST中,资源(Resource)是最基本的概念任何能够命名的对象都是资源,如:user,team,order,docment。他表示web服务要操作的一个实体,一个资源具有一个统一资源标识符。(Uniform Resource Identifier URI),如 users/123。通过资源能够标识并访问资源。 资源标识 主键编号进行标识 资源集合 除了单个资源外,资源集合表示多个相同类型的资源,如users。在系统设计时,不同的实体之间往往存在着某种关联关系。如一个用户有多个订单。同样,在REST中,这种关联关系也能够有资源之间的层次关系体现出来。如users/123/orders/1 由于REST资源为中心,因此REST接口的端点(Endpoint)均以资源或资源集合结尾,它…… 阅读全文

OpenID Connect

2016-08-13 21:08:52

摘要:OpenID Connect 如果要谈单点登录和身份认证,就不得不谈OpenID Connect (OIDC)。最典型的使用实例就是使用Google账户登录其他应用,这一经典的协议模式,为其他厂商的第三方登录起到了标杆的作用,被广泛参考和使用。 OpenID Connect简介 OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议。它使用简单的REST / JSON消息流来实现,和之前任何一种身份认证协议相比,开发者可以轻松集成。 OpenID Connect允许开发者验证跨网站和应用的用户,而无需拥有和管理密码文件。OpenID Connect允许所有类型的客户,包括基于浏览器的JavaScript和本机移动应用程序,启动登录流动和接收可验证断言对登录用户的身份。 OpenID的历史是什么? OpenID Connect是OpenID的第三代技术。首先是原始的OpenID,它不是商业应用,但让行业领导者思考什么是可能的。OpenID 2.0设计更为完善,提供良好的安全性保证。然而,其自身存在一些设计上的局限性,最致命的是其中依赖方必须是网页,但不能是本机应用程序;此外它还要依赖XML,这些都会导致一些应用问题。 OpenID Connect的目标是让更多的开发者使用,并扩大其使用范围。幸运的是,这个目标并不遥远,现在有很好的商业和开源库来帮助实现身份验证机制。 OIDC基础 简要而言,OIDC是一种安全机制,用于应用连接到身份认证服务器(Identity Service)获取用户信息,并将这些信息以安全可靠的方法返回给应用。 在最初,因为OpenID1/2经常和OAuth协议(一种授权协议)一起提及,所以二者经常被搞混。 OpenID是Authentication,即认证,对用户的身份进行认证,判断其身份是否有效,也就是让网站知道“你是你所声称的那个用户”; OAuth是Authorization,即授权,在已知用户身份合法的情况下,经用户授权来允许某些操作,也就是让网站知道“你能被允许做那些事情”。 由此可知,授权要在认证之后进行,只有确定用户身份只有才能授权。 (身份验证)+ OAuth 2.0 = OpenID Connect OpenID Connect是“认证”和“授权”的结合,因为其基于OAuth协议,…… 阅读全文

OAuth2

2016-08-10 15:01:34

摘要:OAuth2是什么 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息 OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0 Oatuh2用来做什么 有这样一种场景,一个用户(假设是QQ),希望让一个第三方的应用(比如说某个论坛),能够得到关于自身的一些信息(唯一用户标识,比如说QQ号,用户个人信息,比如说是一些基础资料,昵称和头像等)。但是在获得这些资料的同时,却也不能提供用户名和密码之类的验证信息。比如说用户不可能将自身的用户名和密码给第三方让第三方到用户中心之类的地方去获取信息。要达到这样的结果肯定有许多的实现方式。而Oatuh2就是实现上述目标的一种规范,或者说是具体实现的指导方案。 Oauth2具体做法 OAuth定义了四个角色: 资源所有者(resource owner): 能够对受保护资源授予访问权限的实体。当资源所有者是一个人时,它被称为终端用户。 资源服务器(resource server): 托管受保护资源的服务器,能够接受和响应通过令牌对受保护的资源的请求。 客户端(client): 代表资源所有者及其授权进行受保护资源请求的应用程序。术语“客户端”并不暗示任何特定的实现特征(例如,应用程序是在服务器,台式机还是其他设备上执行)。 授权服务器(authorization server): 成功后,服务器向客户端发出访问令牌验证资源所有者并获得授权。 授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以是与资源服务器相同的服务器或单独的实体。单个授权服务器可以发出可以被多个资源服务器接受的访问令牌。 Oauth2的流程 Oauth2,根据RFC6749文档,大致的流程如下图所示 上图中的client就是第三方应用。可以看到,Oauth的大致思路是一个线性的流程。 第三方应用向资源持有者请求获取资源 资源持有者授权给予第三方应用一个许可 第三方应用将该许可给予认证服务器进行认证,如果认证成功,返回一个Access Token 第三方应用使用该access token到资源服务器处获取该access token对应的资源(也就是第一步中资源持有者自身的资源) …… 阅读全文