SpringCloud微服务开发实战:如何进行微服务的拆分?

如何进行微服务的拆分

在前面介绍了基于Spring Boot来快速实现一个“天气预报”应用。虽然没有使用太多的代码,但已经实现了数据采集、数据缓存、提供天气查询等诸多的功能,这也是Spring Boot是快速实现企业级应用开发的利器的原因。Spring Boot让企业级应用开发变得不再困难!

很显然,这个“天气预报”应用是一个单块架构的应用。它表面看上去很强大(集成了数据采集、数据缓存、提供天气查询等功能),但从另外一个角度看,它缺乏业务上的有效隔离。例如,如果第三方采集的接口协议变更怎么办?缓存服务失效怎么办?其中任何一个问题的发生,都势必会影响整个应用的可用性。

微服务拆分的意义

把所有鸡蛋放在一个篮子里所带来的风险是显而易见的——一损俱损。微服务架构正是通过分而自治的理念来降低服务故障的风险,从而实现服务的可行性。

1.微服务易于实现

更小的服务意味着更少的代码。更小的服务意味着不必考虑太多整体的技术架构或一站式的解决方案。只需要拿上趁手的兵器(开发工具和语言),奋勇开疆即可!

在实现微服务时,配以Spring Boot类开箱即用的工具,可以使自己更加有信心赶超进度。

2.微服务易于维护

更小的服务意味着更少的代码、更少的业务需求,也就容易被开发人员所理解,包括开发者和维护者。对于软件设计来讲,一个非常大的质量指标,就是软件是否可维护。更小、更内聚的微服务更加易于维护。

3.微服务易于部署

微服务往往采用轻量级的技术来实现,如内嵌容器的方式,这样,它更容易将其自身及所依赖的运行环境打成一个包来进行分发,从而避免了不同的部署导致的环境不一致的问题。再配合Docker等容器技术,可以进一步降低部署的复杂性。

4.微服务易于更新

微服务更容易被维护和修改,再加上每个微服务都是独立部署的,这样替换单个服务,并不会影响整体的软件功能。所以,微服务可以拥有对单块架构更加频繁的更新频率。

越频繁地更新,意味着越早将用户的需求反馈给用户﹔用户越早使用产品,越能发现程序的问题,这样就能及早地提出变更需求,从而形成了一个如图6-7所示的正向的反馈闭环。

拆分的原则

拆分微服务—般遵循如下原则。

1.单一职责原则

单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,是面向对象的五大基本原则(SOLID ) 之一。一个类只能有一个引起它变化的原因,因为它应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其他的职责。另外,多个职责耦合在一起,会影响复用性。

在架构设计中,业界普遍采用的是分层架构。分层的原则之一就是每一层都是专注于自己所处的那一层的业务功能,即遵守单一职责的原则。划分微服务时也要遵循单—职责原则,每个微服务只专注于解决一个业务功能。通过DDD的指导,可以更加清楚地划清不同业务之间的界限。

组织团队也要遵循单一职责原则,这样才能很好地管理团队成员的时间,提高效率。一个人专注做一件事情的效率远高于同时关注多件事情。同样一个人一直管理和维护同一份代码要比多人同时维护多份代码的效率高得多。这样就能充分发挥每一个人的个性,专注于每个人所擅长的事,这样做起事情来就会事半功倍,整个团队效率也会提高。

⒉.高内聚

内聚性又称块内联系,是指模块功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的一种度量。若一个模块内各元素联系得越紧密,则它的内聚性就越高。

程序员希望把相关的行为都聚集在一起,把不相干的行为放到其他地方。这样,当他们要修改某个行为的时候,只需要在一个地方修改即可,然后就能对该修改及早地进行发布。如果要在很多不同的地方做修改,那么就需要同时发布多个微服务才能交付这个功能。在多个不同的地方进行修改会很慢,同时也引入了很多测试的工作量,而且部署多个服务的风险也更加高。这两者都是开发人员想要避免的。

所以,确定问题域的边界,保证相关的行为能够放置在相同的地方,并且确保它们与其他边界以尽量低耦合的方式进行通信。

3.低耦合

耦合性也称块间联系,是指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合程度的高低取决于模块间接口的复杂性、调用的方式及传递的信息。

能够独立地修改及部署单个服务,而不需要修改系统的其他服务组成。

