微服务拆分

  • 微服务拆分时机
    • 为了快速迭代
    • 高并发场景
    • 可重用
    • 提交代码经常冲突
    • 小功能要积累到大版本才能上线
  • 服务拆分原则
    • 原则一:高内聚和低耦合。
    • 原则二:服务拆分正交性原则
    • 原则三:服务粒度适中、演进式拆分
    • 原则四:服务接口的定义要保证可扩展性与幂等性。

微服务拆分时机

微服务拆分绝非一个大跃进运动,由高层发起,把一个应用拆分的七零八落的,最终大大增加运维成本,但是并不会带来收益。微服务拆分的过程,应该是一个由痛点驱动的,是业务真正遇到了快速迭代和高并发的问题,如果不拆分,将对于业务的发展带来影响,只有这个时候,微服务的拆分是有确定收益的,增加的运维成本才是值得的。

为了快速迭代

使用微服务架构的目的就是为了快速迭代,快速上线,这也是微服务架构的最大特点。

  • 前后端分离
  • 业务域拆分,例如订单、营销、风控、积分资源等。形成独立的业务领域微服务集群

高并发场景

对于微服务化拆分后的服务,可以轻松地进行水平扩容,进行服务优化,满足更多的并发和性能需求。

在高并发场景下(或者资源紧张的场景下),我们希望一个请求如果不成功,不要占用资源,应该尽快失败,尽快返回,而且希望当一些边角的业务不正常的情况下,主要业务流程不受影响。这就需要熔断策略,也即当A调用B,而B总是不正常的时候,为了让B不要波及到A,可以对B的调用进行熔断,也即A不调用B,而是返回暂时的fallback数据,当B正常的时候,再放开熔断,进行正常的调用。

这里的拆分主要是为了服务隔离、数据隔离、异常容错、调配资源

可重用

将公共组件拆分成独立的原子服务,下沉到底层,形成相对独立的原子服务层

提交代码经常冲突

微服务对于快速迭代的效果,首先是开发独立,如果是一单体应用,几十号人开发一个模块,如果使用GIT做代码管理,则经常会遇到的事情就是代码提交冲突。同样一个模块,你也改,他也改,几十号人根本没办法沟通。所以当你想提交一个代码的时候,发现和别人提交的冲突了,于是因为你是后提交的人,你有责任去merge代码,好不容易merge成功了,等再次提交的时候,发现又冲突了,你是不是很恼火。随着团队规模越大,冲突概率越大。

所以应该拆分成不同的模块,每十个人左右维护一个模块,也即一个工程,首先代码冲突的概率小多了,而且有了冲突,一个小组一吼,基本上问题就解决了。每个模块对外提供接口,其他依赖模块可以不用关注具体的实现细节,只需要保证接口正确就可以。

小功能要积累到大版本才能上线

微服务对于快速迭代的效果,首先是上线独立。如果没有拆分微服务,每次上线都是一件很痛苦的事情。当你修改了一个边角的小功能,但是你不敢马上上线,因为你依赖的其他模块才开发了一半,你要等他,等他好了,也不敢马上上线,因为另一个被依赖的模块也开发了一半,当所有的模块都耦合在一起,互相依赖,谁也没办法独立上线,而是需要协调各个团队,大家开大会,约定一个时间点,无论大小功能,死活都要这天上线。

这种模式导致上线的时候,单次上线的需求列表非常长,这样风险比较大,可能小功能的错误会导致大功能的上线不正常,将如此长的功能,需要一点点check,非常小心,这样上线时间长,影响范围大。

服务拆分后,在团队职责明确、应用边界明确、接口稳定的情况下,不同的模块可以独立上线。这样上线的次数增多,单次上线的需求列表变小,可以随时回滚,风险变小,时间变短,影响面小,从而迭代速度加快。对于接口要升级部分,保证灰度,先做接口新增,而非原接口变更,当注册中心中监控到的调用情况,发现接口已经不用了,再删除。

服务拆分原则

原则一:高内聚和低耦合。

也就是说每个服务只完成自己职责之内的任务,对于不是自己职责的功能交给其它服务来完成。说起来你可能觉得理所当然对这一点不屑一顾,但很多人在实际开发中,经常会出现一些问题。

比如,我之前的项目中有用户服务和内容服务,用户信息中有“是否为认证用户”字段。组内有个同事在内容服务里有这么一段逻辑:如果用户认证字段等于 1,代表是认证用户,那么就把内容权重提升。问题是判断用户是否为认证用户的逻辑应该内聚在用户服务内部,而不应该由内容服务判断,否则认证的逻辑一旦变更内容服务也需要一同跟着变更,这就不满足高内聚、低耦合的要求了。所幸我们在 Review 代码时及时发现了这个问题,并在服务上线之前修复了它。

原则二:服务拆分正交性原则

两条直线相交成直角,就是正交的。正交也就是两条直线互不依赖。如果一个系统的变化不影响另一个系统这些系统就是正交的。

直接应用正交性原则,构建的系统的质量可以得到很大提高,可以让你的系统易于设计、开发、测试及扩展上线。提高开发效率,降低风险。

原则三:服务粒度适中、演进式拆分

微服务拆分并不是一步到位的,应当根据实际情况逐步展开。如果一开始不知道应该划分多细,完全可以先粗粒度划分,然后随着需要,初步拆分。比如一个电商一开始索性可以拆分为商品服务和交易服务,一个负责展示商品,一个负责购买支付。随后随着交易服务越来越复杂,就可以逐步的拆分成订单服务和支付服务。

此外,一个微服务需要足够简单,站在微服务角度而言往往只需要2人左右可方便快速维护。如果维护的人员过多,要么这个服务过于复杂成为了单体应用;要么是服务边界划分得不够明确;要么是人员组织架构的职责不清。

