
设计思想
文章平均质量分 81
什么啊什么Q
keep slow
展开
-
服务容错
一、容错方案要防止雪崩的扩散,我们就要做好服务的容错:保护自己不被猪队友拖垮的一些措施。常见的容错方案:隔离、超时、限流、熔断、降级1、隔离将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务。常见的隔离方式有:线程池隔离和信号量隔离。2、超时上游服务调用下游服务时,设置一个最大响应时间,如果超过这个时间,下游未作出响应,就断开请求,释放掉线程。3、限流限制系统的输入和转载 2021-04-14 16:17:53 · 283 阅读 · 0 评论 -
并发编程模型
并发系统可以采用多种并发编程模型来实现。并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业。不同的并发模型采用不同的方式拆分作业,同时线程间的协作和交互方式也不相同。这篇并发模型教程将会较深入地介绍目前(2015年,本文撰写时间)比较流行的几种并发模型。并发模型与分布式系统之间的相似性本文所描述的并发模型类似于分布式系统中使用的很多体系结构。在并发系统中线程之间可以相互通信。在分布式系统中进程之间也可以相互通信(进程有可能在不同的机器中)。线程和进程之间具有很多相似的特性。这也就是为什么很转载 2021-04-01 12:22:08 · 304 阅读 · 0 评论 -
一文讲懂蓝绿发布和金丝雀发布
在之前关于CI/CD的文章中,我们简单讨论了蓝绿部署和金丝雀发布以及它们在持续交付中所扮演的角色。这些都是十分有效的方法,能够大大降低与应用程序部署相关的风险。所以,这篇文章我们来深入介绍蓝绿部署和金丝雀发布。蓝绿部署和金丝雀发布通过让IT人员可以在发布过程中发生问题时能够还原到先前版本来减轻应用程序部署的风险。这两个方法让版本之间来回切换就像轻按开关一样容易,并且可以自动执行,从而最大程度减少了用户暴露在错误代码的时间。在我们更进一步讨论这两种方法之前,让我们先区分部署和发布。如何将部署与发布转载 2021-03-10 17:34:27 · 585 阅读 · 0 评论 -
系统设计有状态、无状态
一,系统设计:有状态、无状态惯例,先看栗子网站登录校验,很普通的一个功能对于这个功能我们要如何实现?先分析一下登录校验是个啥意思举个栗子,比如我们在登陆页输入用户名密码,登录了社交网站这时候想去看自己的新鲜事,却告诉我请先输入用户名密码进行验证。。这时候想去吐槽下这个2B体验,发个新鲜事,点完发布按钮时,又弹出框说请输入用户名密码进行验证。。。这时候脑子里上千个草泥马奔腾而过这样的产品可以说拜拜了对我们的用户来说,登录操作其实完成一次就够了,后续的操作服务应该能够自动...转载 2021-03-10 13:32:38 · 295 阅读 · 0 评论 -
缓存和数据库双写一致性分析
在做系统优化时,想到了将数据进行分级存储的思路。因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息。基本上配置了很久才会变一次。而有一些数据实时性要求非常高,比如订单和流水的数据。所以这里根据数据要求实时性不同将数据分为三级。 第1级:订单数据和支付流水数据;这两块数据对实时性和精确性要求很高,所以不添加任何缓存,读写操作将直接操作数据库。 第2级:用户相关数据;这些数据和用户相关,具有读多写少的特征,所以我们使用redis进行缓存。 第3级:支付配置信息;转载 2021-03-10 10:41:45 · 128 阅读 · 0 评论 -
简单讲懂什么是分布式
一、三个步骤完成华丽转身——任意软件变为“分布式”分布式——一个高大上的名词,是计算机软件设计中人民群众喜闻乐见的“逼格满满”、“不明觉厉”的几个名词之一。但很可惜,这玩意儿一点也不复杂,甚至有些“简单”。不信?你只要遵循下述步骤即可将任何一个软件拆分为“分布式”的:将你的整个软件视为一个系统(不管它有多复杂) 将整个系统分割为一系列的 Process(进程), 每个 Process 完成一定的功能 将这些 Process 分散到不同的机器上。分散后,选择若干种(没错一种可能不够)通信协议把他们连转载 2021-03-10 10:09:35 · 5388 阅读 · 1 评论 -
声明式和代码式
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方转载 2020-11-16 11:36:08 · 207 阅读 · 0 评论 -
MVC和三层架构
MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性、可移植性,代码的可重用性。MVC即Model、View、Controller即模型、视图、控制器。我在和同行讨论技术,阅读别人的代码时发现,很多程序员倾向于将软件的业务逻辑放在Controller里,将数据库访问操作的代码放在Model里。最终软件(网站)的代码结构是,View层是界面,Controller层..转载 2020-11-11 09:59:18 · 122 阅读 · 2 评论 -
Sidecar设计模式
Sidecar设计模式正在收到越来越多的关注和采用。作为Service Mesh的重要要素,Sidecar模式对于构建高度高度可伸缩、有弹性、安全且可便于监控的微服务架构系统至关重要。而Service Mesh也已经被证明,正在改变企业IT的“游戏规则”,它降低了与微服务架构相关的复杂性,并提供了负载平衡、服务发现、流量管理、电路中断、遥测、故障注入等功能特性。什么是Sidecar模式?Sidecar模式是一种将应用功能从应用本身剥离出来作为单独进程的方式。该模式允许我们向应用无侵入添加多种功能,避转载 2020-10-27 10:59:34 · 274 阅读 · 0 评论 -
什么是服务网格
服务网格用于控制应用的不同部分之间如何共享数据。与用于管理此类通信的其他系统不同,服务网格内置于应用程序中的专用基础架构层。这个可见的基础架构层可以记录应用的不同部分是否能正常交互。因此,随着应用的不断发展,它在优化通信和避免停机方面就显得更加有用。应用的每个部分——即“服务”,都要与其他服务相互协作,来为用户提供所需的内容。如果在线零售应用的用户想购买什么东西,他们得知道该商品是否有货。因此,负责与公司库存数据库通信的服务需要与产品网页进行通信,而产品网页本身,也需要与用户的在线购物车通信。为了增加业转载 2020-10-22 15:29:25 · 411 阅读 · 0 评论 -
soa和微服务的区别
1.SOA架构和微服务架构的区别首先SOA和微服务架构一个层面的东西,而对于ESB和微服务网关是一个层面的东西,一个谈到是架构风格和方法,一个谈的是实现工具或组件。1.SOA(Service Oriented Architecture)“面向服务的架构”:他是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。一个服务 通常以独立的形式存在与操作系统进程中。各个服务之间 通过网络调用。2.微服务架构:其实和 SOA 架构类似,微服务是在 SOA 上做的升华,..转载 2020-10-20 09:43:44 · 5402 阅读 · 0 评论 -
SOLID设计原则
在程序设计领域, SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期引入,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。1 单一职责原则(SRP)一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中,即又定义有且仅有一个原因使类变更。(甲类负责两个不同的职责:职责A,职责B。当由于职责A需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责B功转载 2020-08-06 13:58:58 · 259 阅读 · 0 评论 -
SpringMVC是什么
一个MVC框架。在web模型中,MVC是一种很流行的框架,通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,是为了简化开发,减少出错。还是为了组内开发人员之间的配合。总之就是一种分层工作的办法。SpringMVC是spring的一个子框架,当然拥有spring的特性,如依赖注入。SpringMVC的信息流首先用户通过HTTP...转载 2020-05-07 15:45:31 · 197 阅读 · 0 评论 -
软件工程本质
软件工程本质,是如何把现实世界的事物抽象成计算机世界的事物。产品经理的作用,是提炼出现实世界的需求,构建一个成功的功能模型。软件开发者的作用,就是把功能模型中的每一个功能单元,转化成计算机的模型,即确定输入,处理计算输入,得出输出。开发者不断提高的是如何选择一个好的输入源,比如binlog,将mysql的log日志作为输入源,使得同步数据库成为可能。 如何更好的计算,提升性能,这时候...原创 2020-03-06 10:28:16 · 459 阅读 · 0 评论 -
接耦与单元测试可测性
单元测试在一个完整的软件开发流程中是必不可少的、非常重要的一个环节。通常写单元测试并不难,但有的时候,有的代码和功能难以测试,导致写起测试来困难重重。因此,写出良好的可测试的(testable)代码是非常重要的。接下来,我们简要地讨论一下什么样的代码是难以测试的,我们应该如何避免写出难以测试的代码,以及要写出可测试性强的代码的一些最佳实践。什么是单元测试(unit test)?在计算机编...转载 2019-12-28 17:50:00 · 715 阅读 · 0 评论 -
迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。封装的含义被调用方的操作细节都封装在类中,而不需要被客户端知晓,比如利用迭代器封装类的遍历方式,就不用管目标类中用的是数组,列表,集合来作为容器,我们只需要获取迭代器,迭代器由具体的目标类来实现,客户端就不用操心这这个事情了。设计原则一个类应该只有一个引起变化的原因。也就是说一个类只有一个责任,只支持...原创 2019-04-20 14:29:31 · 165 阅读 · 0 评论 -
复合模式-MVC
复合模式结合至少两个设计模式,组成一个解决方案,解决一再发生的一般性问题。MVCMVC是一种威力强大的复合模式,内部有多个设计模式,因此如果你想了解MVC,应该先了解基本的设计模式。M,model模型,模型持有所有的数据、状态和程序逻辑。V,visual试图,用来呈现状态和数据,是和用户交互的界面。C,control控制,取得用户的输入并告知模型如何作出对应的动作。C层...原创 2019-04-25 11:25:12 · 622 阅读 · 0 评论 -
IOC和AOP理解
IOCinverse of control ,即控制反转。1)什么叫控制反转?原先,当我们在一个对象中要引用另外一个对象,最原始的方法就是。。对了,就是new,这样当当对象数量和依赖关系增多的时候,,会造成一个问题,耦合过重。比如,想将引入的对象换成其子类对象,就没法避免要去修改客户端中的世界各个角落中的对象。这种工作量是非常恐怖的。当然你可以用工厂模式,就是把创建对象的权利交给了...原创 2019-03-21 14:15:50 · 207 阅读 · 0 评论 -
备忘录类
在不被破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。优点:实现新的封装和提供了状态恢复的实现机制缺点:资源消耗过大模式结构:1.Originator(原发器)保存内部状态的类称为原发器。原发器可以创建一个备忘录,并存储它的当前状态,也可以使用备忘录来恢复其内部状态。一句话,触发存储操作和恢复操作。2.Mem...转载 2019-04-26 20:48:29 · 162 阅读 · 0 评论 -
外观模式
外观模式用一个接口,简化子类系统中的一群复杂的接口调用。外观模式,并没有封装原先的子系统,其只是提供另外的简化接口,代替原先对于子系统的复杂调用。外观模式将客户代码从子系统中解耦,任何对子系统的升级都不会影响客户原先的代码内容。适配者的意图是改变接口,外观的意图是简化接口,装饰的意图是增加类的功能。最少知识原则减少对象之间的交互。可以这样理解,我们不要调用组件内部组件的方法,这...原创 2019-04-10 18:20:27 · 190 阅读 · 0 评论 -
模版方法模式
模版方法模式模版方法要用final进行修饰,可以防止该算法被子类覆盖。模版方法就是提供并保护了一个算法骨架,子类为一个或多个步骤定义具体实现。模版方法提供一个钩子钩子的作用是根据某些条件实现模板算法中的可选部分。使子类可以对超类的模版作出一定的影响和抉择。Runtime.getRuntime().addShutdownHook();是Jvm在退出后的一个钩子。好莱坞原则我来找你...原创 2019-04-19 19:22:26 · 86 阅读 · 0 评论 -
代理模式
代理模式为另一个对象提供一个替身或占位符以控制这个对象的访问。代理模式有很多变体,而这些变体几乎都和控制访问的做法有关。proxy和realObj实现相同的接口,当调用proxy的某一个方法时,proxy作出某种控制,去调用真正的realObj,并将处理结果传给proxy,proxy将结果返回给调用者。这就是代理模式的基本逻辑。远程代理当我们想要调用远程的类的方法时,我们先调用本地...原创 2019-04-23 22:11:48 · 92 阅读 · 0 评论 -
组合模式
组合模式允许你将对象组合成树型结构来表现整体/部分层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。为了保持透明性,节点和叶节点需实现同样的接口。虽然实现了同样的接口,但实现内容却不相同,节点需要有一个集合,而叶节点却不需要组合一个集合,节点的某些方法是用遍历实现的,而叶节点的该方法却是具体的实现。节点和叶节点总会有不需要实现的方法,这时候可以不做事,可以返回null,可以返...原创 2019-04-20 18:23:26 · 128 阅读 · 0 评论 -
工厂模式
当运用多态实例化对象的时候,有时候要根据条件选择不同的实现类对象。但是用new的时候,就无法避免用具体实现类。简单工厂模式只是简单的把创建对象的代码转移到Factory类中,调用该类的create方法,返回一个对象。这样的好处是将创建代码集中于一处,可以有多个客户进行调用,方便管理,就像把所有的羊用栅栏围起来一样。而且客户方不需要知道创建对象的细节,也就是解耦了。静态工厂模式只是把...转载 2019-04-03 13:50:58 · 97 阅读 · 0 评论 -
装饰者模式
设计原则:类应该对扩展开放,对修改关闭。注意是类的扩展-修改,而不是业务流程代码,当有新的行为时,业务流程代码肯定要变,但是类可以不变和复用。继承没有弹性,那是因为类的行为在编译时就静态决定了,想改变行为,必须修改源代码。组合有弹性,是因为类的行为是通过组合的超类调用的,当超类引用指向不同的实现类对象时,只用扩展实现类对象而不用修改类的源代码,类就能产生不同的行为,这种就可以说类的行为在运...原创 2019-04-02 16:29:14 · 166 阅读 · 0 评论 -
命令模式
命令模式把方法调用封装起来。日志记录,撤销等行为。命令模式可以将“动作的请求者”从“动作的执行者”对象中解耦。但是当你调用方法的时候,不用执行者对象去调用,怎么可能?利用命令对象,把请求封装成一个特定的对象,当调用请求时,直接用该命令对象调用。而该命令对象组合了执行者对象,这就达到了上述的解耦目的。这让我想起了,遥控器的学习功能。是不是也是用这种方式进行解耦的。只要动作调用者用接口...原创 2019-04-08 11:49:44 · 169 阅读 · 0 评论 -
适配者模式
适配器模式将对象包装起来,并将其接口转化为想要的接口,以符合客户的期望。(与装饰者比较,后者将对象包装起来,赋予对象新的职责)客户和被适配者是解耦的,因为客户不知道被适配者的细节。对象适配器和类适配器对象适配器组合被适配者,被适配者及其子类都可以适配,弹性更强。类适配器通过多重继承目标接口和被适配者,java无法使用,且弹性不足。枚举类和迭代类Enumeration类枚举器...原创 2019-04-10 17:40:13 · 252 阅读 · 0 评论 -
观察者模式
什么叫松耦合对象间可以交互,但是他们并不太清楚彼此的细节。这就是多态的魅力,出版者只需要知道订阅者实现了某个接口,就可以了,不用清楚这些对象具体是怎么实现这些接口的,即使有新的对象加入,只要它实现了这个接口,出版者就不用修改自己的代码。即使订阅者修改了自己的代码,并不会影响出版者,因为两者是松耦合的。只要他们之间遵守接口的约定,我们就可以自由的改变他们。设计原则:为了交互对象间的松耦合设计...原创 2019-04-01 11:42:15 · 344 阅读 · 0 评论 -
策略模式
继承和实现的思考继承和实现的目的是多态,多态的作用就是为了一段代码用超类调用方法,根据运行时传入的对象动态转化为具体子类去执行这个方法,而不用修改代码。继承和实现的目的不是为了代码复用,因为复用的代价是高耦合,组合的目的是代码复用,是代码复用的更有弹性的方法。接口和抽象类的存在意义是多态,如果是代码复用的话,接口是个笑话,你要在每一个实现类中书写相同代码,而修改代码时的重复维护更恐怖。抽象...原创 2019-03-31 17:15:35 · 263 阅读 · 0 评论 -
OO设计原则
模式还是原则?私以为,设计原则就像授之以渔,设计模式就像授之以鱼。更侧重学习设计原则的原因OO设计模式有很多,基础的设计模式为大名鼎鼎的GOF23设计模式,另外还有很多种特定领域的设计模式。套路太多。 设计模式是对设计原则实践的经验总结,可以让代码模块解耦,易于扩展和维护。随着微服务的推广,每一个功能模块都可以分离出一个独立的服务,并通过restFul接口调用进行功能模块间的解耦。微...原创 2019-03-31 15:44:42 · 357 阅读 · 0 评论 -
桥接模式
设想要绘制一幅图画,蓝天、白云、绿树、小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦。毕竟细细的蜡笔要涂出一片蓝天,是有些麻烦。如果 有可能,最好有套大号蜡笔,粗粗的蜡笔很快能涂抹完成。至于色彩吗,最好每种颜色来支粗的,除了蓝天还有绿地呢。这样,如果一套12种颜色的蜡笔,我们需 要两套24支,同种颜色的一粗一细。呵呵,画还没画,开始做梦了:要是再有一套中号蜡笔就更好了,这样,不多不少总共36...转载 2019-04-26 11:41:22 · 343 阅读 · 0 评论 -
生成器模式
生成器模式是一种创建型设计模式,它把对象的创建步骤抽象成生成器,并且可以通过指导类(director)对所有生成步骤的先后顺序进行控制。客户端使用指导类并传入相应的生成器,通过指导类的接口便可以得到相应的对象。以我的理解看,生成器模式中的生成器被用来对生成对象的每一个步骤自身进行控制,比如要产生一辆汽车(最终对象),那么玻璃是用普通玻璃还是防弹玻璃(生成最终对象的一个步骤)。而指导类主要用来设...转载 2019-04-26 14:20:27 · 134 阅读 · 0 评论 -
状态模式
唯一不变的原则就是变化一个刚刚设计完毕并诞生的程序,后续必须随着客观世界的改变而进行更新,否则,这个程序会随着时间的流逝而腐烂,最终一无是处。因此,当设计程序时,要时时刻刻想着未来有可能发生的变化,以及如何应对这种变化。而这就是设计模式的核心意义所在。一个好的程序设计,必须易于扩展。一个坏的程序,当你想扩展的时候,就会发现举步维艰,通常改一处,就会影响其他四五处,且潜在的bug无法预知,随...原创 2019-04-23 11:45:06 · 112 阅读 · 0 评论 -
访问者模式
访问者模式介绍最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,但是一旦需要使用它时,那就真的需要使用了。访问者模式是一种将数据操作和数据结构分离的设计模式。(觉得太抽象,可以看下面的例子)。访问者模式的使用场景对象结构比较稳定,但经常需要在此对象结构上定义新的操作。 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要...转载 2019-04-26 21:54:16 · 355 阅读 · 0 评论 -
原型模式
原型模式原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,...转载 2019-04-26 21:31:28 · 123 阅读 · 0 评论 -
原型模式中浅克隆和深克隆
原型模式所谓的原型模式,无非就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。所谓的原型模式,其实质就是编程需要中的克隆技术,以某个对象为原型,复制出新的对象。只是需要注意深复制与浅复制的问题。其实关于原型模式,大话设计模式这本书中的相关实例已经说明的比较通俗了,这里只是重新梳理深复制与浅复制的区别和实例浅复制Java中针对基本数据类型的成员变量,在浅复制的时候...转载 2019-04-26 21:23:54 · 420 阅读 · 0 评论 -
中介者模式
在我们的生活中处处充斥着“中介者”,比如你租房、买房、出国留学、找工作、旅游等等可能都需要那些中介者的帮助,同时我们也深受其害,高昂的中介费,虚假信息。在地球上最大的中介者就是联合国了,它主要用来维护国际和平与安全、解决国际间经济、社会、文化和人道主义性质的问题。国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌人,熟话说没有永远的朋友,也没有永远的敌人,只有永远的利益!所以国与国...转载 2019-04-26 19:30:26 · 171 阅读 · 0 评论 -
解释器模式
为人处事是一门大学问,察言观色、听懂弦外之音都是非常重要的,老板跟你说“XX你最近表现平平啊,还得要多努力”,如果你不当回事,平常对待,可能下次就是“XX,恩,你人还是不错,平常工作也很努力,但是我想这份工作可能不是很适合你…..”。又比如你老大说“XX,你最近表现不错,工作积极性很高啊!继续保持啊!”,你高兴乐呵着心想是不是老板要给我加工资了,可能你等到花都谢了也没有,得到的可能会是...转载 2019-04-26 19:01:34 · 126 阅读 · 0 评论 -
享元模式
享元模式(Flyweight)是一种结构型设计模式,它的出现是为了在使用大量细粒度对象时节省空间。在使用大量细粒度对象时,它们彼此之间往往有所相同,又有所不同。比如在一个PPT文档中,可能多处出现了“A”这个字母。它们之间的共同处是字形一样,都是A;不同是颜色不同,有的地方字体颜色为黑,有的地方为灰。我们把这些对象之间相同的地方抽象出来称为“内蕴状态”,不同的地方称为“外蕴状态”。在使用享元模...转载 2019-04-26 15:14:36 · 164 阅读 · 0 评论 -
责任链模式
如果你有Web方面的经验,在JavaScript中的事件流、Java Web中的过滤器,其实都是职责链模式的体现。职责链模式可以这么来形容。A、B、C三个人去参加一个解题比赛,但是A更擅长数学问题,B更擅长理化问题,C更擅长文史问题。于是他们决定这样做:每接到一道题,A先阅读,如果是数学题A解答,否则传给B;B阅读后如果发现是理化题,则B解答,否则传给C来解答。这样A->B->C就构...转载 2019-04-26 14:29:53 · 145 阅读 · 0 评论