微服务踩坑之边界

近年来微服务/SOA很是流行,我们团队赶时髦,也玩了玩。虽然用的时间还不长,但也已经踩过不少坑。今天想记录下自己对边界问题的一些思考。

很多人在谈起微服务时,总是会很自豪的说,微服务为我们提供了高内聚低耦合的明显好处,因为微服务强化了模块化的概念。但是, 如何模块化,如何明确的定义模块的边界,却很少有人提及,而这正是微服务架构的难点,也恰恰是开发人员技术能力的体现。如何正确的定义模块的边界,似乎还没人总结出一套理论原则。

当我们将一个单体服务进行模块化拆分时,我们总是能够很轻易地找到模块边界。那些不知道该放到哪个模块里的代码,便是我们模块边界的所在。在整理这些棘手的代码时,就是一个划分边界的过程。如果实在挪不开,这说明他们本就该属于同一个模块中或者他们上层应该还有一个服务。

在实际开发过程中,对单体服务进行重构的时候并不多。更多的时候,我们一开始做服务架构时便在使用微服务的架构模式。随着系统需求的渐渐复杂化,我们会发现,服务间的耦合越来越严重,甚至出现了循环依赖。这种时候我们不得不质疑自己,当初的模块是否划分的足够清晰。

我们做了一个借贷系统。系统中有两个核心服务,借款与还款。

借款的核心需求:

A。用户可以借款;

B。用户可以查看自己的借款明细。包括借款时间/金额等。

还款的核心需求:

A。用户可以对借款进行还款;

B。用户可以查看还款明细。

一开始,一切都显得很美好。我们遵循kiss原则,让各个模块尽量简单;同时为了项目组开发的便利,我们尽量将模块细化。于是划分了一个借款模块,一个还款模块。此时,我们服务的依赖关系很清晰。还款模块会单向依赖借款模块。还款成功后,通过消息进行解耦,对借款余额进行更新。

但随着系统需求的变化,借款详情中需要展示用户当前的还款情况,并计算未来的还款计划,这些都需要依赖还款模块。这种情况下,我们便形成了双向依赖的循环。借款模块会依赖还款模块,还款模块也依赖了借款模块。

这种情况下,出于项目进度,我们并没有进行任何的处理,而是任由双向依赖的发生,甚至,在还款模块直接依赖了借款的数据库来达到快速开发的目的。但这也为日后欠了技术债。

A。循环依赖日后可能会带来循环调用,这种结构上允许的闭环调用,很有可能在将来造成无意识的递归,让系统崩溃。

B。项目构建时,A/B模块的循环依赖,造成无法构建甚至循环构建。对我们系统的持续集成造成了障碍。

C。两个模块通过数据库进行共享来达到代码解耦,以后数据表结构若发生变化,代码维护将极其困难。

这种事情,相信很多人都遇到过,解决方法或许也与我们当前的类似。但是,其实这里有很好的办法来解决这个问题。我们只需要在借款模块与还款模块的上层,抽象出一个借还款核心模块,其负责将两个模块的耦合严重的业务进行整合,比如由他来发现借款订单,通过调用还款模块来计算还款计划,便可以消除整个循环依赖了。但是,这样会造成这种中间模块越来越多,对以后的系统维护又造成了一定难度。但这也不失为一种方法。

所以很多时候在想,这两个模块一开始是否划分的太细,是否一开始就应该在一起呢?我们划分模块边界的依据又是什么呢?欢迎大家一起探讨。

原文地址:https://www.cnblogs.com/williamjie/p/9499216.html

时间: 2024-10-31 04:52:30

微服务踩坑之边界的相关文章

coding的svn服务踩坑记

https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/ 前言 Q:咳咳,为啥会用到Coding的SVN?A:博主电脑上已经配好一个co

什么是微服务?为什么你要用微服务?

? 前言 最近几年微服务很火,大家都在建设微服务,仿佛不谈点微服务相关的技术,都显得不是那么主流了. 近几年见识到身边朋友的很多公司和团队都在尝试进行微服务的改变,但很多团队并没有实际微服务踩坑经验,很多团队甚至强行为了微服务而去微服务,最终写成一个大型的分布式单体应用,就是改造后的系统既没有微服务的快速扩容,灵活发布的特性,也让原本的单体应用失去了方便开发,部署容易的特性(项目拆为多份,开发部署复杂度都提高了),不得不说是得不偿失. 作者亲身经历和参与几个大型项目微服务的改造和建设.所以想作为

