我的编程空间,编程开发者的网络收藏夹
学习永远不晚

微服务:如何拆分服务?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

微服务:如何拆分服务?

在微服务的落地中,第一步就需要进行微服务的拆分,服务的拆分很困难也很重要,本文就讲讲怎么进行服务的拆分。

技术发展到现在,还没有一个具体的,设计完善的标准方法来完成服务的拆分,服务的拆分是一门技术更是一门艺术。

对于服务的拆分,有两种情况 :

1、从零开始开发新的产品,采用微服务架构,进行服务拆分。

2、将现有的单体架构的产品重构成微服务架构,进行服务拆分。

如果做的是 ToB 业务,最终在企业内部私有化部署落地,那么在大多数的场景下,微服务拆分后系统的复杂度和引发的新问题会大于带来的好处。

随着业务的发展,产品需要进行 SaaS 化改造,团队也引入多种技术栈,进行微服务的拆分应该就是势在必行了。所以下面介绍的是怎样将现有单体架构拆分成微服务。

服务的拆分不是看代码量或是工程的大小,而是要根据当前业务的情况、团队的情况综合考虑,还是拿零代码平台作为例子。

零代码平台中有菜单、流程、表单、页面等模型,这些模型各自都能独立成一个服务,但前期为了快速交付,可以都放到一个工程中,但在代码组织和架构层面,为了后续的拆分,可以在逻辑和上进行隔离,物理文件可以用目录来区分,整体还是在一个大的工程中,如下图:

服务的拆分的一个最大的作用就是解耦,但并不是说一定要拆开才是解耦,在一个工程中,合理地使用面向对象的一些原则,比如依赖倒置、接口隔离等,也能做到解耦。

平台的功能在不断地迭代,现在需要添加 BI 模块,整个架构也调整为支持多租户模式,同时也需要开发应用商城,将零代码平台推上互联网,构建一个应用生态,用户可以直接安装应用或者将自己的应用发布到应用商城中。这里添加的 BI 和应用商城就可以作为一个单独的服务,而原来的整个零代码平台可以先作为一个大的服务存在,修改后的架构图如下:

上面的例子是从全局的维度来考虑应该怎样去拆分,不一定对,但以我目前的认知和现有的场景来看,我认为是适合的。

具体到一个特定的服务,最基本的要求是具有能访问的 API , 并且可以独立部署,至于数据库是独立还是跟其他服务共用,也是需要具体问题具体分析,如果存在较多的跨服务的查询操作,建议多服务共用一个数据库。

服务与服务之间需要做到高内聚低耦合,如果因为其他服务的变更导致需要频繁更新你的服务,或者说你的服务的一个小的改动会导致很多其他的服务要进行同步修改,那么说明服务之间的耦合性太高,拆分了享受不到微服务带来的好处,反倒是将缺点无限放大了。所以在拆分服务时要遵循两个原则:

1、通用功能,使用共享库,比如工具类,提取成 NuGet 包或者 Maven 包,在服务中进行引用;

2、业务相关的公共部分,使用单独的服务,提供 API 的方式供其他服务调用。

每个服务都可以使用不同的架构和技术栈来实现,有一种推荐的做法就是使用六边形架构,六边形架构在一些 DDD 的书籍和微服务的书籍中都有提到,下面是一张六边形架构的架构图:

六边形架构也称为端口适配器架构,可以替代传统的三层,解决三层架构的一些弊端。端口和适配器都分为入站和出站。

  • 入站适配器:通常就是对外的 RestAPI,通过调用入站端口来处理外部的请求,也可以是消息队列的消费者,进行一些事件的监听,来处理异步业务,当接收到消息时也是调用入站端口来进行处理。
  • 入站端口:业务服务对外暴露的公有方法。
  • 出站适配器:出站适配器实现出站接口,调用外部的服务来实现一个完整的业务逻辑,出站适配器也可以是消息队列的生产者。
  • 出站端口:出站端口是一组方法的接口定义,提供一种规范,供出站适配器来实现。

举一个例子:在零代码平台中,表单上拖一个控件保存后,最后的效果是列表上也会有这一列了,而表单和列表属于两个独立的服务,按照六边形架构,调用关系如下图:

六边形架构一个最大的好处就是将业务逻辑和适配器中包含的展示层和数据访问层的逻辑分离开,实现了解耦。