一个低耦合的服务,应尽可能少地了解其他服务的信息。这同时意味着,两个服务之间需要限制不同调用形式的数量,因为除了潜在的性能问题以外,过度的通信往往是造成紧密耦合的“原罪”。

4.恰当的“微”

服务间的低耦合是指修改一个服务,就不需要修改另一个服务。使用微服务最重要的一点就是,微服务到底多微才算“微”,这个业界也没有一定的标准。微服务也不是越小越好。服务越小,微服务架构的优点和缺点也就会越来越明显。服务越小,微服务的独立性就会越高,但同时,微服务的数量也会激增,管理这些大批量的服务也将会是一个挑战。所以服务的拆分也要考虑场景。例如,当开发人员认为自己的代码库过大时,往往就是拆分的最佳时机。代码库过大意味着业务过于复杂,明显已经超出了开发人员理解的范围,所以也是需要考虑进行拆分的。当然,代码库的大小不能简单地以代码量来评价,毕竟复杂业务功能的代码量,肯定比简单业务的代码量要高。同样地,一个服务,其功能本身的复杂性不同,代码量也截然不同。

5.拥抱变化

好的系统架构都不是一蹴而就的,而是通过不断地完善、不断地演进而来。在构建微服务架构时也是如此,应该是一个循序渐进的过程,允许架构在适当的时候做出调整,做出改变。在项目初始阶段,团队的队员之间肯定需要一个磨合,大家对于微服务的理解肯定也是各有差异,在构建微服务的过程中,往往也会出现划分服务不恰当的问题。此时,最重要的是能够容忍并改正错误,应清醒地认识到,错误是不可避免的,发现问题并努力去解决问题才是“王道”。在这之中,最关键的是团队要始终保持一个“拥抱变化”的心态。

拆分的方法

根据上面提到的拆分原则,拆分微服务主要有下面几种方法。

1.横向拆分

横向拆分,即按照不同的业务功能,拆分成不同的微服务,如天气数据采集、数据存储、天气查询等服务,形成独立的业务领域微服务集群,如图6-8所示。

2.纵向拆分

纵向拆分,即把一个业务功能里的不同模块或组件进行拆分。例如,把公共组件拆分成独立的基础设施,下沉到底层,形成相对独立的基础设施层,如图6-9所示。

图6-9是一个纵向拆分的例子,其中各层次的职责如下。

  • 用户界面层(User Interface):也称为用户接口层或表示层(Presentation Layer),负责向用户显示信息或解释用户指令。这里的用户可以是另外一个计算机系统,而不一定是一个使用用户界面的人。
  • 应用层(Application Layer):定义软件要完成的任务,并且指挥表达领域概念的对象来解决问题。该层主要负责的工作对于业务来说意义重大,也是与其他系统的应用层进行交互的必要渠道。应用层应该尽量简单,不包括业务规则或只是为下一层中的领域对象协调任务、分配工作,使它们互相协作。它没有反映业务情况的状态,但却可以具有另外—种状态,为用户或程序显示某个进度。
  • 领域层(Domain Layer):或称模型层(Model Layer),主要负责表达业务概念、业务状态信息及业务规则。尽管保存业务状态的技术细节是由基础设施层实现的,但是反映业务情况的状态是由本层控制并且使用的。领域层是业务软件的核心。
  • 基础设施层(Infrastructure Layer):为上面各层提供通用的技术能力,如为应用层传递消息、为领域层提供数据访问及持久化机制、为用户界面层绘制屏幕组件等。基础设施层还能够通过架构框架来支持这4个层次间的交互。

3.使用DDD

一个微服务,应该能反映出某个业务的领域模型。使用DDD,不但可以减少微服务环境中通用语言的复杂性,而且可以帮助团队搞清楚领域的边界,理清上下文边界。

建议将每个微服务都设计成一个DDD限界上下文(Bounded Context)。这为系统内的微服务提供了一个逻辑边界,无论是在功能还是在通用语言上。每个独立的团队负责一个逻辑上定义好的系统切片。最终,团队开发出的代码会更易于理解和维护。

本篇文章给大家讲的内容是如何进行微服务的拆分

  1. 下篇文章给大家讲解领域驱动设计与业务建模;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!!
(0)