用微服务?

? 前言 最近几年微服务很火,大家都在建设微服务,仿佛不谈点微服务相关的技术,都显得不是那么主流了. 近几年见识到身边朋友的很多公司和团队都在尝试进行微服务的改变,但很多团队并没有实际微服务踩坑经验,很多团队甚至强行为了微服务而去微服务,最终写成一个大型的分布式单体应用,就是改造后的系统既没有微服务的快速扩容,灵活发布的特性,也让原本的单体应用失去了方便开发,部署容易的特性(项目拆为多份,开发部署复杂度都提高了),不得不说是得不偿失. 作者亲身经历和参与几个大型项目微服务的改造和建设.所以想作为

认识微服务一

一.什么是微服务,为什么用微服务 1.定义:将传统的单一应用,根据功能分为多个微型的服务,每个服务都独立部署.(自己理解的) 2.理解:根据业务来划分服务. 参看链接: https://www.zhihu.com/question/65502802 https://baijiahao.baidu.com/s?id=1600354904549354089&wfr=spider&for=pc? 前言 最近几年微服务很火,大家都在建设微服务,仿佛不谈点微服务相关的技术,都显得不是那么主流了. 近

程序员修神之路--为什么有了SOA,我们还用微服务?

菜菜哥,我最近需要做一个项目,老大让我用微服务的方式来做 那挺好呀,微服务现在的确很流行 我以前在别的公司都是以SOA的方式,SOA也是面向服务的方式呀 的确,微服务和SOA有相同之处 面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语言.这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互.它是一种设计方法,其中包

Summary of《认识微服务——一颗银弹》

(P.s. 本文系摘要,点我阅读原文.) --从<没有银弹>提出的软件工程本质性工作的四大难题讨论微服务的价值 软件工程的本质性与附属性工作 所有的软件创作都包括本质性和附属性工作:前者是创造由软件实体组成的复杂概念模型:后者是用程序语言表达软件实体,并在时间和空间的限制下翻译成机器语言.本质性工作存在四大难题:复杂性.隐匿性.配合性和易变性. 软件工程本质性工作的四大难题 1.复杂性 随着"软件吞噬世界"不断深入,软件对应的社会活动也越来越复杂.所实现业务的复杂,代表着软

.NET 微服务和Docker容器

.NET 微服务:适用于容器化 .NET 应用的体系结构 容器和 Docker 简介 什么是 Docker? Docker 术语 Docker 容器.映像和注册表 为 Docker 容器选择 .NET Core 还是 .NET Framework 通用指南 何时为 Docker 容器选择 .NET Core 何时为 Docker 容器选择 .NET Framework 决策表:用于 Docker 的 .NET Framework 使用 .NET 容器时定位的操作系统 官方 .NET Docker

快收藏!52篇25万字,微服务、云原生、容器、K8S、Serverless精华文章集锦

2017正在走远,新年之初,小数精选过去一年阅读量居高的技术干货,从容器.K8S 到微服务.云原生.Service Mesh,汇集成52篇精华集锦,充分反映了这一年的技术热点走向. 此文值得收藏,方便随时搜索和查看.2018,小数将继续陪伴大家,为朋友们奉献更有逼格的技术内容.2018年,在IT架构领域,你想看到哪些话题,请留言告诉我~~ 微服务篇 没说出口的研发之痛,做与不做微服务的理由请添加链接描述配置中心一团糟?微服务化改造切合企业系统需求请添加链接描述Weibo Mesh服务化实践如何应

传统行业转型微服务的挖坑与填坑

原文:传统行业转型微服务的挖坑与填坑 一.微服务落地是一个复杂问题,牵扯到IT架构,应用架构,组织架构多个方面 在多家传统行业的企业走访和落地了微服务之后,发现落地微服务是一个非常复杂的问题,甚至都不完全是技术问题. 当时想微服务既然是改造应用,做微服务治理,类似注册,发现,熔断,限流,降级等,当然应该从应用开发组切入,一般一开始聊的会比较开心,从单体架构,到SOA,再到微服务架构,从Dubbo聊到SpringCloud,但是必然会涉及到微服务的发布和运维问题,涉及到DevOps和容器层,这些都