竹笋

首页 » 问答 » 环境 » 微服务架构的设计原则和核心话题计算机j
TUhjnbcbe - 2023/3/3 19:02:00

一、前言

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

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

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

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

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

1.拆分足够微

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

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

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

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

2.轻量级通信

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

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

3.单一职责原则

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

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

4.领域驱动原则

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

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

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

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

1.服务拆分

服务拆分首先

1
查看完整版本: 微服务架构的设计原则和核心话题计算机j