从300万行到50万行代码,遗留系统的微服务改造(5)

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 从300万行到50万行代码,遗留系统的微服务改造(5)

如何对遗留系统的数据库进行拆分


在上述几个改造场景中,有些步骤涉及对遗留系统的数据库进行拆分。那么在多服务共享数据库的情况下,如何决定首先拆分哪个服务的数据库?哪种拆分顺序的工作量最小呢?一种方法是采用数据“读依赖最小”的顺序进行拆分,这种方法的实施可以概括为以下三个步骤:


1.表拆分,解除服务之间的数据关系耦合:列出各个服务对表的读写关系,如果只有一个服务对某个表进行写操作,不用拆分该表;当有多个服务对某个表进行写操作时,首先考虑将这张表拆分成多张有连接关系的表,将其转化为被某个服务单独进行写操作的表。


2.绘制服务依赖关系图:在每张表被独立服务单独进行写操作的情况下,按照如下规则构造有向图,即将所有服务作为有向图中的点,当服务A需要从服务B的数据库读取数据时,画一条由B指向A的有向边,表示服务A依赖于服务B;依此类推,直到绘制完整个依赖关系图。


3.库拆分,解除服务之间的数据库耦合:以有向图中各节点的出度(即从节点出发的边的条数)作为该服务被依赖数,进行排序,挑选被依赖数最小的服务,首先对其进行数据库解耦,把该服务下的数据库表独立出来,并在该服务里提供数据接口,以供依赖于它的服务调用。


重复第3步,直到所有数据库被拆分为由各个服务独享的数据库。


例如,如图6-12所示,是一组包含四个服务的依赖关系图,服务右上角的角标表示该服务的被依赖数。得知短信服务的被依赖数为0,为当前被依赖最少的服务,可以首先将该服务的数据库拆分出来。其次再按顺序依次拆分积分服务、订单服务和账户服务的数据库,直至所有数据库被拆分为由服务所独享的数据库。


image.png


四、遗留系统改造案例

本节以笔者曾亲身参与改造的遗留系统为案例,介绍如何将一个大型遗留系统向微服务架构进行迁移。


1. 改造前的系统情况

该系统是一个用于提供全球房产信息搜索服务的大型门户平台,核心功能主要包括如下几点,如图6-13所示。


  • 为用户提供基于地理位置、关键字的房产信息搜索功能。
  • 提供基于定制搜索条件的房源信息订阅。
  • 提供桌面端、平板端、手机端等多种不同方式的访问。


image.png


该系统是从多年前收购的一个通用搜索平台改造而来的,整体为一个规模庞大的单体应用,使用同一个代码库,技术栈主要以Java为主,数据库为Postgre,搜索引擎使用FASTSearch(历史原因),代码量大约在300万行左右。


随着业务演进的速度越来越快,单体应用的弊端导致系统变更成本越来越高。即使修改几行代码也需要经过冗长的测试以及发布流程,系统发布才能生效。面对这些问题,团队决心使用微服务架构,将未来的新功能全部以微服务实现,并将系统原有功能逐步迁移到微服务架构下。


2. 改造过程

步骤1:通过遗留系统API提供数据

当时,研发团队接到的第一个特性需求如下所示:


  • 支持NativeApp提供核心功能
  • 三个月上线首个版本


此时,面临的挑战主要包括以下两个:


  • 该系统的主要研发成员在海外,国内团队刚成立,新人多,知识迁移成本高。
  • 系统本身是基于商业通用搜索平台上进行的二次开发,逻辑复杂,代码耦合度高,变更成本高。


采取的方案主要包括如下几部分:

  • 在遗留系统上封装现有逻辑,提供基础API。
  • 重新实现一个服务,类似之前章节提到的BFF模式,为NativeApp提供数据。
  • 该服务通过访问遗留系统提供的基础API获得所需要的数据。
  • 该服务内实现必要的转换,提供给NativeApp界面进行呈现。