学习微服务,我觉得有必要同时学习领域驱动开发(DDD),微服务是一种架构风格,DDD 是具体的架构设计方法,互相配合能够更好地落地,因为:

1、DDD 中子域和限界上下文的概念可以对应到微服务中的服务。

2、微服务中一个服务可以由一个团队进行开发,DDD 的一个领域模型也是建议由一个独立的团队负责。

进行服务拆分后,之前在一个进程内就能完成的事情,现在需要在进程间进行通信了,有关进程间通信后面再继续分享。

零代码现在越来越火热,通过高度的抽象,将基础设施、重复性的工作作为平台本身的能力提供,让用户只用关注业务,这其实也是另一个层面的解耦和拆分。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

微服务:如何拆分服务?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

微服务:如何拆分服务?

在微服务的落地中,第一步就需要进行微服务的拆分,服务的拆分很困难也很重要,本文就讲讲怎么进行服务的拆分。

什么是微服务?如何拆分微服务?

本文,我们分析了什么是微服务,分析了它和单体服务的对比,以及如何拆分微服务。

微服务拆分之道

微服务在最近几年大行其道,很多公司的研发人员都在考虑微服务架构,同时,随着 Docker 容器技术和自动化运维等相关技术发展,微服务变得更容易管理,这给了微服务架构良好的发展机会。

如何使用 DDD 指导微服务拆分?

软件架构的发展经历了从单体架构、垂直架构、SOA架构到微服务架构以及到现在最新的service mesh(网格服务架构)的过程。

微服务世纪难题:如何拆分单体

微服务架构设计的第一个问题:拆分单体。

微服务架构:拆分单体应用的难点

拆分单体应用为服务的难点从表面上看,通过定义与业务能力或子域相对应的服务来创建微服务架构的策略看起来很简单。但是,你可能会遇到几个障碍:网络延迟。同步进程间通信导致可用性降低。 在服务之间维持数据一致性。获取一致的数据视图。上帝类阻碍了拆分
2023-06-05

如何把单体式应用拆解成微服务?【上】

微服务是当下最流行的应用架构技术了,它跟容器服务、DevOps合称云时代的三剑客,可以帮我们化解业务发展过快导致的产品迭代压力,让我们可以自由选择最适合团队的技术栈,让系统能够承载互联网海量用户的访问,让我们可以更加轻松地运维大型的互联网系
2023-06-05

微服务架构拆分的七大黄金法则

今天,码哥带大家从不同角度来剖析微服务架构设计的 7 大原则,做到合理且正确地拆分出微服务,避免打造一个被人诟病的伪微服务架构大单体,徒增运维和开发成本。

微服务的灾难:拆的很爽,但服务太小...

在今天的文章中,我们介绍了巨石应用和微服务架构的一些基本特性。同时也给大家展示了,最常见的切换方式:绞杀者模式。

遗留系统的服务拆分

我们正在书写、即将面对、正在面对遗留系统。在与遗留系统的相爱相杀中,需要我们基于项目目标和现状、结合过往经验、经过剪裁和取舍,才能迎面不断出现的挑战。

微服务架构设计:拆分和组织你的应用

在快速发展的数字化时代,应对日益复杂的业务需求和技术挑战,传统的单体应用架构可能会变得不够灵活和可扩展。微服务架构应运而生,成为了许多企业和开发团队所青睐的解决方案。

什么时候才是微服务拆分的最佳时机?

提到微服务,服务拆分是绕不过去的话题,但是微服务不是说拆就能拆的,需要很多的前提条件。首先,首先在基础设施层面,要有一个持续集成的平台,使得服务在拆分的过程中,功能的一致性,这种一致性不能通过人的经验来,而需要经过大量的回归测试集,并且持续
2023-06-05

微服务拆分到什么粒度合适——康威定律

微服务这个概念一直很火,现在ServiceMesh概念更火,最近我经手的多个项目也都采用微服务的方式开发。但实践发现,当一个RD同时开发超过2个微服务的时候,出现bug或故障的概率会提升。我现在看项目的时候会不自觉的关注工程服务拆分个数和研
2023-06-05

面试基操:微服务拆分需要考虑什么因素?

在实际互联网项目开发中,分布式事务不宜设计得太重,通常来说异步的场景使用事务性MQ来解决,

微服务:服务间如何通信?

不同的服务部署在不同的机器上,或者同一个机器的多个容器中,进程间进行通信就不可避免了,也变得非常重要。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录