相关推荐

  • JAVA | 什么是微服务?

    前言 最近公司某个项目的架构越来越庞大,维护起来非常难受.领导提出要把这个项目重构,在工作中需要把原来的项目重构成微服务架构,因此学习微服务相关知识,在这里记录下来,权当笔记的同时也希望能对你有启发. ...

  • 从单体应用走向服务化

    之前讲解了什么是微服务:微服务的核心在于服务治理,微服务架构是将复杂臃肿的单体应用进行细粒度的服务化拆分,每个拆分出来的服务各自独立打包部署,并交由小团队进行开发和运维,从而极大地提高了应用交付的效率 ...

  • 微服务架构概述

    架构师(JiaGouX) 我们都是架构师! 架构未来,你来不来? 一.前言 微服务(MicroServices)是一种架构风格,一个大型复杂软件应用由多个微服务和前端展示层组成.系统中的各个微服务可被 ...

  • 程序员蜕变为架构师必须要知道的「架构理论」

    Java思享汇2020-07-20 20:02:52 架构目的和指标 架构目的: 架构设计的主要目的是为了解决软件系统复杂度带来的问题,是用最小的人力成本来满足需求的开发和响应需求的变化,用最小的运行 ...

  • 我C,一个库里Curry几百个表,这谁受得了?

    随着业务越来越复杂,数据量越来越大,并发量越来越大,数据库的性能越来越低.好不容易找运维申请了两台机器,让DBA部署了几个实例,想把一些业务库拆分出来,却发现一个库里几百个表,拆不出来,扩不了容,尴尬 ...

  • SpringCloud微服务架构实战:微服务治理

    微服务治理 Spring Cloud 工具套件为微服务治理提供了全面的技术支持.这些治理工具主要包括服务的注册与发现.负载均衡管理.动态路由.服务降级和故障转移.链路跟踪.服务监控等.微服务治理的主要 ...

  • Spring Cloud微服务安全实战

    本篇讲网关上的限流 用开源项目spring-cloud-zuul-ratelimit 做网关上的限流 (项目github:https://github.com/marcosbarbero/) 1,在网 ...

  • 填补软件开发市场空白,飞算全自动软件工程平台瞄准全自动后端微服务开发

    (中国计算机世界出版服务公司出品) 低代码或者无代码开发平台,被视作软件开发领域的一个圣杯,现在,一个新的选手大胆绕过这一圣杯,对 "软件工程全自动开发"发起冲击. 11月17日, ...

  • 《Spring Cloud与Docker微服务架构实战》.pdf

    回复"面试"获取全套面试资料 什么是微服务架构? 微服务架构是一种架构模式,它提倡将单一的应用程序划分为一组小的服务,服务之间互相调用.互相配合,为用户提供最终价值. 每个服务运营 ...

  • ​一秒变基友?中美科学家开发首个超微、无线光遗传控制设备,成功实现小鼠 “社交控制”

    作者:ZS 编审:王新凯 排版:王落尘 近日,来自美国西北大学的黄永刚教授.Kozorovitskiy 教授.Rogers 教授以及大连理工大学的解兆谦教授合作,成功开发出首个超微型.无线.无电池且完 ...

  • 分布式事务+DDD+负载均衡+服务治理已撸!微服务不就这点事?

    Go语言中文网 今天 最近有看到"微服务,分久必合.合久必分"的言论,我同意,微服务不是架构演变的终点,细说还有Serverless.FaaS等方向.但纠结要不要拆分是没有必要的, ...

  • 市公安局 创新构建“邑微警”平台打造便民温情高效服务体系

    江门公安"邑微警"微信服务平台是市委.市政府"互联网+政务服务"的重点建设项目,该平台于2017年上线提供服务,在2018年完成二期升级改造.截至2020年12 ...

  • 微帮全国本地便民信息生活服务平台

    微帮是什么 微帮全民信息服务.寻人寻物.招聘求职.房屋租赁.求职.旅游.酒店住宿.招商代理.代理服务.出租与求租房子.二手闲置物品买卖等;欢迎各行各业商家,个人等合作多赢 微帮同城本地生活群信息服务类 ...

  • 禅城打造“微服务”三级平台,促进资源服务精准对接居民

    (记者:刘军 陈惠婷报道) 长期以来,如何让各类服务与居民精准对接,都是我国基层治理的重要痛点.在探索建设全国社区治理和服务创新实验区的过程中,佛山市禅城区初步建设成了覆盖区.镇街.社区"一 ...