利用微服务架构的异构性,新服务命名为AppService,使用RubyOnRails实现,并实现相关的数据转换逻辑,为NativeApp提供数据API。通过这种方式实现的新服务,不仅能满足NativeApp的需求,而且可以快速开发,独立部署。


改造后的系统架构图,如图6-14所示。其中AppService服务提供两组API,分别是提供房源信息的EstateAPI和提供地理位置信息的LocAPI。


image.png




相关文章
|
5月前
|
人工智能 搜索推荐 前端开发
从代码到心灵对话:我的CodeBuddy升级体验之旅(个性化推荐微服务系统)
本文分享了使用CodeBuddy最新版本的深度体验,重点探讨了Craft智能体、MCP协议和DeepSeek V3三大功能。Craft实现从对话到代码的无缝转化,大幅提升开发效率;MCP协议打通全流程开发,促进团队协作;DeepSeek V3则将代码补全提升至新境界,显著减少Bug并优化跨语言开发。这些功能共同塑造了AI与程序员共生的未来模式,让编程更高效、自然。
562 15
|
7月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
本文介绍了在Spring Boot项目中如何通过创建`GlobalExceptionHandler`类来全局处理系统异常。通过使用`@ControllerAdvice`注解,可以拦截项目中的各种异常,并结合`@ExceptionHandler`注解针对特定异常(如参数缺失、空指针等)进行定制化处理。文中详细展示了处理参数缺失异常和空指针异常的示例代码,并说明了通过拦截`Exception`父类实现统一异常处理的方法。虽然拦截`Exception`可一劳永逸,但为便于问题排查,建议优先处理常见异常,最后再兜底处理未知异常,确保返回给调用方的信息友好且明确。
944 0
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
|
7月前
|
存储 NoSQL Linux
微服务2——MongoDB单机部署4——Linux系统中的安装启动和连接
本节主要介绍了在Linux系统中安装、启动和连接MongoDB的详细步骤。首先从官网下载MongoDB压缩包并解压至指定目录,接着创建数据和日志存储目录,并配置`mongod.conf`文件以设定日志路径、数据存储路径及绑定IP等参数。之后通过配置文件启动MongoDB服务,并使用`mongo`命令或Compass工具进行连接测试。此外,还提供了防火墙配置建议以及服务停止的两种方法:快速关闭(直接杀死进程)和标准关闭(通过客户端命令安全关闭)。最后补充了数据损坏时的修复操作,确保数据库的稳定运行。
480 0
|
11月前
|
监控 持续交付 API
深入理解微服务架构:构建高效、可扩展的系统
深入理解微服务架构:构建高效、可扩展的系统
181 4
|
11月前
|
Dubbo Cloud Native 应用服务中间件
阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。
在云原生时代,微服务架构成为主流。阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。示例代码展示了如何在项目中实现两者的整合,通过 Nacos 动态调整服务状态和配置,适应多变的业务需求。
325 2
|
10月前
|
监控 Java 数据中心
微服务架构系统稳定性的神器-Hystrix
Hystrix是由Netflix开源的库,主要用于微服务架构中的熔断器模式,防止服务调用失败引发级联故障。它通过监控服务调用的成功和失败率,在失败率达到阈值时触发熔断,阻止后续调用,保护系统稳定。Hystrix具备熔断器、资源隔离、降级机制和实时监控等功能,提升系统的容错性和稳定性。然而,Hystrix也存在性能开销、配置复杂等局限,并已于2018年进入维护模式。
169 0
|
11月前
|
监控 测试技术 持续交付
深入理解微服务架构:构建高效、可扩展的系统
深入理解微服务架构:构建高效、可扩展的系统
254 0
|
11月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
578 6
|
11月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
265 1
|
10月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
827 70
从单体到微服务:如何借助 Spring Cloud 实现架构转型

热门文章

最新文章