原则四:服务接口的定义要保证可扩展性与幂等性。

服务拆分之后,由于服务是以独立进程的方式部署,所以服务之间通信就不再是进程内部的方法调用而是跨进程的网络通信了。在这种通信模型下服务接口的定义要具备可扩展性,否则在服务变更时会造成意想不到的错误。

在之前的项目中,某一个微服务的接口有三个参数,在一次业务需求开发中,组内的一个同学将这个接口的参数调整为了四个,接口被调用的地方也做了修改,结果上线这个服务后却不断报错,无奈只能回滚。

这是因为这个接口先上线后参数变更成了四个,但是调用方还未变更还是在调用三个参数的接口,那就肯定会报错了。所以服务接口的参数类型最好是封装类,这样如果增加参数就不必变更接口的签名,而只需要在类中添加字段就可以了。
幂等操作使用状态机,当一个调用到来的时候,往往触发一个状态的变化,当下次调用到来的时候,发现已经不是这个状态,就说明上次已经调用过了。状态的变化需要是一个原子操作,也即并发调用的时候,只有一次可以执行。

微服务拆分时机与原则相关推荐

  1. 微服务拆分策略和原则

    目录 微服务拆分目的 单体应用拆分成微服务的时机 拆分时指导原则 拆分的粒度把控 微服务拆分策略 微服务合并 拆分过程中要注意事项 注意:本文参考  微服务拆分策略和原则 - 简书 微服务拆分目的 不 ...

  2. 微服务拆分原则之 AKF

    当我们搭建集群的时候,首先要想明白需要解决哪些问题,搞清楚这个之前,想想单节点.单实例.单机有哪些问题? 单点故障 容量有限 可支持的连接有限(性能不足) ...... 为了解决这些问题,我们需要对服 ...

  3. 微服务拆分原则之AKF

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  4. 聊聊微服务拆分原则之 AKF

    当我们搭建集群的时候,首先要想明白需要解决哪些问题,搞清楚这个之前,想想单节点.单实例.单机有哪些问题? 单点故障 容量有限 可支持的连接有限(性能不足) ...... 为了解决这些问题,我们需要对服 ...

  5. 迭代开发中的微服务拆分

    微服务拆分是微服务架构绕不过的话题,随着架构演进,在迭代开发中拆分微服务有时非常必要,微服务拆分不仅仅是一项技术层面的重构,首先要选择的合适的时机,另外在拆分前一定要理清业务现状,制定好拆分的基本原则 ...

  6. 微服务拆分,选型与演进

    微服务拆分原则 在微服务拆分中,核心需求在于拆开的微服务之间的联系越少越好,数据交互也是越少越好.因为微服务之间的数据一致性非常难处理,如果一致性方面的问题很少,整体做起来就比较简单了. 微服务架构选 ...

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

    点击上方肉眼品世界, 右上角选择"设为星标 深度价值体系传递 开发者在刚开始尝试实现自己的微服务架构时往往会产生一系列问题 : 微服务到底应该怎么划分? 一个典型的微服务到底应该有多微? 如 ...

  8. 现代微服务拆分与设计

    现代微服务拆分与设计 一.AKF扩展立方体 Y轴 X轴 Z轴 二.前后端分离 早期未分离(JSP+Servlet) 半分离 完全分离 三.无状态服务 四.RestFul服务通信 在设计一个微服务的时候 ...

  9. 7:第三章:电商工程分析:2:电商工程业务解读与微服务拆分;

    说明: (1)本篇博客内容:[先了解一下,电商系统应该包含哪些业务]→[然后,结合微服务架构思想和原则,对电商系统的业务进行拆分]: (2)在实际中,这部分工作一般都是大佬干的,一般人hold不住: ...

最新文章

  1. 出行公司集体亮剑 自动驾驶花落谁家?
  2. ***正传——著名网络安全人士郭鑫成长经历
  3. 003_Redis配置
  4. arraylist如何检测某一元素是否为空_我们应该如何理解Java集合框架的关键知识点?...
  5. reloaddata 跳动_纸跳动像素
  6. Apache Pulsar:分布式发布订阅消息系统
  7. 8个最高效的Python爬虫框架,你用过几个?
  8. IE浏览器怎么在桌面隐藏图标
  9. 深入理解计算机系统(3.3)------操作数指示符和数据传送指令
  10. 空间波(space wave)
  11. 用JAVA写出1到999的随性化数_请详细翻译一个简单的JAVA程序问题
  12. 安装redis3.0.5
  13. 绿幕抠图与无绿幕抠图区别
  14. 如何将FLASH 里fla swf的矢量图像导入到Photoshop?
  15. 刘晓艳老师的考研单词记忆
  16. js 预编译 AO对象跟GO对象
  17. 计算机网络 - 应用层
  18. 卫星ku波段为何优先使用垂直极化波
  19. P2P三种模式的分化和实质
  20. 每天一个linux命令:chgrp

热门文章

  1. JS获取指定日期前后N天的日期、前N个月日期、后N个月日期
  2. arduino和stm32哪个更好学?
  3. JVM——深入理解类加载器
  4. 实时时钟DS1302实验
  5. OpenAI ChatGPT,爆火的OpenAi的ChatGPT聊天机器人注册和使用攻略,满满诚意哦
  6. 苹果mac休眠快捷键_史上最详细的苹果Macbook快捷键使用
  7. HTML SWF播放器
  8. linux集显驱动程序,Ubuntu14.04安装intel集显驱动
  9. TPC/IP协议中与IP相关的知识点简介
  10. java 字符串加密_如何用JAVA实现字符串简单加密解密?