精华内容
下载资源
问答
  • 微服务划分的姿势.pdf

    2021-09-14 18:07:43
    微服务划分的姿势.pdf
  • 微服务划分

    2018-07-10 14:08:37
    微服务、分布式、网关、鉴权、渠道、reids服务、基础服务划分
  • 微服务划分原则

    2020-12-16 23:48:31
    确切地说,服务中⼼的划分原则更多的是架构设计经验总结,我们很 难对⼀些具体的问题给⼀个精确的量化指标,但有⼀点,我很反对现在微 服务中的LOC(Line Of Code)这种指标,即⽤代码的⾏数来衡量⼀个微服 务...

    确切地说,服务中⼼的划分原则更多的是架构设计经验总结,我们很难对⼀些具体的问题给⼀个精确的量化指标,但有⼀点,我很反对现在微服务中的LOC(Line Of Code)这种指标,即⽤代码的⾏数来衡量⼀个微服务落地的标准。架构本来就是⼀个追求平衡的艺术,不仅是设计原则上的平衡,还要在技术、成本、资源、性能、团队等各⽅⾯进⾏平衡,以最⾼效地解决主要问题。我认为这也是⼀名优秀架构师的必备特质,偏执地追求⼀个维度的完美肯定会在其他⽅⾯付出代价。从服务中⼼设计来看,⼀定要兼顾三个⽅⾯的需求,如图所⽰:

    如果不能兼得,就抓住需要解决的主要⽭盾。共享服务中⼼的架构⽬的是通过业务拆分来降低系统的复杂性;通过服务共享来提供可重⽤性;通过服务化来达到业务⽀持的敏捷性;通过统⼀的数据架构来消除数据交互的屏障。所以,所有的原则和⽅法都是为了这些⽬标服务的,“以终为始”再来看服务中⼼建设的原则和⽅法就会明确很多。

    从设计层⾯来看,主要是要遵循⾯向对象的分析和设计的⽅法,即业务和系统建模遵循⾯向对象的基本原则,这些是多年软件⼯程学的沉淀,服务化不是开创⼀套新的设计⽅法,⽽是⼀个指路的明灯。从运营层⾯来看,服务中⼼应该是⼀个完整的业务模型,要有数据运营和业务整合的价值,前⾯在介绍淘宝的服务中⼼时,⼀直在强调服务中⼼的发展变化性和可运营性,⽐如淘宝的商品中⼼,绝对不只是简单的商品增删改查的服务接⼝,⽽是建⽴⼀个全球最⼤的商品库,同时提供该商品库的管理运营的⽅法和配套⼯具服务。当然淘宝的商品中⼼建⽴成这样是淘宝的电商业务决定的,并不意味着其他业务系统也要按这样的标准去建⽴⾃⼰的商品中⼼,⼀切要根据业务来做判断。

    从⼯程层⾯来看,共享服务的架构是基于分布式架构,分布式架构解决了⼀体化架构在⼤规模应⽤上的问题,但是也引⼊了分布式事务、问题排查等⽅⾯的⼀些难题,所以在规划服务中⼼的时候,⼀定要综合评估业务层对服务中⼼在数据库、业务以及运营⽅⾯的需求和技术上需要的投⼊。不能图⼀时之快把业务拆得⾮常彻底,到最后却不得不⽤很⼤资源投⼊来解决技术上⾯对的问题。

    总体上,我们从这三个维度出发来决定服务中⼼的设计和评估。下⾯我们具体介绍在实际项⽬中总结的⼀些基本原则。

    1.⾼内聚、低耦合原则

    这是系统设计⼀开始就会强调的⼀个基本原则,不过很多时候在实践中我们都在不知不觉中就违背了这个原则。⾼内聚是从服务中⼼的业务界

    域来说的,在⼀个服务中⼼内的业务应该是相关性很⾼、依赖性很⾼的;⽽服务中⼼之间应该是业务隔离性⽐较⼤的,即追求尽可能的低耦合。注

    意这⾥的业务隔离性是从应⽤场景来说的。

    举⼀个例⼦,很多应⽤⼀般都有⼀个会员中⼼,在会员的业务中,会有⽤营销⼿段来保持会员的忠诚度和活跃度,有些⽤户会倾向于把积分独⽴出来建⽴⼀个独⽴的积分中⼼或者放到营销中⼼,有些⽤户会觉得积分直接放在会员中⼼和会员等级挂钩。这⾥如果是你的系统,你会选择怎么做?其实,从之前的项⽬实践来看,⼀般建议⽤户先不要独⽴积分中⼼出来,因为拆分出⼀个积分中⼼,意味着你把会员服务的粒度缩⼩了,但是你的积分业务还不⾜够丰富的时候其实就只剩下增、删、改查的服务需求,对这种服务中⼼,不建议⼀开始就独⽴出来⼀个服务中⼼,还是等积分相关业务发展到⾜够丰富的程度或者对其他业务中⼼影响已经不可忽略

    的时候再去拆分出来不迟。

    2.数据完整性原则

    这个原则其实和上⾯的“⾼内聚、低耦合”⼀脉相承,是把这个思想穿透到数据模型层⾯,因为服务化架构⼀个很重要的业务价值就是数据模型统⼀。这⾥特别想强调⼤数据的思维,不光只是业务逻辑的关键数据,还要考虑到业务的相关性数据;不光是实时在线数据,还要考虑到离线计算的数据。

    3.业务可运营性原则

    服务中⼼⾸先是从业务出发,单纯的技术层⾯抽象出来的服务框架⼀般不作为⼀个可运营的服务中⼼。单纯的技术型的服务中⼼可以存在,但不是这⾥讨论的重点,我们期望服务中⼼是承载业务逻辑、沉淀业务数据、产⽣业务价值的业务单元。业务的运营性有两个层⾯含义,⼀是指业务本⾝的活⼒,当业务处于快速⽣⻓期,这时候的运营⽬标是满⾜上层的业务需求,这个时候属于沉淀阶段;第⼆个层⾯的运营是指业务内部的孕育出来的创新想法,⽐如淘宝基于⼤数据分析技术⽣⻓起来的商品巡检技术、前台类⽬⾃动聚合推荐技术等。数据模型统⼀之后,可⽤很低成本把⼤数据技术引⼊到服务中⼼的架构中,让数据来源、数据分析、业务⽣产可以⾃然形成闭环。所以能否⽤⼤数据能⼒提升运营⽔平是服务中⼼原则之⼀。

    4.渐进性的建设原则

    渐进性的建设原则是从降低⻛险和实施难度这个⾓度出发,服务化架构本来就是⼀种敏捷的实践,我们是推荐⼩步快跑的⽅式逐步推进,不是轰轰烈烈地推翻重来。其实在分布式架构体系下,在企业互联⽹架构体系下,试错的成本已经降到⾜够低,渐进式的建设也是服务中⼼建设的⼀个重要原则。

    有些⼈会觉得服务中⼼是基础服务,应该是⾮常稳定的,所以⼀开始规划设计的时候应⽤了太多的设计原则,最后从设计上看的确很清晰,但是在实施阶段,可能会碰到拆得过细有延迟太⻓的问题,数据过于分散有数据库性能的问题和分布式事务的问题,服务接⼝过于庞⼤的问题。这些实践证明都不是好的服务化实践。我们推荐服务化从简单开始,只有真实的业务需求才会锤炼出稳定可靠的共享服务。

    展开全文
  • 微服务划分的姿势

    2019-08-22 09:53:20
    我们知道微服务是一种理念,没有确切的定义和边界,好比设计原则,是属于抽象的概念。在定义不明确的情况下谈划分也是一种各说各话,具体问题需要具体分析,所以这篇文章谈到的划分也不是绝对标准,仅供参考。  ...

    我们知道微服务是一种理念,没有确切的定义和边界,好比设计原则,是属于抽象的概念。在定义不明确的情况下谈划分也是一种各说各话,具体问题需要具体分析,所以这篇文章谈到的划分也不是绝对标准,仅供参考。

      有人说微幅不难,难的是服务的划分,虽然我持保留意见。但是从侧面也反应了划分具有一定的困难。这里的矛盾在于粒度。如果粒度太大了,分和不分似乎都差不多;如果粒度太小了,聚合、发布、调用链、调试等都是坑。

      以下谈到的拆分是前人经验的总结,我罗列了三种行家的拆分姿势,每个的的经验和视野不同,各有偏颇,我在这里更多的是谈共鸣和感受,希望对你有所启发。

    一、拆分姿势

    1.姿势一:

      新浪微博微服务专家胡忠想从纵横两个维度来划分,简单粗暴:

    1.1 纵向拆分

      从业务维度进行拆分。标准是按照业务的关联程度来决定,关联比较密切的业务适合拆分为一个微服务,而功能相对比较独立的业务适合单独拆分为一个微服务。

    1.2 横向拆分

      从公共且独立功能维度拆分。标准是按照是否有公共的被多个其他服务调用,且依赖的资源独立不与其他业务耦合。

      纵向以业务为基准,关系铁的在一起;横向功能独立的在一起。我想如果拆分这么简单,你有底气拆,敢拆吗?所以我们又继续比对一下其他专家的言论。

     

    2.姿势二:

      阿里的小伙伴从综合的维度来看,部分维度和上面会有重合。

    2.1 服务拆分要迎合业务的需要

      充分考虑业务独立性和专业性,避免以团队来定义服务边界,从而出现“土匪”抢地盘,影响团队信任。

      这个维度和上面的类似,但是强调的是业务和团队成员的各自独立性,对上面是一种很好的补充。

    2.2 拆分后的维护成本要低于拆分前

      这里的维护成本包括:人力、物力、时间。

      这里的成本对大部分中小团队来说都是必须要考虑的重要环节,如果投入和收益不能成正比,或者超出领导的预算或者市场窗口,那么先进的技术就是绊脚石,千万不要迷恋技术,所谓工程师思维千万要不得。

    2.3 拆分不仅仅是架构的调整,组织结构上也要做响应的适应性优化

      确保拆分后的服务由相对独立的团队负责维护。

      这句话怎么理解呢?传统的团队划分是按照产品部、前端、后端横向划分,微服务化以后的团队可能就会是吃一张披萨饼的人数,产品、前端、后端被归类到服务里面,以服务为中心来分配人数。

    2.4 拆分最有价值的结果是提高了系统的可扩展性

      把具有不同扩展性要求的服务拆分出来,分别进行部署,降低成本,提高效率。比如全文搜索服务。

      这点和上面的按功能独立性来拆分有点类似,功能独立其实就是面向可扩展性。

    2.5 考虑软件发布频率

      比如把20%经常变动的部分进行抽离,80%不经常变动的单独部署和管理。说白了就是按照8/2原则进行拆分。这个拆分的好处很明显,可以尽可能的减少发布产生的后遗症,比如用户体验、服务相互干扰等。

      但是这里有一个问题,假如20%的服务分属于不同的业务层面,那该怎么办?所以这里的拆分应该有个优先级,在拆分相互冲突的时候应该要优先考虑权重比较高的那个。

     

    3.姿势三:

      资深技术专家李运华在他的架构书中给出的拆分:

    3.1 基于业务逻辑

      将系统中的业务按照职责范围进行识别,职责相同的划分为一个单独的服务。这种业务优先的方式在前面两种姿势当中都出现过,可见是最基本,最重要的划分方式(没有之一)。

    3.2 基于稳定性

      将系统中的业务模块按照稳定性进行排序。稳定的、不经常修改的划分一块;将不稳定的,经常修改的划分为一个独立服务。比如日志服务、监控服务都是相对稳定的服务,可以归到一起。这个很类似上面提到的2/8原则,80%的业务是稳定的。

      至此你会发现服务的拆分真的没有绝对的标准,只有合理才是标准。

    3.3 基于可靠性

      同样,将系统中的业务模块按照可靠性进行排序。对可靠性要求比较高的核心模块归在一起,对可靠性要求不高的非核心模块归在一块。

      这种拆分的高明可以很好的规避因为一颗老鼠屎坏了一锅粥的单体弊端,同时将来要做高可用方案也能很好的节省机器或带宽的成本。

    3.4 基于高性能

      同上,将系统中的业务模块按照对性能的要求进行优先级排序。把对性能要求较高的模块独立成一个服务,对性能要求不高的放在一起。比如全文搜索,商品查询和分类,秒杀就属于高性能的核心模块。

     

    4.姿势盘点:

      以上不同拆分姿势各有千秋,异曲同工!

    • 业务逻辑均不约而同的放在第一位。
    • 对业务模块的稳定性和可靠性,对功能的独立性、可扩展性都有相似的看法
    • 强调拆分应该是多选,而不是单选。具体情况具体分析,可以自由灵活排列组合。

    二.题外话

      如果你把上面的划分角度背下来了拿去现场套,可能还会遇到矛盾或争议。

    1.业务矛盾:

      假如我们按照业务来划分,根据粒度大小,可能存在以下两种:

    • 第一种分为商品、交易、用户3个服务;
    • 第二种分为商品、订单、支付、物流、买家、卖家6个服务。

      3 VS 6,这该怎么办?

      如果你的团队只有9个人,那么分成3个是合理的,如果有18个人,那么6个服务是合理的。这里引入团队成员进行协助拆分。

      可见拆分的姿势不是单选,而是多选的。这个时候必须要考虑团队成员数量

      在拆分遇到争议的时候,一般情况下我们增加一项拆分条件,虽然不是充要条件,但至少我们的答案会更加接近真理。

      除了业务可能存在争议,其他的划分也会有争议,比如一个独立的服务到底需要多少人员的配置?

    2.三个火枪手(人员配置)

      上面提到的人员数量配置,这里为什么是9和18呢?(这里的团队配置参考李云华前辈提到的三个火枪手的观点)

      换一种问法,为什么说是三个人分配一个服务(当然,成员主要是后端人员)?

    • 假设是1个人,请个假、生个病都不行。一个人会遇到单点的问题,所以不合理。
    • 假设是2个人,终于有备份了,但是抽离一个后,剩下1个压力还是很大,不合理。
    • 假设是3个人,抽离一个还有2个在。而且数字3是个稳定而神奇数字,用得好事半功倍。特别是遇到技术讨论,3个人相对周全,如果是2个可能会各持己见,带有自我的偏见和盲区。

      那么这个3是不是就是稳定的数量呢?

      假设你做的是边开飞机边换引擎的重写工作,那么前期3个人都可能捉襟见肘。但是到了服务后期,你可能1个就够了。

      所以3在我的理解应该是一个基准线,不同的时间段会有上下波动,但是相对稳定。

    展开全文
  • DDD应用于微服务划分

    千次阅读 2019-08-10 07:17:46
    现在很多的微服务开发团队在设计和实现微服务的时候觉得只要把原来的单体拆小,就是微服务了。但是这不一定是正确的微服务,可能只是一个拆小的小单体。而这种拆分真的能够给我们带来微服务架构的那...

    1 介绍引入

    • 随着互联网应用的发展,在敏捷快速迭代、高可用、高性能、高并发等方面要求越来越高,传统的SOA分布式架构并不适合这种场景,互联网最新流行且最佳的实践方式就是微服务化。

    • 而微服务的首要问题是微服务如何拆分。现在很多的微服务开发团队在设计和实现微服务的时候觉得只要把原来的单体拆小,就是微服务了。但是这不一定是正确的微服务,可能只是一个拆小的小单体。而这种拆分真的能够给我们带来微服务架构的那些好处吗?

    • 随着熟悉“领域驱动设计”方法的工程师发现,由于DDD可以有效的从业务视角对软件系统进行拆解,并且DDD特别契合微服务一个特征:围绕业务能力构建。这样搭建的微服务系统比较合理并且高内聚低耦合。

      下面从DDD的方法论上探讨系统如何拆分之两种方式:

    1.1 聚合根

    • 从广义上讲,领域(Domain)即是一个组织所做的事情以及其中所包含的一切。每个组织都有它自己的业务范围和做事方式。这个业务范围以及在其中所进行的活动便是领域。
    • 领域驱动设计一个重要的概念就是聚合根。聚合可以由单个实体组成,也可以由一组实体和值对象组成。聚合就是一组相关对象的集合。每个集合都有一个根和一个边界。边界定义了聚合的内部都有什么。根是聚合中所包含的一个特定实体。在聚合中,根是唯一允许外部对象保持对它的应用的元素,而边界内部的对象之间则可以互相应用。
    • 从聚合根的特性来看,它是业务系统的一层边界,识别了聚合根后,在重构拆分微服务时,很容易从一个应用迁移到另一个应用。
      在这里插入图片描述

    1.2 限界上下文

    • 限界上下文是一个显式的边界,领域模型便存在于这个边界之内。创建边界的原因在于,每一个模型概念,包括它的属性和操作,在边界之内都具有特殊的含义。一个限界上下文并不是只包含领域模型。诚然,模型是限界上下文的主要“公民”。但是,限界上下文并不只局限于容纳模型,它通常标定了一个系统、一个应用程序或者一种业务服务。由此可见,提炼限界上下文的方法也可以作为微服务的拆分。限界上下文比聚合根是在一个更大的范围限定的服务的边界。
    • 我们如何认为上下文边界的划分是合理的,通常情况下,如果你在不同的上下文中看到了完全相同的对象,这通常意味着你的模型是错误的或者上下文划分不合理。这时候就需要调整上下文或者识别出相识对象的细微区别。

    抽象图:

    在这里插入图片描述
    一个具体例子图:
    在这里插入图片描述

    2 总结

    经过理论的严密推理和大量实践项目的验证,业界绝大多数人士认为DDD是当前软件工程业界设计微服务的最佳实践。其中的很多理念和方法可以用来指导微服务拆分和设计,并且能促进企业软件开发能力的发展,提高开发质量和效率。

    展开全文
  • 我们公司落地微服务架构已多年,而我也接触开发了一段时间了。...微服务应该如何划分? 我的服务粒度应该如何评定? 在探讨这些问题之前,我们不妨先问自己:什么才算是好的服务? 坦率地讲,这个问题...

    我们公司落地微服务架构已多年,而我也接触开发了一段时间了。恰好,最近又抽空把《微服务设计》一书随手翻了一遍,便有了抒写此文的念头,虽然文中所述并非具有很强的普适性,倒也权当自己近来的总结和思考罢了。

    我想对于许多初始接触微服务开发的人员来说,都会或多或少有这样的疑问

    微服务应该如何划分?
    我的服务粒度应该如何评定?

    在探讨这些问题之前,我们不妨先问自己:什么才算是好的服务?
    坦率地讲,这个问题与微服务无关,我们不妨抽象在一个更高层面去思考:什么代码才算好的代码?我想很多人都会脱口而出:高内聚、低耦合
    没错,而这两个原则也是微服务的根基,如果做不到这两点,那么微服务的价值也就无从体现了。
    试想一下,服务提供者对于有多少服务消费者在使用是无感知的(虽然我们可以通过注册中心得知,但是意义不大,我们也并不关心),假设服务提供者的某个服务要做调整导致所有的消费者都需要连带调整,这是一件非常麻烦,也非常让人难以接受的事情。

    低耦合

    在微服务架构中,很重要的一点就是,在设计的时候,应尽可能的少知道协作者的信息,独立修改和部署服务而不需要其他服务同步修改。

    高内聚

    把相关的行为都聚集在一个地方,不相关的放在别处。多处修改一方面比较麻烦,另一方面,多处修改多处部署风险也会相对更高。

    在谨记两条原则的基础上,我们便可以带着疑惑进入到我们的下一个问题中去,也就是前文所提到的,「微服务应该如何划分」?

    限定上下文

    在《领域驱动设计》中,有一个比较重要的概念----限定上下文。
    在初次看到这个概念时,觉得非常的晦涩,但是随着在业务中的思考,这种概念变得清晰起来。我们不妨将限定上下文拆分成两个单词来看,「限定」+「上下文」。
    限定指的是某个范围或者环境中,比如在商品这个系统中。而上下文可以理解为语境。总结起来似乎可以这么理解:针对共同定义的某个模型,在不同的系统中有不同范围的属性;或者这么说,在对内和对外而言,虽然服务提供者需要暴露某些数据(共享模型),但是针对不同的业务,并非需要将所有的数据都暴露出去。

    举个更加清晰的例子而言,比如我们需要将商品作为一个服务划分出去,那么服务消费者所看到和我们内部系统所使用的是不同的,或者说,我们只会向外部共享他们所需要的,而我们内部表示并不共享,否则如果有朝一日内部有所调整,那么就必然影响到了服务消费者。
    因此,我们需要思考的点在于,共享特定模型,而不要共享内部表示,避免高耦合。
    值得一提的是,当我们在划分服务时,需要注意的是我们面临的是什么功能,而不是单纯的只考虑共享数据出去,否则极容易陷入贫血的误区。

    粒度

    当我们在划分设计时,有时候也会陷入过早划分的误区。一开始就把微服务划分的比较明细虽然并不是一件坏事,但是总会造成前期开发成本大的局面。
    我们在设计时,我更倾向于由粗到细的过程,然而,在这个过程中也会出现两种情况,比如嵌套式和完全分离的区别

    2020-04-14T15:29:30.png

    这两种划分方式的选择更多的取决于你公司的架构,如果说它们是不同团队在维护,那么完全分离更合适,如果是一个团队维护,那么嵌套式更为合适。

    欢迎关注我的公众号,每周至少一篇比较有深度的原创文章:
    在这里插入图片描述

    展开全文
  • 我们知道微服务是一种理念,没有确切的定义和边界,好比设计原则,是属于抽象的概念。在定义不明确的情况下谈划分也是一种各说各话,具体问题需要具体分析,所以这篇文章谈到的划分也不是绝对标准,仅供参考。 有人...
  • 首先请求会由前端通过网关到我们的业务微服务群,当然网关还可以完成一些预先的工作,比如:限流、鉴权、熔断降级、过滤、路由、负载均衡鞥等 等请求到达业务微服务群以后,业务就进行处理。具体业务在图中有展示。...
  • 初始化项目和添加微服务 10.PassJava-微服务划分图 11.初始化数据库和表 12.搭建管理后台 PassJava 初始化数据库表 用PowerDisigner工具创建数据库 用PowerDisigner工具创建数据库 总共有5个微服务数据库:内容、...
  • 微服务划分 问题分析 上篇介绍过我们一开始的服务划分标准 一个领域一个服务的规则去拆分, 同时为了保证领域的纯洁性,我们区分了领域服务,和前台服务。领域服务就是领域逻辑,不直接对前端暴露。前台服务组...
  • 微服务服务划分示例

    2020-04-02 14:00:20
    近年来微服务/SOA很是流行,我们团队赶时髦,也玩了玩。虽然用的时间还不长,但也已经踩过不少坑。今天想记录下自己对边界问题的一些思考。 很多人在谈起微服务时,总是会很自豪的说,微服务为我们提供了高内聚低...
  • 微服务是目前后端比较流行的架构体系了,那么如何做好一个微服务划分?一个微服务的粒度应该是多大呢?这篇主要介绍如何结合DDD进行领域划分。 工程结构代码 上篇介绍了可落地的DDD的(2)-为什么说MVC工程架构已经...
  • 微服务设计

    2020-06-23 20:12:59
    微服务划分原则 微服务六大设计原则 微服务的4个设计原则和19个解决方案 使用Spring 5实现响应式微服务架构 微服务划分的模式与反模式
  • 微服务
  • Foodie-Search Foodie-Item Foodie-Cart Foodie-User Foodie-Order Foodie-Auth
  • 那么服务层如何划分呢? 按什么划分 比如客户部门、物流部门、财务部门这样。但是这样划分的很少。 还有一种按业务分 解决不同业务问题。 比如稿件组、视频组、漫画组、评论组、弹幕组。 一般一个服务稳定了就可以...
  • 如何划分微服务

    2018-12-16 14:35:21
    这篇文章就主要了解一下怎么去划分微服务,确定服务边界。首先这里先介绍几个概念。 松耦合 就是服务与服务之间的影响要尽量减少,想象一下如果如果服务之间做到了松耦合,那么就意味着修改一个服务就不需要修改另...
  • 微服务和模块划分原则

    万次阅读 2019-06-22 21:46:10
    微服务架构作为目前使用的主流架构,已经被广泛使用,但是对于服务的划分却没有固定的原则,在工作中也经常会出现服务划分过度或者不充分的情况。所以在这里想探讨一下服务边界和服务划分的方法。 微服务设计四个...
  • 微服务最近很多但是对微服务的理解貌似有点不怎么透彻 比如我的项目有用户,订单,积分,消息,商家,商品等这么多模块。如果是单一工程就是很好理解就是一个项目全部都写到里面 那么如果是微服务化的话,我的理解...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,000
精华内容 12,000
关键字:

微服务怎么怎么划分