精华内容
下载资源
问答
  • 架构设计

    千次阅读 2014-06-05 16:52:21
    1.每个人都是架构师 2.对架构设计的理解 3.架构设计解决的问题 4.架构设计五视图 5.如何后期使用架构设计

    1.每个人都可以做成为架构设计师

    不懂软件的和刚入行的人们一听到架构设计,都认为是非常的高大上课题,是一个遥不可及的领域,一般人是不能做的。听起来云里雾里的,第一印象除了来自微软,阿里这些NB的公司里面的人其余的都不能做出架构似的,这是一种先入为主的思想,因为大家都在强调架构师的重要性,他的薪资有多么的高,在整个社会对他的认定导致很多人对架构设计望而生畏。放正自己的心态其实架构设计并没有多么的复杂。我们是从编码入行的,在编码实现功能的过程中我们或多或少的设计了属于自己的软件架构了。

    为什么说软件架构师需要多少年的工作经验,因为软件架构就是系统的草图,不仅是代


    码编写而且包括部署,运行、开发等这些方面进行设计,目的是为了保证软件开发、运行、扩展、性能、安全、伸缩等等质量的一个保证。只要在编码过程中不仅仅要提升编码的质量而且要留心其他方面的知识积累与学习,用不了多久你也能成为一位优秀的架构设计师。

    2.什么是架构设计

    我们要成为架构设计师我们需要了解什么是架构设计。简单一点,架构设计就是一个系统的草图,描述了构成系统的抽象组件,以及各个组件之间的是如何进行通讯的,这些组件在实现过程中可以被细化为实际的组件比如类或者对象。在面向对象领域中,组件之间的联通通常面向于接口实现的。

    在“软件架构简介”中David Garlan 和Mary Shaw 认为软件架构师有关如下问题进行设计的:“计算的算法和数据结构之外,设计并确定系统整体结构,结构问题包括总体组织结构和全局控制结构;通信、同步和数据访问的协议;设计元素功能分配;物理分布;设计元素的组成;定标与性能;备选设计的选择。”

    架构和结构会难以区分,明确一点架构不是结构,IEEE把架构定义为“系统在其环境中的最高层概念”架构还包括系统完整性、经济约束条件、审美需求和样式等。在Rational Unified Process 中对软件架构的解释:软件架构指系统重要构建的组织或结构,这些重要的构建通过接口与其他构建进行交互。

    总体来说软件架构对软件从整体到部分的描述,从开发到运行再到后期扩展的描述,从性能和安全可靠性进行描述。

    3.架构设计为了解决什么问题

    开发之初逻辑设计阶段要确定系统如何开发,整个系统融合为一个系统开发还是从业务角度将系统拆分为几个独立的子系统。

    在即将进入开发的时候关注了数据是如何持久化的,以及数据库选型、以及非数据库文件的存储格式,等这些存储方案的确定。

    在开发过程中我们要关注如何保证开发质量,如何分层,代码可扩展性,使用的设计模式,依赖了那些框架,开发语言这些方向的确定。

    开发完成之后进入运行阶段,如何在架构设计的时候保证运行期间的质量属性、性能、可伸展性等,主要是系统运行进程的划分,以及进程之间通过线程来通信。

    同时如果系统并非是单机运行,还需考虑系统的物理部署,系统部署在那个服务器上,这些服务器配置性能怎样能否胜任系统的运行,操作系统选型,以及系统部署的网络拓扑图,还有就是保证数据安全的数据备份怎样设计的。

    以上五个问题是从五个角度来确定架构以及架构设计需要解决的问题。

    4.架构设计的五视图法

    我们刚才从五个不同的角度知道架构设计需要解决的问题,那么使用五视图法就更加系统的分析设计我们架构了


    从这幅图里面我们可以看出架构设计五视图中各个角度需要解决的问题了,并且可以看出他们之间的联系了。

    5.后期如何使用使用架构设计

    无论多么好的架构如果只是为了设计完成任务都是毫无意义的,我们设计出来的架构无论是好或不好我们首先需要按照架构设计来完成系统的开发,作为项目的Leader就需要严格按照架构设计出来的标准进行检查,无论我们的开发模式敏不敏捷,到一定时间都有一个里程碑的阶段,到了这个阶段Leader牵头严格按照架构设计文档中相应的章节对开发出来的系统进行检查,及早发现问题及早解决,不要把问题向后面推。

    展开全文
  • 【系统架构设计师】第一章:操作系统(1.2.2) 参考教材: 《系统架构设计师考试全程指导(第二版)》 《系统架构设计师教程》 1.2.2 信号量与pv操作 pv操作指的是两个:p操作和v操作。 有时候我们的进程在工作的...

    本篇帖子继续上篇。有兴趣可以点击链接进行查看以前写过的文章。
    【系统架构设计师】第一章:操作系统(1.2.2)
    参考教材:
    《系统架构设计师考试全程指导(第二版)》
    《系统架构设计师教程》

    1.2.2 信号量与pv操作

    pv操作指的是两个:p操作和v操作。

    有时候我们的进程在工作的时候,需要同时配合来干多件事情。比如,我们规定一个进程用来写入数据,另一个进程用来读取数据。

    很显然,这连个进程是不能互相干扰的,因此我们就需要提前对系统进行一下告知:使用这些资源的权力我先占用了,其他人不要进来。

    系统得知以后,如果有其他进程要写入数据或者读取数据,就会被系统安排成等待态。
    等我们的进程使用资源完成以后,在告知系统,其他进程可以使用这些资源。

    告知系统不要让其他进程操作这片内存的操作,就是p操作。
    告知系统此进程已使用内存完毕,就是v操作。

    我们因此可以得出使用pv操作的目的:
    为了解决不同进程的互斥(都需要共享独占性资源时)和同步(完成异步的两个进程的协作)问题,需要使用pv操作。

    想想看,如果是你,你会怎么用代码的方式解决呢?

    我这里用的是c语言的方式。

    首先,我们要有一个变量s。
    在pv操作中被称为信号量,表现形式是一个整数s和一个队列。你可以姑且认为这是个整形变量。
    当s>=0,代表某个资源的可用数;
    当s<0,其绝对值代表阻塞队列中等待该资源的进程数。

    其次是p操作。
    根据我们开始所说,p操作就是告知系统这片资源已经被使用,因此只要在本来的资源数上减1即可。不过我们要考虑一种情况,就是当可用资源为0或负数的时候,那么就要让程序进入等待。
    所以我们可以得出:

    if((s=s-1)<0){
    	printf("执行p操作的进程进入等待");
    }
    

    最后是v操作。
    这个同理,减一换成加一即可。

    if((s=s+1)<=0){
    	printf("从阻塞队列中唤醒一个其他处于阻塞态的进程");
    }
    

    互斥实例

    说了这么多,先来个实例,比如,对两个进程进行互斥控制。
    我这里给了两个程序。
    这两个程序是同时运行的,并且变量s是共享的,且初值为1。为了省事,这里我就简写了,省去了main之类的格式。

    我对p和v进行了一些小的修改,这样更符合c语言的标准。

    p:

    if((s=s-1)<0){
    	printf("执行p操作的进程进入等待");
    	return 0;
    }
    else{
    	return 1;
    }
    

    v:

    if((s=s+1)<=0){
    	printf("从阻塞队列中唤醒一个其他处于阻塞态的进程");
    	return 0;
    }
    else{
    	return 1;
    }
    

    进程A

    while(1){
    	if(p(s)){
    		printf("操作一下");
    	}
    	v(s)
    }
    

    进程B

    while(1){
    	if(p(s)){
    		printf("操作二下");
    	}
    	v(s)
    }
    

    仔细分析。
    我们这里先说明一个前提,即使我们的程序同时运行,由于某些特殊的原因,是不可能真正的同时启动的,稍微会有一些误差,比如某个进程会晚0.00000000001秒。我们这里就假设A进程是比较快的那个。

    第一次循环时,A先执行了p,然后s自减,输出了“操作一下”。

    此可我们的B启动,也执行了p,注意此可A还没有执行V,也就是说s还没有自增。由于我们的s已经从1自减到了0,再次执行,s=-1,if不成立,什么都不输出。

    当A执行完成v操作以后,我们的B已经到了第二轮,此可if成立,所以输出了“操作二下”。

    以此类推,你会发现,A和B永远都时一个执行,另一个就跳过。这样,我们就使用pv操作对进程的互斥。

    同步实例

    同步也是类似的操作。直接上例程。不过这次比较特殊,需要用到两个信号量,s1=1和s2=1。
    p:

    if((s=s-1)<0){
    	printf("执行p操作的进程进入等待");
    	return 0;
    }
    else{
    	return 1;
    }
    

    v:

    if((s=s+1)<=0){
    	printf("从阻塞队列中唤醒一个其他处于阻塞态的进程");
    	return 0;
    }
    else{
    	return 1;
    }
    

    进程A

    while(1){
    	if(p(s1)){
    		printf("操作一下");
    	}
    	v(s2)
    }
    

    进程B

    while(1){
    	if(p(s2)){
    		printf("操作二下");
    	}
    	v(s1)
    }
    

    仔细分析。

    这个其实A和B无论是否同时运行都行。

    假设我们的A先运行,执行第一遍的时候没什么问题,正常输出“操作一下”。

    但是当执行第二遍的时候,你会发现,A不会输出了,因为我们的s1从开始循环第二遍的0变成了-1,所以此刻if时不成立的。

    而当我们运行B的时候,B执行v(s2),最终将p增到1,A才会继续走。

    这样,我们就完成了进程之间的同步。

    本篇内容主要介绍的是pv操作的一些细节。
    有兴趣的可以加我qq:1392969921
    下一节已更新。
    【系统架构设计师】第一章:操作系统(1.2.3)死锁问题

    展开全文
  • 架构设计(2)-架构设计原则

    万次阅读 2017-10-17 14:19:01
    如何设计出一个好的架构,不像数据公式或者定律,很难一概而就...一些好的架构设计原则可以确保设计决策在一定程度上能够满足需求。 一、形成架构原则的过程 形成架构原则的过程: 架构原则要SMART ...

     

    架构设计学习思维导图: 架构设计系列主要的ADM(架构开发方法)主要基于TOGAF9或者TOGAF9.1来论述。这是个人学习实践和总结笔记,专注并不断积累和更新,努力精进自己。个人拙见,仅供参考。
    1、 架构概述:了解架构基础知识:架构定义、分类、级别、应用架构演进、架构是否合理、架构误区等。
         《谈谈架构》
    2、 原则模式:了解架构模式和设计原则。
         《架构设计原则》
          《架构模式》
    3、 瀑布模式:根据瀑布开发模式,从前期的架构愿景->到架构需求分析->架构设计
          《架构愿景分析》
          《架构需求分析》
          《如何设计一个架构》
    4、 架构三高:架构战术设计主要关注点:高可用、高性能、高效服务治理或者高并发
         《高可用架构设计》
         《高性能设计》
         《分布式服务治理》
    5、 具体知识点:架构实施知识点,框架、组件、限流、容错等知识。
         《分布式链路跟踪》
         《分布式链路跟踪:Zipkin实践》
         《分布式链路跟踪:skywalking实践》
         《我们自研log2跟踪组件》

     

    前言


    原则定义:行事所作为依据的准则、规范、标准,是指经过长期经验总结所得出的合理化的现象。

    生活中的原则

    我们在生活中,说这人原则性很强,即他做人做事严格按照自己制定的准则规范。原则性很强的人在生活和工作中遇到需要抉择的情境时,根据自己原则毫不犹豫地作出选择。而没有原则的人往往是犹豫不决,优柔寡断。

    架构的原则

         我们在《架构设计(1)-谈谈架构》的架构定义也提到架构的第一条内容:
         系统性思考的合理决策:比如技术选型、解决方案、成本评估、性价比评估等等。那如何评估决策的合理性呢?如何评估架构设计的合理性?比如老板说N+1容灾部署成本太高,架构设计不合理. 那怎么怼老板呢?

    架构原则源于业务目标

      

    架构设计不像数据公式或者定律,很难一概而就。很多时候是设计者(架构师)的各种设想,各种权衡折中而符合系统需求的智慧输出。一些好的架构设计原则可以确保设计决策在一定程度上能够满足需求。

              

     

    一、形成架构原则的过程


    架构原则不是某个架构师拍脑袋决定,可能是架构师提出最初文档,然后经过了团队成员内部反复讨论和共同认可后才得以确定和精炼的。形成架构原则的过程:

      架构原则要SMART 

    具体SMART原则有不同的解释:
    SMART原则1(S=Specific具体、M=Measurable度量、A=Attainable实现、R=Relevant相关、T=Time-bound时限)
    SMART原则2(S=Specific具体、M=Measurable度量、A=Attainable实现、R=Realistic实际、T=Testable 可验证)

     

    二、架构原则分级


    分类和分级说明原则,目的是明确原则的适用范围。

    1、从架构分类说明

    下面部分图来自《京东架构介绍》ppt。

    1)、系统级架构原则:


    2)、业务架构原则

    3)、应用架构原则

    4)、数据架构原则

    5)、代码架构原则

          应用程序开发中,一般要求尽量两做到可维护性和可复用性。我个人理解是常用的7个面向对象设计原则。这些原则并不是孤立存在的,它们相互依赖,相互补充。具体参考《设计模式原则详解》和《设计模式概论》提到相关原则。

     

    6)、技术架构原则

     

     

    2、从服务分级来说明:

    明确每个服务级别的原则要求。《架构设计(8)—高可用架构设计》服务分级治理也提到相关原则

    类别 服务 原则 描述
    一级核心服务 核心产品或者服务 冗余N+1部署、可监控、可回滚等原则 系统引擎部分:一旦出现故障,整个系统瘫痪
    二级重要服务 重要的产品功能 可监控、可回滚等原则 类比汽车轮子:该服务出现问题,该重要功能不可用。
    三级一般服务 一般功能 可以单点部署等原则 类比汽车倒车影像:该部分出现问题,稍微影响用户体验
    四级工具服务 工具类是服务 混合部署、不监控等原则 非业务功能:比如爬虫、管理后台、运维工具

    在此就可以回答老板“N+1容灾部署成本太高,架构设计不合理”的问题。核心服务必须N+1部署,保证系统的高可用。

     

    三、15条普适架构原则


    我们掌握前人总结的经验,让我们站在巨人的肩膀上高山远瞩。《架构真经》这本书简单阐述了架构设计的一些常用的原则。罗列一些常用的原则,下面是15个具有普适价值架构原则 :

    1、N+1设计 :开发的系统在发生故障时,至少有一个冗余的实例
    2、回滚设计 :确保系统可以向后兼容。
    3、禁用设计:可以关闭任何发布功能
    4、监控设计 :在设计阶段就要考虑监控,而不是在部署完成后。
    5、多活数据中心设计
    6、采用成熟的技术
    7、故障隔离 :
    8、水平扩展
    9、非核心则购买
    10、使用商品化硬件
    11、快速迭代
    12、异步设计
    13、无状态设计
    14、前瞻性设计
    15、自动化

    1、N+1设计 :开发的系统在发生故障时,至少有一个冗余的实例

       广泛地应用在从数据中心设计到应用服务的部署:

    • 在发生故障时,系统至少要有一个冗余的实例。
    • 必须确保一个为自己,一个为客户、 一个为失败


    2、回滚设计 :确保系统可以向后兼容。

    • 如果很久才能修复服务,那么就要在一定的时间范围内完成回滚。
    • 灾难性的事故,例如损坏客户数据,往往在部署后好几天才出现。
    • 系统最好按照预先的设计,通过发布或回滚解决问题。

        通过版本化方式实现回滚设计,一旦发生灾难级别的故障可以通过回滚到最近版本来恢复服务。

    3、禁用设计(功能开关、降级开关):可以关闭任何发布功能

         当设计系统,特别是与其他系统或服务通讯的高风险系统时,要确保这些系统能够通过开关来禁用。这将为修复服务提供额外的时间,同时确保系统不因为错误引起诡异需求而宕机。

     

         降级开关通过配置中心集中化管理,例如(apollo配置中心)通过推送机制把开关推送到各个应用服务。

     

    4、监控设计 :在设计阶段就要考虑监控,而不是在部署完成后。

       通过监控发现系统的可用性问题。

    •  通过监控使系统自我诊断、自我修复成为可能。
    •  通过监控确定系统可预留空间的使用情况。
    •  通过监控掌握系统之间的交互关系,发现瓶颈 

        如果监控做的好,不仅能发现服务的死活,检查日志文件,还能收集系统相关的数据,评估终端用户的响应时间。如果系统和应用在设计和构建时就考虑好监控,那么即使不能自我修复,也至少可以自我诊断。

    5、多活数据中心设计

    • 数据是否全部集中在一个数据中心?
    • 读写是否分离?
    • 是否所有的客户信息都共享同一个数据结构?
    • 服务调用是否允许延时的存在


    6、采用成熟的技术

    •  工程师倾向于学习和实施性感时髦的新技术。因为新技术可以降低成本、减少产品上市时间、提高性能。不幸的是,新技术也往往有较高的故障率。如果把新技术应用在架构的关键部分,可能会对可用性产生显著的影响。
    •  最好争取在多数人采用该技术的时候进入,先把新技术用在对可用性要求不高的功能上,一旦证明它可以可靠地处理日常的交易,再将此技术移植到关键任务领域中去。

    7、故障隔离 :

         1、避免单一业务占用全部资源。避免业务之间的相互影响  2. 机房隔离避免单点故障。
         不共享原则:理想情况是负载均衡、网络前端、应用服务器、数据库,绝不共享任何服务、硬件和软件。
         不跨区原则: 不同隔离区之间无通讯,所有服务调用必须发生在同一个故障隔离区。

    8、水平扩展

        什么是水平可扩展?平台的水平扩展是指随着业务的发展,当需要扩大平台的服务能力时,不必重构软件系统,通过增加新的设备来满足业务增长的需要。 


     X轴扩展:服务器拆分。平台的服务能力可以在不改变服务的情况下,通过添加硬件设备来完成扩容。

     Y轴扩展:数据库拆分。平台的服务能力通过不断地分解和部署服务来完成扩容。

     Z轴扩展:功能拆分。平台的服务能力可以按照客户不断分解和部署来机器 完成容量的扩展。(比如按用户uid来分表分库等)

     

    9、非核心则购买 

    工程师往往有自己研发所有系统的冲动,如果使用云服务器,建议直接使用云服务相关产品,比如日志系统,可以直接使用日志服务。

    •   系统研发要投入资源,系统维护更要长期投入。
    •   影响核心产品到市场的速度。
    •   如果可以形成差异化的竞争优势,那么自己做,否则外购。

    10、使用商品化硬件 

    •      在大多数情况下,便宜的是最好的。
    •      标准、低成本、可互换、易于商品化是商品化硬件的特征。

          如果架构设计得好,就可以通过购买最便宜的服务器轻松地实现水平扩展,前提是所有商品化硬件的总成本要低过高端硬件的总成本。

    11、快速迭代

    • 小构建:小构建的成本较低,可以确保投资可以产生价值。
    • 小发布:发布的失败率与变更数量相关,小发布失败率较低。
    • 快试错:可依市场反馈,快速迭代,加快TTM,优化用户体验。

    快速迭代需要完善的运维工具,比如从cmdb,持续集成工具,监控等等。

    12、异步设计

    同步系统中个别子系统出现故障会对整个系统带来影响。

    • 同步系统中性能最慢的子系统成为整个系统性能的瓶颈。
    •  同步系统中扩展性最差的子系统是整个系统扩展的瓶颈。 
       

    13、无状态设计

    无状态定义:是应用服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。比如单实例的mysql,zookeeper集群是有状态,而类似单纯tomcat服务是无状态的。

    无状态的系统更利于扩展,更利于做负载均衡。状态是系统的吞吐量、易用性、可用性、性能和可扩展性的大敌,要尽最大可能避免。

    14、前瞻性设计

    • Now :目前正使用系统的架构、设计、能力、性能和扩展性。
    • Now+1: 下一代预研系统的架构、设计、能力、性能和扩展性。
    • Now+2: 下一代规划系统的架构、设计、能力、性能和扩展性


    15、自动化

    设计和构建自动化的过程。如果机器可以做,就不要依赖于人. 人常犯错误,更令人沮丧的是,他们往往会以不同的方式多次犯同样的错误。

    四、应用服务拆分原则


    应用拆分首先明确拆分目的和需求,然后制定拆分原则。

    4.1、拆分的目的

    1. 人员的角度:  多人维护一个工程,从开发开发、测试、部署、上线,效率是极低的。定位问题和修复问题非常困难。
    2. 业务的角度:代码已经严重影响到业务的效率,每个业务有各自的需求,需要给自己应用部署,各自开发需求。
    3. 从架构的角度:应用已经无法满足非功能性需求:无法满足并发需求、安全性、扩展维护很麻烦。需要梳理和抽取核心应用、公共应用,作为独立的服务下沉到核心和公共能力层,逐渐形成稳定的服务中心

         总之,系统拆分是单体程序向分布式系统演变的关键一步,也是很重要的一步,拆分的好坏直接关系到未来系统的扩展性、可维护性和可伸缩性等,拆分工作不难理解,但是如何正确拆分、有什么样的方法和原则能帮助我们拆分得到一个我们理想中的系统:高可用、可扩展、可维护、可伸缩的分布式系统。

    4.2、拆分需求

    1. 组织结构变化:从最初的一个团队逐渐成长并拆分为几个团队,团队按照业务线不同进行划分,为了减少各个业务系统和代码间的关联和耦合,几个团队不再可能共同向一个代码库中提交代码,必须对原有系统进行拆分,以减少团队间的干扰。
    2. 安全需求:这里所指的安全不是系统级别的安全,而是指代码或成果的安全,尤其是对于很多具有核心算法的系统,为了代码不被泄露,需要对相关系统进行模块化拆分,隔离核心功能,保护知识产权。
    3. 替换性:有些产品为了提供差异化的服务,需要产品具有可定制功能,根据用户的选择自由组合为一个完整的系统,比如一些模块,免费用户使用的功能与收费用户使用的功能肯定是不一样的,这就需要这些模块具有替换性,判断是免费用户还是收费用户使用不同的模块组装,这也需要对系统进行模块化拆分。
    4. 交付速度:单体程序最大的问题在于系统错综复杂,牵一发而动全身,也许一个小的改动就造成很多功能没办法正常工作,极大的降低了软件的交付速度,因为每次改动都需要大量的回归测试确保每个模块都能正确工作,因为我们不清楚改动会影响到什么,所以需要做大量重复工作,增加了测试成本。这时候就需要对系统进行拆分,理清各个功能间的关系并解耦。
    5. 技术需求:
    6. 1)、 扩展困难:单体程序由于技术栈固定,尤其的是比较庞大的系统,不能很方便的进行技术升级,或者说对引入新技术或框架等处于封闭状态;每种语言都有自己的特点,单体程序没有办法享受到其它语言带来的便利;对应到团队中,团队技术相对比较单一。
    7.  2)、 减少重复造轮子:相比于基于业务的垂直拆分,基于技术的横向拆分也很重要,使用数据访问层可以很好的隐藏对数据库的直接访问、减少数据库连接数、增加数据使用效率等;横向拆分可以极大的提高各个层级模块的重用性,减少重复造轮子。
    8. 6)、业务需求:由于业务上的某些特殊要求,比如对某个功能或模块的高可用性、高性能、可伸缩性等的要求,虽然也可以将单体整体部署到分布式环境中实现高可用、高性能等,但是从系统维护的角度来考虑,每次改动都要重新部署所有节点,显然会增加很多潜在的风险和不确定定性因素,所以有时候不得不选择将那些有特殊要求的功能从系统中抽取出来,独立部署和扩展。

     

    4.3.拆分原则

    4.3.1、业务原则

    1. 单一职责:1)、满足单一职责原则对于一个微服务而言,有限定的业务边界,可以帮助我们满足服务开发和交付的敏捷性;即每一个组件或者是模块应该只有一个职责或者是功能,功能要内聚。2)、高内聚、低耦合:拆分主要的参考因素就是最小化交互,高内聚、低耦合。错误的拆分边界,可能会导致功能之间的高耦合性和复杂性。3)、最小知识原则:一个组件或者是模块不应该知道其他组件或者模块的内部实现细节。
    2. 服务粒度适中:以业务模型拆分、有适当的边界。 1)、粗粒度优行原则:由服务提供方提供粗粒度的业务服务,封装数据及数据处理逻辑,屏蔽数据及业务规则,降低耦合度,提供更多业务价值;2)、适当边界:关注微服务的功能范围,一个服务的大小应该等于满足某个特定业务能力所需要的大小;
    3. 业务分层原则: 从整体规划上把业务分层,形成单向依赖,避免微服务之间的网状依赖关系;
    4. 可重用性拆分原则:将通用部分和专用部分分解为不同的应用。1) 若粗粒度服务不能满足重用需求,则拆分粗粒度服务,以增加重用;2)非唯一依赖:至少被2个以上其它微服务依赖的功能模块,才有必要独立成一个微服务。
    5. 稳定性原则:将稳定部分和易变部分分离。将动态部分和静态部分分解为不同的元素;将机制和策略分离为不同的元素;将应用和服务分离。

     

    4.3.2、技术原则

    1. 低耦合:可独立部署
    2. 轻量级的通信机制
    3. 性能要求拆分原则:若粗粒度服务性能达不到性能需求,则适当拆分服务,以满足性能需求;
    4. 安全性拆分原则:若粗粒度服务所包含的所有处理不在同一个安全级别上,为满足安全性需求拆分服务形成细粒度服务;

     

    4.3.3 其他治理原则

    1. 演进式拆分
    2. 考虑团队人员结构
    3. 避免环形依赖和双向依赖

    对于微服务组件拆分粒度应该是尽可能的拆小,但也不应该过分追求细粒度,要考虑适中不能过大或过小。按照单一职责原则和康威定律,在业务域、团队还有技术上平衡粒度。拆分后的代码应该是易控制,易维护的,业务职责也是明确单一的。

     

    五、技术选型: 指导原则


    架构设计并没有像编程语言那样的语法约束,更多的时候是面多多种可能时的“选择”,例如:

    • 选先进的技术还是团队熟悉的技术?先进的出问题怎么办?熟悉的后续技术演化困难怎么办?
    • 用Angular还是React,一个很强大一个更灵活
    • MySQL还是MongoDB?
    • 淘宝的电商架构咳哟简单的照搬么?
    • 等等

    但存在共性原则:合适原则、简单原则、演化原则

    1、合适原则:合适优于业界领先

    优秀人才的技术情节导致各种以先进技术主导的创业失败,原因有:

    1. 将军难打无兵之仗(人数)
    2. 罗马不是一天建成的(积累)
    3. 冰山下面才是关键(业务)

    所以真正的优秀架构都是在企业当前人力、条件、业务等各种约束下设计出来的。BAT的架构师到小公司没有了大公司的资源、平台、积累和业务,只照搬大公司的做法和技术即会失败!

    我们架构设计核心目标是解决问题,提高效率。所以合适于业务场景需求的架构设计才是首要选择,而不是以追求实施性感时髦的新技术。

    2、简单原则:简单优于复杂。

    软件架构设计目的就是为了解决系统的复杂度。系统组成结构和相关之间关系越复杂,出问题的可能性就越大。扩展的难度也就越大,很有可能牵一发而动全身。

    软件领域复杂度体现两个方面:

    1)、结构的复杂性

    • 组成复杂系统的组件数量更多
    • 同时这些组件之间的关系也更加复杂
    • 组件增多整体出现鼓掌的概率增加,可用性下降
    • 某个组件改动会影响关联的所有组件
    • 定位复杂系统的问题比简单系统更加困难

    2)、逻辑的复杂性

    • 单组件承担功能过多,导致逻辑复杂度升高
    • 后续的功能修改会影响很大
    • 使用了复杂的算法难以实现修改和问题解决

    简单变复杂的事情可能人人都会,但化繁为简会很难。正所谓大道至简,如果简单和复杂的都能满足需求,最好选择简单的方案!

    3、演化原则:演化优于一步到位. 架构设计没有完美银弹. 勿过度设计.  

    业务需求是不断变化的,所以架构设计需要不断随着业务变化而变化的,这样才能去适应业务需求。软件架构同建筑架构相似,但建筑不可变,软件可变, 例如:Windows的演化、Android的发展。

    软件架构类似于大自然“设计”的一个生物,通过演化适应环境,逐步变得强大。

    1. 首先满足当前需要,解决当前最核心问题. 
    2. 预测并并发未来可能存在的问题,  不断迭代保留,不断完善, 
    3. 业务变化时,架构扩展、重构、甚至重写。

    不要贪大求全,分析清楚自身业务特点,快速落地,不断完善演化。当然如果一开始系统就有很好的基础设计, 未来可能更容易到达满意的目标.  

     

    所有问题的前提要搞清楚我们今天面临的业务量有多大,增长走势是什么样,而且解决高并发的过程,一定是一个循序渐进逐步的过程。例如在初创公司的野蛮生长阶段,业务场景和需求边界很难把握,有时候根本不需要架构师,产品需要快速迭代和变现,需求频繁更新,这个时候需要的是快速实现。这时候考虑如何做好架构设计, 如何微服务化, 可能会影响业务的发展. 

    网上的一张图很经典,总结的非常好:

     

    整个系统进化分为三个阶段:

    x轴,水平扩展阶段,通过负载均衡服务器不断的横向扩充应用服务器,水平扩展最重要的问题是需要注意不用服务器之间的如何保持session和会话同步,不能让用户在不通服务器之间切换时有感知应用扩展后自然遇到的问题就是DB的瓶颈:连接数,iops等。

    z轴,就是对数据库的拆分,难度上了一个台阶,Sharding的基本思想就要把一个数据库如何进行切分,可以分为水平切分和垂直切分,水平切分相对简单,一主多从,多主都可以,根据业务的需要,多主切分设计时需要注意主键的关系,解决多写在进行数据同步时候的冲突问题,垂直拆分更加复杂,一般都会涉及到架构逻辑的改造,需要引入中间件,来进行数据源的管理,垂直拆分时把关系紧密(比如同一模块)的表切分出来放在一个库上,或者通过hash进行拆分,从而将原有数据库切分成类似矩阵一样可以无限扩充的队列。

    y轴扩展,最后就是功能分解了,也就是我们讲的微服务切分。微服务拆分将巨型应用按照功能模块分解为一组组不同的服务,淘宝的系统当年也经历了这样的过程,通过五彩石项目从单一的war包拆分成了今天的大家看到买家,卖家中心,交易等系统。

     

    六、优秀程序设计的18大原则


    良好的编程原则与良好的设计工程原则密切相关。本文总结的这些设计原则,帮助开发者更有效率的编写代码,并帮助成为一名优秀的程序员。作者Diggins是加拿大一位有25年编程经验的资深技术人员,曾效力于Microsoft和Autodesk,并创办过两家赢利的互联网公司。

    1.避免重复原则(DRY - Don’t repeat yourself)

    编程的最基本原则是避免重复。在程序代码中总会有很多结构体,如循环、函数、类等等。一旦你重复某个语句或概念,就会很容易形成一个抽象体。

    2.抽象原则(Abstraction Principle )

    与DRY原则相关。要记住,程序代码中每一个重要的功能,只能出现在源代码的一个位置。

    3.简单原则(Keep It Simple and Stupid )

    简单是软件设计的目标,简单的代码占用时间少,漏洞少,并且易于修改。

    4.避免创建你不要的代码 Avoid Creating a YAGNI (You aren’t going to need it)

    除非你需要它,否则别创建新功能。

    5.尽可能做可运行的最简单的事(Do the simplest thing that could possibly work)

    尽可能做可运行的最简单的事。在编程中,一定要保持简单原则。作为一名程序员不断的反思“如何在工作中做到简化呢?”这将有助于在设计中保持简单的路径。

    6.别让我思考(Don’t make me think )

    这是Steve Krug一本书的标题,同时也和编程有关。所编写的代码一定要易于读易于理解,这样别人才会欣赏,也能够给你提出合理化的建议。相反,若是繁杂难解的程序,其他人总是会避而远之的。

    7.开闭原则(Open/Closed Principle)

    你所编写的软件实体(类、模块、函数等)最好是开源的,这样别人可以拓展开发。不过,对于你的代码,得限定别人不得修改。换句话说,别人可以基于你的代码进行拓展编写,但却不能修改你的代码。

    8.代码维护(Write Code for the Maintainer)

    一个优秀的代码,应当使本人或是他人在将来都能够对它继续编写或维护。代码维护时,或许本人会比较容易,但对他人却比较麻烦。因此你写的代码要尽可能保证他人能够容易维护。用书中原话说“如果一个维护者不再继续维护你的代码,很可能他就有想杀了你的冲动。”

    9.最小惊讶原则(Principle of least astonishment)

    最小惊讶原则通常是在用户界面方面引用,但同样适用于编写的代码。代码应该尽可能减少让读者惊喜。也就是说,你编写的代码只需按照项目的要求来编写。其他华丽的功能就不必了,以免弄巧成拙。

    10.单一责任原则(Single Responsibility Principle)

    某个代码的功能,应该保证只有单一的明确的执行任务。

    11.低耦合原则(Minimize Coupling)

    代码的任何一个部分应该减少对其他区域代码的依赖关系。尽量不要使用共享参数。低耦合往往是完美结构系统和优秀设计的标志。

    12.最大限度凝聚原则(Maximize Cohesion)

    相似的功能代码应尽量放在一个部分。

    13.隐藏实现细节(Hide Implementation Details)

    隐藏实现细节原则,当其他功能部分发生变化时,能够尽可能降低对其他组件的影响。

    14.迪米特法则又叫作最少知识原则(Law of Demeter)

    该代码只和与其有直接关系的部分连接。(比如:该部分继承的类,包含的对象,参数传递的对象等)。

    15.避免过早优化(Avoid Premature Optimization)

    除非你的代码运行的比你想像中的要慢,否则别去优化。假如你真的想优化,就必须先想好如何用数据证明,它的速度变快了。

    “过早的优化是一切罪恶的根源”——Donald Knuth

    16.代码重用原则(Code Reuse is Good)

    重用代码能提高代码的可读性,缩短开发时间。

    17.关注点分离(Separation of Concerns)

    不同领域的功能,应该由不同的代码和最小重迭的模块组成。

    18.拥抱改变(Embrace Change)

    这是Kent Beck一本书的标题,同时也被认为是极限编程和敏捷方法的宗旨。

    许多其他原则都是基于这个概念的,即你应该积极面对变化。事实上,一些较老的编程原则如最小化耦合原则都是为了使代码能够容易变化。无论你是否是个极限编程者,基于这个原则去编写代码会让你的工作变得更有意义。
     

     

    七、架构设计非侵入性原则


           架构的侵入性:所谓侵入性就是指的这个架构设计出来的部件对系统的影响范围,比如框架的侵入性就很高,因为在一个工程中引入一个框架,你的整个设计都必须围绕这个框架来进行,一旦使用了,框架的可替代性几乎为0,这样子就是搞侵入性。组件的侵入性就比较低,比如ibaties,他可以在任何java框架下使用,甚至可以和其他ORM组件共存,你仅仅需要引入,配置,然后就可以使用了,你也可以用其他的ORM替换他,所以......这个体验应该是很愉快的。
          所以话说回来说到如果我们在设计一个通用架构的时候就应该注意到这个一个非常重要的地方,除非我们只是自己拿来用用,否则我们不应该假设我们的设计的用户已经具备怎么怎么样的环境或者是需要做什么特殊的设计才能够使用。
            这里打个比方,假如说我们在设计一个通用权限管理什么什么的时候我们就要想好,这是一个组件,还是框架,还是一个现成系统(复用通过改改代码实现,其实个人觉得这种设计很低级,虽然有的这样子的东西功能确实丰富)。确定了目标之后我们才好开始下一步,比如确定是一个框架的话可能发挥要自由一些,因为不需要高度的内聚,不过可能因为框架要设计的方方面面太多了,所以老是觉得个人的力量不足以搞这种东西出来。如果是组件的话就需要高度的内聚来实现非侵入式,比如引入DLL的时候还需要让所有页面继承自某个基类页就不算是一个good idear。
           虽然话说得好听,不过我在自己做设计的时候还是常常因为功力不够造成一些侵入的现象,但是高内聚低耦合都是我们不断追求的目标,所以所有做设计的同学们一起努力吧

    参考总结《大型网站技术架构》《架构真经》

    展开全文
  • 【系统架构设计师】第一章:操作系统(1.2.3)死锁问题 这一节其实想水一章来着。。。 因为书上的东西实在是太少,管程就提到了一点,我也不好写太多。 不过细想一下,还是决定写点吧。 1.2.3 管程 书上给的东西太...

    上节链接
    【系统架构设计师】第一章:操作系统(1.2.3)死锁问题
    这一节其实想水一章来着。。。
    因为书上的东西实在是太少,管程就提到了一点,我也不好写太多。
    不过细想一下,还是决定写点吧。

    1.2.3 管程

    书上给的东西太少,而且写的很难懂,所以这里我就先不引用书上的东西了,直接写一些自己的理解了。
    本文参考链接:
    https://blog.csdn.net/zy702432103/article/details/84259683
    https://blog.csdn.net/qq_32534441/article/details/95231632
    https://www.zhihu.com/question/30641734
    http://c.biancheng.net/view/1234.html

    概念引入

    管程也是用于进程之中的,和信号量以及pv操作起到类似的作用。然而,我们之前提到过,pv操作需要成对出现,因为进程使用完资源以后需要告诉系统。
    这种操作其实是不安全的,因为一旦我们的pv操作没有成对出现,系统就会出现问题。因此,为了解决这些问题,就产生了管程的概念。
    在这里插入图片描述
    我们可以很形象的将使用管程的进程这样想:

    • 当一个进程使用管程的时候,那么,它会将一些用到的变量和操作进行封装,像管道一样。这样,我们就可以保证,整个操作是完整的,不会像pv操作中忘记p或v就会使系统产生问题。
    • 由于使用管程的进程是被封装的,所以其他进程不能进行使用,必须等待管程使用完毕才能进行使用。

    细节的一些东西

    我们使用管程是为了更安全,而不是彻底的封闭,因此,在一些编程语言中提供了几个方法来控制管程中进程的状态。这个我就直接截图了,书上是没有详细讲这个的。
    在这里插入图片描述
    这几个方法实现了我们之前使用pv操作中挂起,同步等。由于管程的特殊性,所以引入了enter,leave等操作。
    剩下的就没什么好介绍的了,本来书上说的也不深,就当我水了一贴。

    操作系统五大功能之一的处理器管理的内容已经写完了。后面会继续写其他4个。
    下章链接
    【系统架构设计师】第一章:操作系统(1.2.4)文件管理
    有兴趣加我QQ:1392969921

    展开全文
  • 架构设计(1)-谈谈架构

    万次阅读 多人点赞 2017-10-17 11:18:15
    1、什么是架构架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。 此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这...
  • 【系统架构设计师】第一章:操作系统(1.1.1—1.1.2) 参考教材: 《系统架构设计师考试全程指导(第二版)》 《系统架构设计师教程》 1.2 处理器管理 在单用户多任务的操作系统中,或者多用户多任务的操作系统中,...
  • 为什么要报考系统架构设计师考试

    万次阅读 多人点赞 2019-08-02 17:03:09
    一、强迫自己,去系统学习软件架构设计的理论,追踪业界架构设计的发展动态。去学习的动力有很多,如为了兴趣,为了工作,为了职位升迁,为了大幅提升薪水等。其实,为了应付考试,通过考试,也是学习知识的一种很好...
  • 微信技术总监分享架构设计高清完整PDF版

    万次下载 热门讨论 2012-05-15 09:17:26
    在技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小时的演讲中揭开了微信背后的秘密。
  • 架构设计(7)—如何设计一个架构

    万次阅读 2018-09-29 17:05:51
    那接下来就是如何着手开始做架构设计。 一、如何开始设计一个架构:方式方法 架构不是像平常写代码一样,对就是对,错就是错,它并无对错之分,是一个取舍的过程。当我们从0开始做架构的时候,的确是比较困难。...
  • 对软件架构设计的一些总结和理解

    万次阅读 多人点赞 2015-09-06 22:28:18
    1. 软件架构设计的What & Why ● 啥是软件架构(Software Architecture)? 软件架构是指在一定的设计原则基础上,从不同角度对组成系统的各部分进行搭配和安排,形成系统的多个结构而组成架构,它包括该系统...
  • 架构设计之CS架构

    千次阅读 2019-04-23 20:57:05
    架构设计之CS架构
  • 课程主体部分从软件架构体系结构、架构设计、技术体系等角度出发,详细介绍了架构师区别于一般开发人员所需要掌握的架构设计方法论与相关实践,包括架构风格与模式、领域驱动设计、类与框架设计、分布式系统架构设计...
  • 高性能微服务架构设计模式

    千人学习 2019-12-26 17:34:19
    本课程是对分布式微服务架构设计模式进行讲解,以亿级QPS的电商网站为例对常见的技术架构进行分析,从高性能,高可用的角度比较各种方案的优劣点,重点讲解使用CQRS模式怎么进行高性能的微服务架构设计,读者学习本...
  • 架构设计——架构知识体系

    万次阅读 多人点赞 2018-08-23 13:45:58
    架构设计——架构知识体系   1、什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。 此君说的架构和彼君理解的架构未必是一回事。 我们主要针对互联网服server系统...
  • 软件架构设计---架构设计

    千次阅读 2018-09-17 21:46:29
    实现软件质量属性的战术,这些战术可以看做设计的... 通过架构模式,架构设计师可以借鉴和复用他人的经验,看看类似的问题别人是如何解决的。但不要把模式看成是一个硬性的解决方法,它只是一种解决问题的思路。...
  • 移动端游戏架构设计

    万人学习 2015-10-10 09:20:33
    目前很多开发者对于游戏架构设计一无所知,只是简单的把脚本与对象进行挂接,导致在后期开发中,版本维护,功能扩展非常不方便,现在网上出现了各种版本的热更新实现,比如Lua,JS,C#Light等, 该框架设计技术...
  • 微服务架构设计模式与CAP定理

    万次阅读 热门讨论 2020-09-22 23:01:09
    微服务架构设计模式与CAP定理 前言        hello 大家好,我是一名Java后端开发的程序猿。由于国庆假期已经来了,所以我打算把这一星期的时间用来好好提升下自己的技术水平。...
  • 架构设计思维原则

    千次阅读 2021-03-30 10:02:31
    如果你有主动做架构设计,那肯定需要遵循一定的原则去探索和发现架构。 如果你没有做架构设计,但根据行业通用标准或者经验,用一套代码(开源或内部模板)来开发。其实这里面就会有架构设计,只是你没有意识到。 ...
  • 架构设计(8)—高可用架构设计

    千次阅读 2019-01-14 17:58:37
    高可用架构设计总结: 前言:海恩法则和墨菲定律 海恩法则 · 事故的发生是量的积累的结果。 · 再好的技术、再完美的规章 , 在实际操作层面也无法取代人自身的素质和责任心 。 墨菲定律 · 任何事情都没有...
  • 架构设计思维模式

    千次阅读 2021-03-31 09:27:26
    有了《架构设计思维原则》,做架构设计就会有方向和准则,不至于跑偏和做得很糟糕,但是毕竟还是过于理论了。因此,我们需要搭通是理论和实践的桥梁——架构设计思维模式。 架构设计思维模式分为四种:理解、探索、...
  • 微服务架构设计实践 目 次1 序言2 微服务3 软件架构设计思想4 微服务架构设计实践4.1 项目概述4.2 架构准备阶段4.3 概念架构阶段4.4 细化架构阶段4.4.1 业务架构4.4.2 数据架构4.4.3 应用架构4.4.4 技术架构4.4.5 ...
  • 架构设计之如何写架构设计说明书

    千次阅读 2015-06-04 13:55:09
    架构设计是需求分析到软件实现的桥梁,...作为一个架构师,我想尝试一下根据这三个过程对不同能力需要,写一次系列文章,包括《架构设计三部曲之如何写架构设计说明书》、《架构设计三部曲之如何评审架构设计说明书》以
  • 模块化架构设计

    千次阅读 2020-09-02 18:10:39
    架构设计是一个不断演变的过程,当项目较小,或者项目刚刚起步的阶段,我们往往不需要关注架构设计,只有当软件膨胀到一定程度,我们才会针对当前业务,设计出适合当前阶段的架构。所以有的项目就会出现不断膨胀,...
  • 开源大数据技术架构设计

    万人学习 2015-09-23 11:19:44
    主讲: 钱广锐(IBM研究员/技术讲师/教授) 苏再卿(IBM开发组长/工程师/技术讲师) 【课程主题】 开源大数据技术架构设计
  • 架构设计(6)-架构需求分析

    万次阅读 2018-07-06 15:17:57
    架构设计需求分析: 主要目的是明确架构要解决当前什么问题, 先调研需求方的诉求。 如果公司的架构部自high,做一些根本没有人使用的框架,组件,系统: 以“晋升”为目的的架构设计都应该拉出去祭天。 脱离业务的...
  • 物联网平台架构设计

    万次阅读 多人点赞 2017-09-11 14:13:28
    用户如何管理,数据包如何解析,大数据如何展示等也是物联网模块中非常重要的部分,所以作者就根据自身工作中总结出来的建构在云端的物联网平台基本架构分享给大家,并基于此架构如何一步一步来开发
  • 软件架构设计---软件架构概述

    万次阅读 2018-09-17 21:25:54
    通俗地讲,软件架构设计就是软件系统的“布局谋篇”。  人们在软件工程实践中,逐步认识到了软件架构的重要性,从而开辟了一个崭新的研究领域。软件架构的研究内容主要涉及软件架构描述、软件架构设计、软件架构...
  • 架构设计方法

    千次阅读 2018-06-02 10:13:08
    1 基本概念和目的架构设计的目的是为了解决系统复杂度带来的问题,并不是要面面俱到,不需要每个架构都具备高性能、高可用、高扩展等特点,而是要识别出实际业务实际情况的复杂点,然后有有针对性地解决问题,即:...
  • 架构实战:架构设计文档模板

    千次阅读 2019-06-11 11:24:14
    在前面的专栏里,有同学留言说想看看具体的架构设计文档。由于信息安全的原因,再加上稍微复杂的系统,设计文档都是几十页,因此专栏无法直接给出详细的文档案例。但我认为提供一个架构设计文档模板还是很有必要的,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 156,511
精华内容 62,604
关键字:

架构设计