精华内容
下载资源
问答
  • 更多信息,请参考:https://www.huaweicloud.com/product/cse.html分类:研发 > 技术管理推荐精华 分享 (4)收藏 赞 (1)分享你的观点添加表情发表评论刘云华00303542...
    展开全文
  • 文章目录《微服务架构实战》读书笔记二----微服务设计原则设计原则之分层架构设计原则之统一通信原则设计原则之单一职责设计原则之服务拆分设计原则之前后端分离设计原则之版本控制设计原则之围绕业务构建设计原则之...

    《微服务架构实战》读书笔记二----微服务设计原则

    设计原则之分层架构

    同一公司使用统一的分层,以减少学习开发维护成本,类似MVC MVP MVVM这种分层模式,但是在微服务中不比严格遵守这种规定,切记死板硬套,最重要是理解业务,在不同的业务场合,架构可以适当调整

    • 文件分层法

      应用分层采用文件夹方式的优点是可大可小的,简单易用,统一规范,可以包括5个项目,也可以包括50个项目,以满足所有业务的不同场景

    • 调用规约

      开发中遵守分层架构的约束,禁止跨层调用

    • 下层为上层服务

      以用户为中心,以目标为导向,上层(service)需要啥,下层(dao)就提供啥

    • 实体层规约

      entity是数据表对象,不是数据访问对象,DTO是网络传输对象,不是表现层对象,BO是内存计算逻辑对象,不是业务逻辑层对象,不是只能给业务逻辑层使用,如果仅仅限定在本层访问,则导致单个应用内大量没有价值的对象转换,以用户为中心设计实体类,可以减少无价值重复对象和无用转换

    • U型访问

      下行时候表现层是input,业务逻辑层是process,数据访问层是output

      上行时候数据访问层是input,业务逻辑层是process,表现层是output

    设计原则之统一通信原则

    通信协议一般采用Rest,WebService,或者RPC

    当然不仅仅是解决远程调用就行,还得解决负载均衡,缓存等等功能,最简单的实现是Rest接口,因为其可以使用现存的各种服务器。实现负载均衡和缓存功能

    服务间通信通过轻量级Web服务,使用同步Rest API进行通信,在实际的项目中,存在一般推荐在查询使用同步机制,增删改使用异步,结合消息队列实现数据操作,以保证最终的数据一致性

    使用Rest API 应该注重是否等幂操作

    设计原则之单一职责

    这个很简单,单个服务的职责必须单一,如果职责不单一则不利于扩展和复用,这样维护成本也低

    单一职责的优点

    • 类复杂性降低,实现什么职责都有清晰明确的定义
    • 可读性提高,复杂性降低
    • 可维护性提高,可读性提高

    实施单一职责的目的在于

    • 以类来隔离需求功能点,一个点需求改变,不会影响其他
    • 一个业务设计到底多小,应该由专家共同参与讨论
    • 粒度小,灵活,复用性强,方便更高级别抽象

    每个微服务单独运行,能够实现松耦合,独立部署

    设计原则之服务拆分

    服务拆分不应该过于追求细粒度,要考虑适中,不能过大或过小,在业务域,团队,技术水平上追求平衡

    拆分可以分为三个方向

    x:水平复制,类似把整个系统负责一遍,做个集群,就是单机架构做集群后,再负载均衡这种

    y:功能分解,不同职能的模块分开成不同服务,例如,订单服务,商品服务等等

    z:对数据库扩展,即分库分表

    举个例子;

    拆分应用

    x:从单体系统或服务,水平克隆出许多系统,通过负载均衡平均分配请求

    y:面向服务分割,例如,电商网站,登录,搜索,下单等等服务进行y轴拆分

    z:面向查找分割,将不同产品的SKU分到不同服务

    要做好微服务的分层,梳理核心应用,公共业务,作为独立的服务下沉到核心和公共能力层,逐渐形成稳定的服务中心。

    对于服务拆分,使用迭代的方法,不能一次性完成所有微服务拆分

    设计原则之前后端分离

    前后端分离是一种架构模式,并不只是开发模式,在开发阶段,前后端约定好数据交互接口,实现并行开发和测试,在运行阶段前后端分离模式需要对web应用进行分离部署,前后端采用http或者其他协议交互请求

    前后端使用json数据交互,两个开发团队使用api作为契约进行交互。

    核心在于,后台提供数据,前端负责显示,实现定义好交互的数据类型格式,通过json传输数据

    设计原则之版本控制

    在团队的内部,尤其是API优先设计的微服务中,接口的版本管理显得尤其重要,微服务的一个主要优势是允许服务独立演变,考虑微服务会调用其他服务,这种独立性要引起高度注意,不能在API中破坏性更改

    版本控制的方法

    • 将版本放入url中
    • 使用自定义请求标头
    • 将版本放在HTTP Accept标头中,并依靠内容协商

    设计原则之围绕业务构建

    各个系统之间合理使用消息队列,解决系统或模块之间的异步通信,每个子系统之间的技术栈选择,不用那么死板,应该针对业务选择合适的技术栈

    设计原则之并发流量控制

    大流量的指标一般是TPS(每秒事务量),QPS(每秒请求数),其实这没一个绝对标准,一般根据机器的配置情况而定,如果当前配置不能应对请求量,那么就是大流量

    应对方案

    • 缓存
    • 降级,如果不是核心链路,就把这个业务降级,保证主干畅通
    • 限流,一定时间范围内,只能允许一批流量进入
    展开全文
  • 毫无疑问,微服务架构的设计原则和核心话题是本文要讨论的重点,也是打算从零基础开始构建微服务架构需要事先考虑、规划的。一个好的产品、应用能否稳定运行,持续开发,满足业务需求,能否经得起现实的考验,就...

     

    前期回顾:

    微服务架构下的核心话题 (一):微服务架构下各类项目的顺势崛起

    一、前言

         毫无疑问,微服务架构的设计原则和核心话题是本文要讨论的重点,也是打算从零基础开始构建微服务架构需要事先考虑、规划的。一个好的产品、应用能否稳定运行,持续开发,满足业务需求,能否经得起现实的考验,就需要在设计阶段考虑很多、很多,以确保它的健壮性。

        当我们从单体架构的应用走向基于微服务的架构时,首先会面临一个很棘手的问题是如何进行服务的拆分,服务的拆分粒度应该如何衡量,怎样拆分的服务才算是“微”。接着将又会面临,这么多的服务又如何关联起来呢?如何有效的相互间通信呢?如何高效的部署呢……

         本文我将从微服务架构的设计原则、核心话题两大方面展开讨论,希望能够对你构建一个微服务架构的应用有所帮助。

     

    二、微服务架构的设计原则

          软件架构的设计原则、方法论,在很大程度上能够指导、提醒我们应该遵循什么的原则、规范,能让软件架构更加健壮、稳固,并易于开发、扩展、维护等。

    1.拆分足够微

         在解决复杂的问题时,我们倾向于将问题划分成若干个小问题来解决,所谓“大事化小,小事化了”。单体架构的应用,随着时间的推移,会变得越来越臃肿,越来越难以维护,适当的做“减法”,可以解决单体架构存在的这些问题。

         将单体架构的应用拆分为微服务架构的应用时,服务的拆分粒度问题,成为了重中考虑的问题。粒度太大,拆分的不够充分,便和单体架构没有太大的区别,更不能发挥出微服务的优势。如果拆分的太细,又将会面临着服务数量太多而引发的服务管理、服务间调用的问题。对于如何“微”才算是足够的“微”,是没有标准的衡量计算方法的。

        微服务不是说越小越好。服务越小,微服务架构的优点和缺点也就会越来越明显。服务越小,微服务的独立性就越高,但同时微服务的数量也会增加,管理就会存在很大的问题,成为一个新的挑战,这也就是常常所被提到的“这么多的服务,该服务管理啊?”问题。

        服务的拆分足够微,可以按照某种方式、规则拆分,通常可以按照业务模块、业务场景等进行拆分,尽量避免服务间的相互依赖,做到高内聚低耦合。紧密关联的处理,放在一个服务内,但避免在服务与服务之间共享数据。

    2.轻量级通信

          在单体架构的应用中,可直接通过简单的方法调用就能进行通信,但在微服务架构中,由于服务都是跨域进程,甚至是跨主机的,组件只能通过REST、Web服务或RPC类似的机制在网络上进行通信。

          因为服务划分的已经足够小了,服务间的通信可能会比较频繁,考虑到性能、响应时间等方面,则服务间通信应采用轻量级的通信协议,如:同步的REST,异步的AMQP、STOMP、MQTT等。在实时性要求不高的场景下,采用REST通信是不错的选择,REST是基于HTTP协议,可方便进行跨域访问或跨防火墙的设置,并且消息格式可以统一为XML或JSON格式,方便开发人员阅读和理解。如果服务间通信比较频繁,有比较高的要求,可采用消息通信的方式,如:Kafka、MQ等类似的消息中间件。如果不考虑对外提供访问的话,可采用gRPC的通信方式,因为gRPC是基于Netty的,通信效率更高。

    3.单一职责原则

         当服务粒度过粗时,服务内部很容易产生耦合。如果多人开发同一个服务,很容易因为耦合过大造成代码修改重合,不利于后期维护。确保每个服务职责单一,这也是用来确定服务拆分边界的一个原则,遵循“高内聚、低耦合”。

        必须要对自己的产品和业务的了解,才能更准确的确定服务边界,让各个服务满足单一的业务职责,避免职责交叉。

    4.领域驱动原则

         领域驱动设计(Domain Driven Design),是一套综合软件系统分析和设计的面向对象建模方法。一个微服务,就应该能够反映出某个业务的领域模型,使用领域驱动设计,不但可以降低微服务环境中通用语言的复杂度,而且可以帮助团队搞清楚领域的边界,理清上下文边界。

        建议将每个微服务都设计成一个DDD限界上下文,为微服务提供了一个逻辑边界。每个独立的团队负责一个逻辑上定义好的系统切片,负责与一个领域或业务功能相关的全部开发,最终团队开发出的代码更加易于理解和维护。

    (关于DDD更详细的了解,可参考https://www.cnblogs.com/edisonchou/p/edc_ddd_foundation_study_part1.html)

     

    三、微服务架构的核心话题

          基于微服务架构的应用,将面临着许多选择、争议等讨论的核心话题,这些核心话题将会在你接下来的微服务架构生涯里不断出现,并成为讨论的焦点。在此,我觉得有必要进行汇总整理,让你觉得它存在的必要性,能为你之所用。

    1.服务拆分

           服务拆分首先关注的就是服务的颗粒度,可遵循设计原则——拆分足够微,通过DDD(领域驱动设计)的指导,将某个领域的功能进行聚合成为一个服务。

           对于一个大型复杂的单体应用而言,选择先拆分哪个模块,是一个问题。一般考虑先从容易、简单被拆分的模块开始,在拆分简单模块过程中,不断积累微服务的经验,逐步拆分掉复杂、繁重业务的核心模块。同时,寻找那些和其他功能业务重合度低、耦合度低,且自身变化较为缓慢的基础服务,将它们拆分为微服务。

          决定了拆分哪些模块,要拆分成多个微服务后,接下来就要划清服务拆分的边界,将服务边界和接口顺理清楚。确定哪些应该包含进来,哪些不应该包含进来,哪些接口需要重新设计,哪些可以重复利用。

          如下图所示,展示了一个单体应用拆分为多个微服务的过程。一旦拆分完后,各个服务就可以独立开发、部署和扩展。

         服务的拆分,不单单指功能的拆分,如上图所示,还得考虑数据库的拆分 ,确保降低功能逻辑层、数据访问层的耦合度。

    2.服务注册与发现

          微服务架构的特点是服务的数量众多,这些众多的服务需要一个统一的服务注册平台来进行服务的管理。每个微服务实例在启动后,将自己的实例信息注册到服务注册表或服务注册中心。服务的调用方若想获取可用服务实例的列表,则需要从服务注册表中去获取相关的信息。

          当服务实例失效或down掉以后,服务实例的信息就要从服务注册表中移除,即:服务注销。服务注册表是用于维护所有可用的服务实例的地方,服务注册表一方面要接收微服务实例的接入,另一方面当服务实例不可用时,需要及时将服务实例从注册表中清楚。下图展示了服务注册与服务实例的关系。

           服务注册与发现组件或框架,有很多,如:Eureka、Consul、etcd等,都提供了服务注册表的功能,可供大家进行选择。

    3.负载均衡

           在微服务架构中,负载均衡是必须使用的技术,通过它来实现系统的高可用、集群扩容等功能。负载均衡通常分为两种:服务端负载均衡和客户端负载均衡。通常所说的负载均衡均指服务器端的负载均衡,可通过软件或硬件设备来实现,软件如:Nginx、LVS等,硬件如:F5、A10等,硬件负载均衡设备成本较高,大部分采用的是软件方式。架构图如下:

           通过软件或硬件实现负载均衡都会维护一个服务端清单,利用心跳检测等手段进行清单维护,保证清单中都是可以正常访问的服务节点。当用户发送请求时,会先到达负载均衡器(一般作为一个服务),负载均衡器根据负载均衡算法(轮训、随机、加权轮训)从可用的服务端列表中取出一台服务端的地址,接着进行转发,降低系统的压力。

    4.API网关

           考虑到微服务架构中服务的数量很多,为了便于服务对外统一的管理,API网关的引入是必不可少的。API网关旨在提供统一的API入口点,来管理多个服务内部API,可方便实现对平台众多服务接口进行管控,如对访问服务的身份认证、业务鉴权、流量并发控制、API调用的计量或计费等。

          API网关常用于以下场景:

    • 黑白名单:实现例如通过IP地址来禁止访问某些服务的某些功能。
    • 日志:实现日志访问的记录,用于分析访问、处理性能指标,并将分析结果提供给其他模块使用,如:运维平台的统计功能。
    • 协议适配:实现通信协议校验、适配转换的功能。
    • 身份认证:负责外部系统的访问身份认证。
    • 计流限流:实现微服务访问流量计算,基于流量计算分析进行限流等。
    • 路由:API网关的核心功能,实现请求的转发。

         API网关的引入为微服务架构应用带来诸多的好处,如下:

    • 避免将内部信息/接口泄露给外部: 能够将对外发布的API与微服务内部的API区分开来,使得各个微服务在添加或变更时,能有明确的安全边界,避免多过的对外暴露。
    • 为微服务添加额外的安全层:能够提供一套额外的保护层,用以应对SQL注入、Dos攻击等,其中系统的权限控制可以再这一层来实施。
    • 支持多种混合通信协议:考虑到微服务架构中,各个微服务的平台与语言的多样性,通常将对外提供基于HTTP或REST的API接口,而内部微服务将根据自身服务情况采用不同的通信协议(如:ProtoBuf、RPC等)。API网关则跨域这些内部不同协议的微服务,提供一个基于REST的统一外部API。
    • 减低构建微服务的复杂性:基于微服务架构应用的复杂性,如API令牌、访问控制、限速限流等,每一项功能的添加,对会额外对各个服务带来影响,从而影响微服务的开发周期。这些功能如果在API网关上统一处理,则会从代码层面进行了有效的隔离,使得不会影响其他微服务,这样更有利于其他微服务只需关注于实际的业务开发。

        常见的API网关实现方式很多,如:Nginx、Kong、Spring Cloud Zuul、Træfɪk等。

    5.服务部署与发布

         单体应用被拆分为微服务后,随着微服务的数量增多,部署就成了问题,使得部署的复杂性提高了不少。所以,微服务的部署更加倾向于使用具有相互之间隔离的主机/虚拟机来实现服务的部署,使得服务能够独立的部署、测试、发布、升级。

        目前比较好的服务部署方式就是把各个微服务打包成Docker镜像,这样就保障避免了不同主机环境对部署产生的影响。使用Docker部署,并结合Jenkins进行CI/CD,使得构建、发布、启动变得更加快捷。

        下图就是服务部署、发布流程。

     

    四、总结

           一个微服务架构的应用,从最初的设计到逐步成型,是需要经过不断的迭代开发、摸索来完善的,上述只是列举出了我个人认为需要重点关注的点,以供大家参考,如有遗漏不足,望大家建议补充、完善。

     

    欢迎微信扫码下面二维码,关注微信公众号【程序猿技术大咖】,进行更多交流学习!

    展开全文
  • 微服务架构设计原则

    2018-07-11 11:34:10
    详细介绍了微服务的设计原则。出自华为。 内容不错
  • 分布式系统实战:什么是微服务架构微服务架构与SOA架构区别 微服务架构自2014年业界提出“微服务(Microservices)”的概念以来,微服务架构就不断演进,并且日趋火爆。越来越多的企业拥抱微服务,期望通过微服务...

    分布式系统实战:什么是微服务架构?微服务架构与SOA架构区别

    微服务架构

    自2014年业界提出“微服务(Microservices)”的概念以来,微服务架构就不断演进,并且日趋火爆。越来越多的企业拥抱微服务,期望通过微服务的架构来解决大型项目的管理与运维。

    那么什么是微服务?微服务架构与传统的SOA架构有什么区别?何时应该采用微服务架构?如何构建微服务?本章就针对上述提到的问题,来简单介绍下微服务架构。

    什么是微服务架构

    微服务架构(Microservices Architecture,MSA)的出现并非偶然,而是与这个时代的软件思想、技术工具的发展有着密切的联系。比如,将业务功能服务化,是SOA的延续;RESTful等架构的兴起,让我们可以考虑更多轻量化的通信机制;领域驱动设计指导我们如何分析并模型化复杂的业务;敏捷方法论帮助我们拥抱变化,快速反应;持续集成和持续交付(CI/CD)促使我们构建更快、更可靠、更频繁的软件部署和交付能力;虚拟化和容器技术的发展,使我们简化了部署环境的创建、安装;DevOps文化的流行以及全栈自治团队的出现,使得小团队更加全功能化。这些都是推动微服务架构诞生和发展的重要因素。

    实际上,业界对于微服务本身并没有一个严格的定义。James Lewis和Martin Fowler对微服务架构做了如下定义。

    简言之,微服务架构风格就像是把小的服务开发成单一应用的形式,运行在其自己的进程中,并采用轻量级的机制进行通信(一般是HTTP资源API)。这些服务都是围绕业务能力来构建的,通过全自动部署工具来实现独立部署。这些服务可以使用不同的编程语言和不同的数据存储技术,并保持最小化集中管理。

    MSA包含以下特征。

    ·组件以服务形式来提供。正如其名,微服务也是面向服务的。

    ·围绕业务功能进行组织。微服务更倾向围绕业务功能对服务结构进行划分、拆解。这样的服务,是针对业务领域有着相关完整实现的软件,它包含使用接口、持久存储以及对应的交互。因此团队应该是跨职能的,包含完整的开发技术——用户体验、数据库以及项目管理。

    ·产品不是项目。传统的开发模式致力于提供一些被认为是完整的软件。一旦开发完成,软件将移交给维护或者实施部门,然后开发组就可以解散了。而微服务要求开发团队对软件产品的整个生命周期负责。

    这要求开发者每天都关注软件产品的运行情况,并与用户联系更紧密,同时承担一些售后支持。越小的服务粒度越容易促进用户与服务提供商之间的关系。

    ·强化终端及弱化通道。微服务的应用致力于松耦合和高内聚,它们更喜欢简单的REST风格,而不是复杂的协议(如WS或者BPEL或者集中式框架),或者采用轻量级消息总线(如RabbitMQ或ZeroMQ等)来发布消息。

    ·分散治理。这是与传统的集中式管理有很大区别的地方。微服务把整体式框架中的组件拆分成不同的服务,在构建它们时将会有更多的选择。

    ·分散数据管理。当整体式的应用使用单一逻辑数据库对数据持久化时,企业通常选择在应用的范围内使用一个数据库。微服务让每个服务管理自己的数据库:无论是相同数据库的不同实例,或者是不同的数据库系统。

    ·基础设施自动化。云计算,特别是AWS的发展,降低了构建、发布、运维微服务的复杂性。微服务的团队更加依赖于基础设施的自动化,毕竟发布工作相当无趣。近些年开始火爆的容器技术,诸如Docker也是一个不错的选择(有关容器技术以及Docker的内容在后面章节会涉及)。

    ·容错性设计。任何服务都可能因为供应商的不可靠而出现故障。

    微服务应为每个应用的服务及数据中心提供日常的故障检测和恢复。

    ·改进设计。由于设计会不断更改,微服务所提供的服务应该能够替换或者报废,而不是要长久地发展。

    微服务架构与SOA架构的区别

    微服务架构(MSA)与面向服务架构(SOA)有相似之处,比如,都是面向服务的,通信大多基于HTTP。通常传统的SOA意味着大而全的单体架构(Monolithic Architecture)的解决方案。单体架构有时也被称为“单块架构”,这种架构风格会让设计、开发、测试、发布的难度都增加,其中任何细小的代码变更,都将导致整个系统需要重新测试、部署。而微服务架构恰恰把所有服务都打散,设置合理的颗粒度,各个服务间保持低耦合,每个服务都在其完整的生命周期中存活,将互相之间的影响降到最低。SOA需要对整个系统进行规范,而MSA的每个服务都可以有自己的开发语言、开发方式,灵活性大大提升。

    单体架构的例子

    我们假设在构建一个电子商务应用,应用从客户处接收订单,验证库存和可用额度,并派送订单。应用包含多个组件,包括UI组件(用来实现用户接口),以及一些后台服务(用于检测信用额度、维护库存和派送订单)。

    应用作为一体应用部署。例如,一个Java Web应用运行在Tomcat之类Web容器上,仅包含单个WAR文件;一个Rails应用使用PhusionPassenger部署在Apache/Nginx上,或者使用JRuby部署在Tomcat上,它都仅包含单个目录结构。为了伸缩和提升可用性,我们可以在一个负载均衡器下面运行该应用的多份实例。

    单体架构的开发、部署和伸缩如图9-1所示。

    这个方案有以下一些好处。

    ·易于开发。当前开发工具和IDE的目标就是支持这种一体应用的开发。·易于部署。只需要将WAR文件或目录结构放到合适的运行环境下。

    ·易于伸缩。只需要在负载均衡器下面运行应用的多份副本就可以伸缩。

    但是,一旦应用变大、团队增长,这个方案的缺点就更加明显,缺点如下。

    ·代码库庞大。巨大的一体代码库可能会吓到开发者,尤其是团队的新人。代码库庞大带来的问题:第一,应用难以理解和修改,开发速度通常会减缓;第二,由于没有模块硬边界,模块化会随着时间的增加而被破坏;第三,代码的变更会比较困难,代码质量会随着时间的增加而逐渐下降。这是个恶性循环。

    分布式系统实战:什么是微服务架构?微服务架构与SOA架构的区别

    图9-1 单体架构的开发、部署和伸缩

    ·IDE超载。代码库越大,IDE运行越慢,开发效率越低。

    ·Web容器超载。应用越大,容器启动时间越长。因此开发者大量的时间被浪费在等待容器启动上。这也会影响部署。

    ·难以持续部署。对于频繁部署,巨大的单体架构应用也是个问题。为了更新一个组件,你必须重新部署整个应用。这还会中断后台任务(如Java应用的Quartz作业),不管变更是否影响这些任务,这都有可能引发问题。未被更新的组件也可能因此不能正常启动。因此,鉴于重新部署的相关风险会增大,不鼓励频繁更新。尤其对用户界面的开发者来说,因为他们通常需要快速迭代,频繁重新部署。

    ·难以伸缩应用。单体架构只能在一个维度伸缩。一方面,它可以通过运行多个副本来伸缩以满足业务量的增加。某些云服务甚至可以动态地根据负载调整应用实例的数量。但是另一方面,该架构不能通过伸缩来满足数据量的增加。每个应用实例都要访问全部数据,这使得缓存低效,并且增大了内存占用和I/O流量。而且,不同的组件所需的资源不同,有些可能是CPU密集型的,另一些可能是内存密集型的。单体架构下,我们不能独立地伸缩各个组件。

    ·难以调整开发规模。单体应用对调整开发规模也是个障碍。一旦应用达到一定规模,将工程组织分成专注于特定功能模块的团队通常更有效。比如,我们可能需要UI团队、会计团队、库存团队等。单体架构应用的问题是它阻碍组织团队相互独立地工作,团队之间必须在开发进度和重新部署上进行协调。对团队来说也很难改变和更新产品。

    ·需要对一个技术栈长期投入。单体架构迫使你采用开发初期选择的技术栈(某些情况下,是那项技术的某个版本)。单体架构下,很难递增式地采用更新的技术。比如,你选了JVM,除了Java你还可以选择其他使用JVM的语言,比如Groovy和Scala也可以与Java很好地进行互操作。但是单体架构下,非JVM写的组件就不行。而且,如果应用使用了后期过时的平台框架,将应用迁移到更新更好的框架上就很有挑战性。

    还有可能为了采用新的平台框架,需要重写整个应用,这样就太冒险了。

    微服务架构正是解决单体架构缺点的替代模式。

    微服务架构的例子

    一个微服务架构的应用,或是多层架构的,或是六角架构的,并且包含多种类型的组件。

    ·表示组件(Presentation Components)。响应处理HTTP请求,并返回HTML或JSON/XML(对于Web Service API而言)。

    ·业务逻辑(Business Logic)。应用的业务逻辑。

    ·数据库访问逻辑(Database Access Logic)。数据访问对象用于访问数据库。

    ·应用集成逻辑(Application Integration Logic)。消息层,如基于Spring的集成。

    这些逻辑组件分别响应应用中不同的功能模块。

    最终微服务架构的解决方案如下。

    ·通过采用伸缩立方(Scale Cube),特别是y轴方向上的伸缩来架构应用,将应用按功能分解为一组相互协作的服务的集合。每个服务实现一组有限并相关的功能。比如,一个应用可能包含订单管理服务、客户管理服务等。

    ·服务间通过HTTP/REST等同步协议或AMQP等异步协议进行通信。

    ·服务独立开发和部署。

    ·每个服务为了与其他服务解耦,都有自己的数据库。必要时,数据库间的一致性通过数据库复制机制或应用级事件来维护。

    微服务架构的服务部署如图9-2所示。

    分布式系统实战:什么是微服务架构?微服务架构与SOA架构的区别

    图9-2 微服务架构的服务部署

    这个方案有以下一些优点。

    ·每个微服务都相对较小。

    易于开发者理解。

    IDE反应更快,开发更高效。

    Web容器启动更快,开发更高效,并提升了部署速度。

    ·每个服务都可以独立部署,易于频繁部署新版本的服务。

    ·易于伸缩开发组织结构。我们可以对多个团队的开发工作进行组织。每个团队负责单个服务。每个团队可以独立于其他团队开发、部署和伸缩服务。

    ·提升故障隔离(Fault Isolation)。比如,如果一个服务存在内存泄漏,那么如果只有该服务受影响,其他服务仍然可以处理请求。相比之下,单体架构的一个组件出错可以拖垮整个系统。

    ·每个服务可以单独开发和部署。

    ·消除了任何对技术栈的长期投入。

    这个方案也有一些缺点。

    ·开发者要处理分布式系统的额外复杂度。·开发者IDE大多是面向构建单体架构应用的,并没有显示提供对开发分布式应用的支持。

    ·测试更加困难。

    ·开发者需要实现服务间通信机制。

    ·不使用分布式事务实现跨服务的用例更加困难。

    ·实现跨服务的用例需要团队间的细致协作。

    ·生产环境的部署复杂度高,对于包含多种不同服务类型的系统,部署和管理的操作复杂度仍然存在。

    ·内存消耗增加。微服务架构使用N×M个服务实例来替代N个单体架构应用实例。如果每个服务运行在自己独立的JVM上,通常有必要对实例进行隔离,对这么多运行的JVM,就有M倍的开销。另外,如果每个服务运行在独立的虚拟机上,那么开销会更大。

    何时采用微服务架构

    微服务使开发变得更简单、更快捷。以前开发人员耗费时间来搭建环境、熟悉代码结构,在微服务的世界里会简单许多。但是,微服务带来了一系列的非功能性需求,比如事务、服务治理(注册、发现、负载、路由、认证授权、隔离)、监控(日志、性能监控、告警、调用链路)、部署、测试等。微服务依赖于“基础设施自动化”。

    微服务不是“银弹”,何时采用微服务还需考虑企业自身的需求。

    在开发应用的初期,我们通常不会遇到采用微服务这种方法来试图解决问题的情况。而且,使用这个精细、分布式的架构将会拖慢开发进度。对于初创公司,这是个严重问题,因为它们的最大挑战通常是如何快速发展业务模型及相关应用。

    另一个挑战是如何将系统分割为微服务。这是个技术活,但有些策略可能有帮助。一种方法是通过动词或用例来分隔。比如,之后你将看到分隔后的电子商务应用有个负责派送已完成订单的派单服务。另一个通过动词分隔的例子是实现登录用例的登录服务。

    另一种分隔方法是通过名称或资源来分隔系统。这种服务负责对应给定类型的实体/资源的所有操作。比如,之后会发现为何电子商务系统有个库存服务来跟踪产品是否在库存中。

    如果你熟悉DDD(领域驱动设计),那么采用DDD来设计微服务,不但可以降低微服务环境中通用语言的复杂性,而且可以帮助团队搞清楚领域的边界,理清上下文边界。建议将每个微服务都设计成一个DDD限界上下文(Bounded Context),为系统内的微服务提供一个逻辑边界。

    理论上,每个服务应该只承担很小的职责。Bob Martin讲过使用单一职责原则(SRP)来设计类。SRP定义类的职责作为变化的原因,而且类应该只有一个变化的原因。使用SRP来设计服务也是合理的。

    另一个有助于服务设计的类是UNIX实用工具的设计方法。UNIX提供了大量的实用工具如grep、cat和find。每个工具只用于做一件事,通常做得非常好,并且可以与其他工具使用shell脚本组合来执行复杂任务。

    最后:

    最近我整理了整套**《JAVA核心知识点总结》**,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer

    进[Java架构资源交流群] ,找管理员获取哦-!

    展开全文
  • 微服务架构的理解定义:将功能分解成一系列服务的一种架构模式。着重点:相对于应用系统的功能性需求,更着重于应用系统的扩展性、灵活性,还有性能、运维、安全、测试、监控等非功能性需求。核心思想:...
  • 微服务架构微服务架构最强讲解,那叫一个通俗易懂! 目录如下: 一、微服务架构介绍 二、出现和发展 三、传统开发模式和微服务的区别 四、微服务的具体特征 五、SOA和微服务的区别 六、如何具体实践微服务 七、常见...
  • 微服务架构图得出如下结论: 传统的单体应用架构功能集中,代码和数据中心化,一个发布包部署后运行在同一个进程中的应用程序。 复杂性高:由于是单个归档文件,所以整个项目文件包含的模块非常多,导致模...
  • 微服务架构

    2019-11-12 10:36:33
    微服务架构是CloudNative的重要组成部分。微服务架构给我们带来收益的同时,也会带来副作用,我们应该在什么阶段采用微服务架构?如何拆分微服务架构?拆分粒度多大比较合适?本章内容从问题开始,循序渐进,带领...
  • 微服务架构整理-(一、微服务架构的发展)

    千次阅读 多人点赞 2021-01-02 19:40:13
    微服务架构的发展单体应用架构垂直应用架构分布式架构功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 微服务架构中的每个服务,都是具有业务逻辑的,符合高内聚、低耦合原则以及单一职责原则的单元,不同的服务通过“管道”的方式灵活组合,从而构建出庞大的系统。 2. 轻量级通信 服务之间通过轻量级的通信机制实现...
  • 微服务架构 面向服务型架构 我们大声而清晰地听到了微服务架构的好处 ; 我们听到持续不断的敲打声,说明您应该/为什么/一定要进行微服务; 我们知道Amazon , Netflix和Gilt等公司拥有成功的微服务架构。 但是,...
  • 导读: 天下大势,分久必合合久必分。...微服务架构中的每个服务,都是具有业务逻辑的,符合高内聚、低耦合原则以及单一职责原则的单元,不同的服务通过“管道”的方式灵活组合,从而构建出庞大的系统。 2. 轻...
  • 工作中使用了微服务架构,接下来的一段时间里,我会写一系列的文章来介绍微服务架构,同时我也会在github上写一个microservices的应用框架(地址会在后续文章给出)。 这篇文章是对 ...
  • 工作中使用了微服务架构,接下来的一段时间里,我会写一系列的文章来介绍微服务架构,同时我也会在github上写一个microservices的应用框架(地址会在后续文章给出)。(该文章来自...
  • 《 微服务与微服务架构 》   前言 再来谈谈微服务,关于“ 微服务架构 ” 早在2014 年一位名为 马丁.福勒 的工程师提出到现在(最早是在1967年,梅尔文.康威的康威定律中提及),经过了几年的沉淀与企业实战...
  • 微服务架构核心思想、原则简析 1,微服务架构是什么 很多做微服务的程序猿都很避讳SOA架构,谈起微服务必然和单体应用进行对比,好像不如此微服务架构就不高大上,不足以与有荣焉。 然而,从单体分层应用到分布式...
  • “微服务”是一个快速发展的主题,尽管它不是一个新的想法,“微服务”一词是2011年5月在威尼斯附近举办的软件架构师讲习班上由软件架构大师Martin Fowler提出来的,微服务架构风格是将一个单体的应用程序开发拆解为...
  • 架构探险-轻量级微服务架构 上次更新时间:2019年3月7日 1.微服务架构简介 微服务是管理安排的体系结构设计,其中应用程序作为不同的最小自治管理单元的集合来工作。 它是一种产品设计方法,其重点是将应用程序...
  • SOA架构和微服务架构的区别

    万次阅读 多人点赞 2018-06-19 10:25:47
    1.SOA架构和微服务架构的区别首先SOA和微服务架构一个层面的东西,而对于ESB和微服务网关是一个层面的东西,一个谈到是架构风格和方法,一个谈的是实现工具或组件。 1.SOA(Service Oriented Architecture)“面向...
  • 计划在接下来的时间里,把微服务架构下项目的实践,分门别类的总结汇总,围绕“微服务架构下的核心话题”,与大家分享,希望能够给大家在微服务中带来帮助,助力你更好的了解它,避免走不必要的弯路。 在接触任何...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,537
精华内容 13,014
关键字:

微服务架构原则