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 微服务中台架构 经典服务器分层架构图 阅读全文

面向切面编程(AOP)

2016-06-22 14:19:28

摘要:参考 在.net core 中使用AOP .NET Core中实现AOP编程--.NET西安社区 为AOP而生 — ASP.Net MVC默认的过滤器 AspNetCore 基于AOP实现Polly的使用 面向方面的编程 - 使用 RealProxy 类进行面向方面的编程 主要应用 日志记录 安全控制 性能统计 事务处理 异常处理 阅读全文

[推荐] 异步编程

2016-05-04 11:00:21

摘要:参考 C#执行异步操作的几种方式比较和总结 异步与多线程的区别(异步是目的,多线程是实现它的一种方式,异步的优先级有时候比主线程还高) - 子福当自强 - 博客园 c#异步编程 JavaScript异步机制与异步原理 异步编程的本质:绑定 - zzfx - 博客园 异步编程的本质:怎么处理异步请求(事件)与响应的关系 进阶篇:以IL为剑,直指async/await 官方文档 使用 Async 和 Await 的异步编程 .NET 异步详解 --能说清楚异步与多线程的区别,涉及到操作系统原理 await,async 我要把它翻个底朝天,这回你总该明白了吧 异步开发是什么 异步开发,就是利用线程技术,当执行一个占用时间长的任务时,不会阻止用户其它工作,而且其完成时会通知用户。 虽然是通过多线程来实现异步,但是因为一般异步时耗时的操作都不是针对CPU的,所以对CPU压力影响不大。 异步本质是通过线程池提高线程的利用率。 异步采用IO的DMA模式,不会消耗CPU资源。计算密集的工作,采用多线程。IO密集的工作,采用异步 举例:网络爬虫爬数据,如果数据很庞大,这个时候就需要使用异步了。 DMA:Direct Memory Access是IO的操作模式,可以直接访问内存,不经过CPU,不消耗CPU资源。 异步和多线程区别就是,充分利用DMA释放CPU压力。 异步实现方式:.net中实现异步的方式有定时器和多线程,一般都是使用多线程。 **使用场景:**要执行耗时且不需要立刻返回结果的操作,如:I/O操作、网络操作 争议: 有种说法是:异步是不阻塞当前主线程执行,通过子线程去执行,还有总说法刚好相反,具体参考:异步与线程阻塞 同步、异步、并行区别 同步:代码执行顺序默认是一行一行执行的,要等当前行的代码执行完后,才会执行下一行的代码。 异步:不用等当前行代码执行完毕就会执行下一行的代码。异步编程是一项关键技术,可以直接处理多个核心上的阻塞 I/O 和并发操作 并行:许多个人计算机和工作站都有多个 CPU 内核,以便多个线程能够同时执行。 为了利用硬件,你可以对代码进行并行化,以将工作分摊在多个处理器上。 并行和多线程、异步和多线程有啥关系? 异步和多线程:多线程是创建多个线程,消耗的是CPU,异步呢? 异步方法返回类型:void、Task、Task​ 异步编程模式: 基…… 阅读全文