架构/设计模式
微服务、设计模式、SAAS
深漂小码哥
芝兰生于深林,不以无人而不芳;君子修道立德,不为穷困而改节!
展开
-
事务、本地事务、分布式事务
什么是事务什么是事务?举个生活中的例子,你去小卖铺买东西,“一手交钱,一手交货”,就是一个事务的例子,交钱和交货必须全部成功,事务才算成功,任一活动失败,事务将撤销所有已成功的活动。明白上述例子,我们再来看,事务的含义,事务可以看做是一次大的活动,它有不同的小活动组成,这些活动要么全部成功,要么全部失败。本地事务在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性事项的,因此叫数据库事务,由于应用主要靠关系型数据库来控制事务,而数据库和应用通常在同一个服务器,原创 2021-03-02 07:08:52 · 420 阅读 · 0 评论 -
配置Nginx实现负载均衡
企业在解决高并发问题时,一般有两个方向的处理策略,软件、硬件,硬件上添加负载均衡器分发大量请求,软件上可在高并发瓶颈处:数据库+web服务器两处添加解决方案,其中web服务器前面一层最常用的的添加负载方案就是使用nginx实现负载均衡。 一、负载均衡的作用1、转发功能按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。2、故障移除...转载 2018-09-23 21:58:44 · 267 阅读 · 0 评论 -
企业项目架构部署
原创 2020-02-06 10:06:34 · 400 阅读 · 0 评论 -
Nginx5种负载均衡模式
1.roundrobin 轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式。 适用于后台机器性能一致的情况。 挂掉的机器可以自动从服务列表中剔除。2.weight 根据权重来分发请求到不同的机器中,适用于后台机器性能不一样的情况。3.ip_hash 根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。...原创 2018-09-23 22:01:05 · 1147 阅读 · 0 评论 -
分布式事务解决方案之2PC(两阶段提交)
2PC即两阶段提交协议,是将整个事务分成两个阶段:1.准备阶段:prepare phase2.提交阶段:commit phase举例:张三和李四好久不见,老友约起聚餐,饭店老板要求先买单,才能出票。这时张三和李四分别抱怨近况不如意,囊中羞涩,都不愿意请客,这时只能AA。只有张三和李四都付款,老板才能出票安排就餐。都是由于张三和李四都是铁公鸡,形成了尴尬的一幕:准备阶段:老板要求张三付款,张三付款,老板要求李四付款,李四付款。提交阶段:老板出票,两人纷纷落座就餐。例子中形成了一个事务,原创 2021-03-02 22:21:08 · 362 阅读 · 0 评论 -
“4+1”视图
“4+1”视图是对逻辑架构进行描述,最早由 Philippe Kruchten 提出,他在1995年的《IEEE Software》上发表了题为《The 4+1 View Model of Architecture》的论文,引起了业界的极大关注,并最终被RUP采纳,现在已经成为架构设计的结构标准。该模型五个主要的视图逻辑视图(Logical View),设计的对象模型(使用面向对象的设计方法时)。过程视图(Process View),捕捉设计的并发和同步特征。物理视图(Physical ..原创 2021-06-23 21:00:55 · 2125 阅读 · 0 评论 -
分布式事务Base理论
Base是Basical Availabel(基本可用)、Soft State(软状态)和Eventually consistent(最终一致性)三个短语的缩写。BASE理论是对CAP理论中AP的一个扩展,通过牺牲强一致性,来获得可用性,当出现故障,允许部分不可用,但要保证核心功能可用,允许数据在一段时间内是不一致的,但最终达到一致状态。满足BASE理论的事务,我们称之为“柔性事务”。1.基本可用:分布式系统再出现故障时,允许损失部分可用功能,保证核心功能可用,如电商网站交易付款出现问题了,商品;浏原创 2021-03-02 21:37:09 · 724 阅读 · 0 评论 -
SAAS系统架构之多租户设计的高性能
1.数据库层性能优化(1)建立合适的索引在原有的索引上,都增加一个tenant_id字段。由于tenant_id的选择性较强,一般tenant_id字段需要作为联合索引的第一个字段 所有的业务查询操作,都增加tenant_id字段进行过滤 索引应创建在条件(where)、排序(order by)、分组(group by)等操作所涉及的列上。 索引应该有较强的选择性,即应尽可能建立在重复数据少的的数据列中。 如果多个条件经常需要组合起来查询,应合理使用联合索引 一次查询中只能使用一个索引,可原创 2021-06-23 22:48:34 · 905 阅读 · 1 评论 -
SAAS的概念及优缺点
1.SAAS的概念SAAS 是英文Soft As A Service的缩写,中文的意思就是:软件及服务。SAAS的核心概念是软件的服务化。SAAS将软件看做是一种服务,而不是一种商品。SAAS的基本理论认为,软件的实质是服务。用户对软件的需求实际上是对应用服务的需求,而用户使用软件实际上是在消费应用服务。软件的用户是服务的需求者和消费者,而软件的提供商是服务的提供者和生产者。SAAS商业模式的提出,将软件业从基于生产制造的第二产业转变为基于服务的第三产业。这一转变是革命性的,彻底颠覆了传统软件业原创 2021-06-22 22:39:37 · 5560 阅读 · 1 评论 -
SAAS系统架构之数据存储方案
一.独立数据库概述:一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本也高。这种方案与传统的一个客户、一套数据、一套部署类似,差别只在于软件统一部署在运营商那里。如果面对的是银行、医院等需要非常高数据隔离级别的租户,可以选择这种模式,提高租用的定价。如果定价较低,产品走低价路线,这种方案一般对运营商来说是无法承受的。优点:为不同的租户提供独立的数据库,有利于简化数据模型的扩展设计,满足不同租户的独特需求。 如果出现故障,数据恢复比较简单缺点:增大了数据库的安装数.原创 2021-06-23 21:44:24 · 1907 阅读 · 0 评论 -
SAAS系统架构之成熟度模型
1.概述对于SAAS应用的架构师而言,尤其是从传统软件转型到SAAS的架构师,遇到的首要挑战就是多租户思维的转变。传统软件的销售模式决定了软件的每一个运行实例都服务于一个客户,因此对于性能、可配置性、伸缩性方面的处理策略都是针对单一客户所设计的。而对于SAAS应用,为了最大化SAAS的规模效应,一般采用的都是多个租户共享一个实例的架构(Multi-Tenant架构,及多租户架构)。如何在Multi-Tenant架构下,实现SAAS的高性能、可配置、可伸缩的目标,就是SAAS应用架构师所面临的最大挑战。这原创 2021-06-23 07:09:34 · 2386 阅读 · 1 评论 -
SAAS系统架构之安全性
一、应用安全1.身份认证2.权限管理3.日志记录4.应用监控二、数据安全1.数据隔离2.数据库连接安全3.敏感数据加密4.数据量监控三、网络安全1.安全传输采用https传输2.网络攻击防范3.网络监控参考书籍《互联网时代的革命-SAAS应用架构》...原创 2021-06-24 22:50:51 · 1119 阅读 · 0 评论 -
SAAS系统架构之安全性设计
1.系统级使用https协议以SSL交换数据,增强通信安全 通过数字签名防止传输过程篡改 对用户身份识别的UserToken使用DES算法数据加密 业务数据定时自动备份2.程序级完整的权限配置,包括功能权限和数据权限 客户端输入校验,防止JS攻击,XSS攻击、SQL注入等 辅助安全设计,比如密码控件、图片验证码、手机确认码等参考书籍《互联网时代的软件革命-SAAS架构设计》...原创 2021-06-23 21:51:35 · 594 阅读 · 0 评论 -
SAAS系统架构之多租户设计的可配置性
一、可配置性主要包括:数据可配置、功能可配置、页面可配置、流程可配置几大方面,传统产品配置和租户配置有很大区别:1.数据可配置实现数据的可配置主要有三种方案:(1)定制字段定制字段是传统应用采用的最常见的方案,就是根据客户需求在数据表增加相应的字段来保存扩展数据。例如根据租户33的需求,在客户表中增加来源source和介绍人introduce字段(2)预分配字段(3)名称值对2.功能可配置3.界面可配置4.流程可配置二、配置元数据管理三、可配置系统原创 2021-06-24 07:17:04 · 1711 阅读 · 1 评论 -
SAAS系统架构之多租户设计
一、概述采用“共享数据库,共享数据架构方案”,重点在于租户管理和数据隔离,租户管理:包括注册、订购、计费等,数据隔离:变更表结构,增加tenant_id字段。二、租户管理1.注册2.订购3.计费三、数据隔离...原创 2021-06-23 22:04:28 · 1917 阅读 · 1 评论 -
SAAS系统架构之可伸缩性
一、伸缩性的概念二、服务器层的水平扩展三、数据库层的水平扩展原创 2021-06-24 21:26:09 · 492 阅读 · 0 评论 -
【设计模式·创建型】原型模式Prototype Pattern
目的 指定一个已创建的实例作为原型,通过复制该原箱来创建新对象。系统中存在大量相同、相似的对象,利用构造函数来创建对象,比较耗费资源。用原型模式生成对象就很高效,就像美猴王拔下猴毛一吹,就能变出很多猴王一样 应用场景 (1)系统应该和产品的创建、表示、构成分离 (2)避免创建一个与产品层次平行的工厂类 构成 访问类、抽象原型、具体原型 备注 Windows传统安装方式比较慢,但是Ghost镜像复制方式安装,是无需知道细节的安装,会快很多。 .原创 2021-05-03 22:26:20 · 254 阅读 · 0 评论 -
设计模式概述
一、设计模式基本概念1.设计模式是一套反复使用的、经过分类的代码设计的经验总结。一个设计模式就是一个被反复验证且不错的实践解决方案,这种方案已经被成功应用,解决了在某种特定情境中重复发生的某个问题。2.设计模式的本质是面向对象设计原则的实际应用,充分理解了类的封装性、继承性和多态性以及类的关联关系和组合关系。3.设计模式的目的就是保证代码可重用、易理解、高可靠。设计模式的优点是简化并加快了软件设计、方便开发人员间的通信、降低了风险、有助于转到面向对象技术。二、设计模式基础1.设计模式的基原创 2021-05-03 15:46:57 · 753 阅读 · 0 评论 -
【设计模式·创建型】工厂方法模式Factory Method Pattern
目的 定义了一个接口用于创建对象,该模式由子类决定实例化哪个工厂类。该模式把类的实例化延迟到了子类。 优点 (1)调用者想创建对象,只需知道对象名称 (2)扩展性强,如需增加一个产品,只需要扩展一个工厂类。 (3)调用者只要了解产品的接口,无需了解产品的具体实现。 缺点 每增加一个产品,就要对应增加一个具体类和对象实现工厂,增加了系统复杂度 应用场景 (1)父类利用子类指定创建对象 (2)父类不清楚它所要建立的对象类原创 2021-05-03 16:02:11 · 175 阅读 · 0 评论 -
【设计模式·行为型】状态模式State Pattern
目的 状态模式中,把判断逻辑放入状态对象中,当状态对象的内部发生改变时,可以根据条件相应地改变其行为。而在外界看来,更像是对象发生了改变 应用场景 (1)必须在对象运行时改变对象的行为 (2)传统编程需要考虑所有可能发生的情况,使用条件选择语句if-else判断并选择执行。当新增状态时,需要新增if-else语句,程序扩展繁琐。针对条件表达式过于复杂,可以采用状态模式,分离判断逻辑变为一系列的状态类,这样,判断逻辑就变得更加简单 构成 环境、抽象状态、具体状原创 2021-05-05 14:10:47 · 191 阅读 · 0 评论 -
【PHP7设计模式】单例模式
<?php/** * 单例模式:确保某一个类只能有一个实例,通过私有属性,私有构造方法,私有克隆,公有静态方法(三私一公)开实现 * 应用场景:数据库的连接 */class Singleton{ private static $instance = null; private function __construct() { } private function __clone() { } public sta.原创 2020-10-24 21:29:22 · 391 阅读 · 0 评论 -
【设计模式·创建型】单例模式Singleton Pattern
目的 一个类只有一个自身创建的实例,提供该实例该所有其他对象。 应用场景 (1)类只能有一个实例,且多个应用程序只需调用同一个实例。 (2)无需修改客户端程序,即可使用一个由子类进行扩展的实例时 构成 单例类、访问类 备注 系统只能打开一个回收站、避免内存资源浪费、不一致等错误。 网站的计数器、打印机的后台处理服务、数据库的连接池、应用程序的日志对象、应用程序中的对话框、系统中的缓存等适合单例模式 ...原创 2021-05-03 22:19:21 · 217 阅读 · 0 评论 -
【设计模式·结构型】组合模式Composite Pattern
目的 将对象组合成树形结构,用于表示部分—整体关系 应用场景 (1)表示对象的部分——整体结构 (2)用户同一使用该接口所有对象,忽略组合对象与单个对象不同 构成 抽象构件、树叶构件、树枝构件 备注 文件、文件夹与文件夹的关系可以看成部分——整体关系 组合模式由抽象构件、树叶构件、树枝构件等组成(1)抽象构件:声明树叶构件和树枝构件公共接口的默认行为。(2)树叶构件:叶节点对象,没有子节点,实现了抽象构件中...原创 2021-05-04 07:53:52 · 184 阅读 · 0 评论 -
【设计模式·结构型】装饰模式Decorator Pattern
目的 由于继承方式是静态的,使用传统的继承方式扩展一个类的功能,会因为扩展功能增加,增加不少子类。如果使用组合关系创建装饰对象,可以不改变真实对象的类结构,又增加了动态额外的功能 应用场景 动态增加、撤销对象功能 构成 抽象挂件、具体构件、抽象装饰、具体装饰 备注 现实中往往,一些产品只完成了核心功能,需要增加一些新功能或者美化功能。比如进行房屋装修、新增QQ皮肤等。这种情况使用装饰模式比合适。 装饰模式由抽象挂件、具体挂件、抽象装饰、具...原创 2021-05-04 08:01:56 · 223 阅读 · 0 评论 -
【设计模式·行为型】命令模式Command Pattern
命令模式原创 2021-05-04 08:49:54 · 171 阅读 · 0 评论 -
【设计模式·行为型】模板模式Template Pattern
目的 将算法的一些步骤延迟到子类系统中实现,使得子类可以在不改变该算法结构的情况下,重新定义该算法的某些特定步骤 应用场景步骤 (1)提取多个子类共有的方法到父类 (2)不变的、重要的、复杂的方法,可作为模板方法 构成 抽象类、具体子类 备注 家具设计可以考虑使用模板方法、比如一个沙发包括骨架(木或者铁)、面料(皮或者布)、靠垫、五金等。只有客户提出个性化需求时,才产生不同的沙发样式。 模板模式由抽象类、具体子类组...原创 2021-05-04 08:32:54 · 202 阅读 · 0 评论 -
【设计模式·行为型】责任链模式Chain Of Responsibility Pattern
目的 多个对象有可能处理某一请求时,为避免冲突,将这些对象连成一条链,并沿着该链传递该请求,直到有一个对象处理它为止 应用场景 (1)多个对象均可处理单个请求,并且在运行时自动确定处理该请求的具体对象 (2)动态确定处理单个请求的对象集合 (3)客户无须指定接受特定接收者,可向多个对象发送请求 构成 抽象处理者、具体处理者、客户 备注 责任链模式就是“推卸”责任模式,你的事情,在我这里能处理就处理,处理不了就推给其他对象 ...原创 2021-05-04 08:48:30 · 226 阅读 · 0 评论 -
【PHP7设计模式】工厂方法模式
<?phpdeclare(strict_types=1);/** * 工厂方法:客户发出请求时,请求不同的工厂类(不同的工厂类实现同一一个工厂接口), * 由工厂类实例化不同的产品类(不同产品类实现同一个产品接口,并有各自的业务逻辑) */interface Framework { public function getName();}class ThinkPHP implements Framework{ public function getName(): .原创 2020-10-24 18:32:56 · 286 阅读 · 0 评论 -
【设计模式·行为型】观察者模式Observe Pattern
目的 该模式针对的是对象间的一对多的依赖关系,当被依赖对象状态发生改变时,就会通知并更新所有依赖它的对象 应用场景 对象改变的同时需要通知其他的对象。比如微信公众号与订阅公众号的用户,这里关系比较适合观察者模式 构成 抽象主题、具体主题、抽象观察者、具体观察者 备注 该模式又被称为发布——订阅模式,这个定义能更好地帮助理解 观察者模式由抽象主题、具体主题、抽象观察者、具体观察者等组成。(1)抽象主题:将全体观察者对象的引用存入至某一个...原创 2021-05-05 14:10:24 · 193 阅读 · 0 评论 -
【设计模式·结构型】外观模式Facade Pattern
目的 为了让子系统更加好用,为子系统中的一组接口提供一个一致的界面,一个高层接口 应用场景 (1)为复杂模块、子系统提供外界访问模块 (2)提高子系统独立性,子系统的变化不会影响调用它的客户类。 (3)减少低水平开发者引发的风险 构成 外观、子系统、客户 备注 软件子系统往往很多,如果客户端直接调用子系统,则客户访问系统比较复杂,且系统内部改变,客户端也会改变。这个时候,可以利用外观模式的外观角色,提供统一的接口 ...原创 2021-05-04 08:09:19 · 249 阅读 · 0 评论 -
Java饿汉式单例模式
package com.leo;/** * 饿汉式单例模式 */public class SingleTonTest1 { public static void main(String[] args) { Bank bank1 = Bank.getInstance(); Bank bank2 = Bank.getInstance(); System.out.println(bank1 == bank2); }}class Ba.原创 2021-05-12 04:46:23 · 317 阅读 · 0 评论 -
Java懒汉式单例模式
package com.leo;/** * 懒汉式单例模式 */public class SingleTonTest2 { public static void main(String[] args) { Order order1 = Order.getInstance(); Order order2 = Order.getInstance(); System.out.println(order1 == order2); }}.原创 2021-05-12 05:01:32 · 381 阅读 · 0 评论 -
【设计模式·创建型】抽象工厂模式Abstract Factory Pattern
工厂模式涉及的是同一类产品的生产,比如键盘厂只生产键盘,鼠标厂只生产鼠标。但现实中,工厂往往是生产一族产品的,比如计算机外设工厂既能生产键盘,又能生产鼠标,如果生产一族产品采用工厂模式,就要建设多个工厂,显然代价过高,因此为了描述这种现实情况,就引入抽象工厂模式。工厂模式只生产一类产品,而抽象工厂模式可生产相关联的多类产品,因此抽象工厂模式可以看做工厂方法模式的升级版。目的 该模式提供了一个接口可用于创建一组相关或相互依赖的对象;该模式由子类选择决定具体实例化类。抽象工厂方法模式中工厂类将具体原创 2021-05-03 16:17:44 · 186 阅读 · 0 评论 -
PHP利用 SPL 快速实现 Observer 设计模式
什么是 SPLSPL(Standard PHP Library)即标准 PHP 库,是 PHP 5 在面向对象上能力提升的真实写照,它由一系列内置的类、接口和函数构成。SPL 通过加入集合,迭代器,新的异常类型,文件和数据处理类等提升了 PHP 语言的生产力。它还提供了一些十分有用的特性,如本文要介绍的内置 Observer 设计模式。本文介绍如何通过使用 SPL 提供的SplSubject和SplObserver接口以及SplObjectStorage类,快速实现 Observer 设计模式...原创 2020-10-19 23:04:31 · 628 阅读 · 0 评论 -
【设计模式·结构型】适配器模式Adapter Pattern
目的 兼容不同接口,使其能协同工作。 该模式分类适配器模式、对象适配器模式。 (1)类适配器模式:该模式使用多重继承方式,进行接口间的匹配。该模式耦合度比较高,要求开发者了解组件内部结构,实际应用较少 (2)对象适配器模式:该模式对象的匹配依赖于对象组合 应用场景 (1)复用已存在的类但其接口不满足要求的情况。可以用于遗留代码复用、类库迁移等 (2)创建复用类吗,可以与无关类、未知类协同工作。 构成 目标接口、源适配器原创 2021-05-03 22:34:56 · 254 阅读 · 0 评论 -
【设计模式·行为型】迭代器模式Iterator Pattern
目的 提供一个对象来顺序访问聚合类(数据集合、列表等),而不暴露聚合类的内部细节 应用场景 (1)需要提供聚合对象的多种遍历方式 (2)访问聚合对象,而不会暴露内部表示 (3)提供统一的接口,遍历不同的聚合结构 构成 抽象聚合、具体聚合、抽象迭代器、具体迭代器 备注 链表遍历中,如果把链表创建与创立放入同一类,则更换遍历方式就需要更改源代码,这不利于程序扩展。如果将遍历方法交由客户实现,就会增加客户负担,还暴露了数据集合的内部结构,从而变得原创 2021-05-04 09:08:19 · 257 阅读 · 0 评论 -
【设计模式·结构型】代理模式Proxy Pattern
目的 让其他对象可以用代理的方式控制访问本对象 应用场景 12306代售火车票、代理访问单位内部数据库、快捷方式都可以看成是典型的代理模式 构成 抽象主题、真实主题、代理 备注 代理模式和外观模式的区别:代理对象代表一个单一对象,且该模式中客户端不同直接访问目标对象;外观模式代表一个子系统,该模式中客户端可以访问子系统中的每个对象 代理模式由抽象主题、真实主题、代理等角色组成。(1)抽象主题:通过接口声明了真实主题和代理对象实现的业务...原创 2021-05-04 08:24:35 · 250 阅读 · 0 评论 -
【设计模式·行为型】备忘录模式Memento Pattern
目的 备忘录模式又称快照模式。在不破坏封装性的前提下,捕获对象内部状态,并保存,以便以后可以恢复到该状态 应用场景 备份、恢复对象到某个时刻的状态 构成 发起人、备忘录、管理者 备注 操作Windows、Office等系统按Ctrl+Z键,可撤销当前操作恢复到操作之前的状态;数据库回滚、浏览器后退等都可以使用备忘录模式实现 备忘录模式由发起人、备忘录、管理者等组成。(1)发起人:记录当前时刻的内部状态信息;使用备忘录进行状态恢复。...原创 2021-05-05 14:10:06 · 242 阅读 · 0 评论 -
【设计模式·行为型】策略模式Strategy Pattern
目的 封装各个算法,不同的算法可以相互替换,但并不影响客户的使用 应用场景 (1)策略模式可以为多个只有行为差异的类,配置不同的行为 (2)不希望客户知道算法的数据结构 构成 抽象策略、具体策略、环境 备注 分类使用算法和算法的实现 策略模式由抽象策略、具体策略、环境等组成。(1)抽象策略:定义一个支持所有算法的公共接口,环境角色使用抽象策略调用具体算法(2)具体策略:抽象策略接口的具体实现,具体算法的实现...原创 2021-05-05 14:11:07 · 175 阅读 · 0 评论 -
【设计模式·创建型】建造者模式Builder Pattern
目的 分离一个复杂对象的构造与表示。该模式将一个复杂对象分解成多个简单的对象,然后追捕构建出复杂对象。该模式中,产品组成结构不变;但每个部分可以灵活选择。 应用场景 (1)需要生成的对象内部结构复杂,具体构造构造方法可能有复杂变化。 (2)构造过程允许构造对象有不同表示 构成 指挥者、产品、抽象构建者、具体构建者 备注 计算机由显示器、机箱、CPU、内存、磁盘等部件组装而成,部件组成结构、部件组装步骤差别不大,但具体部件可以灵活选择。原创 2021-05-03 22:14:03 · 176 阅读 · 0 评论