浅析微服务的拆分

一、怎么拆分微服务?

拆分微服务的时候,为了尽量保证微服务的稳定,会有一些基本的准则:

1、微服务之间尽量不要有业务交叉

2、微服务之间只能通过接口进行服务调用,而不能绕过接口直接访问对方的数据

3、高内聚,低耦合

怎样设计出高内聚、低耦合的微服务

高内聚低耦合,是一种从上而下指导微服务设计的方法。实现高内聚低耦合的工具主要有

同步的接口调用(Feign) 和异步的事件驱动(MQ,ApplicationEventPublisher\@EventListener) 两种方式。

 

二、DDD领域驱动设计

什么是DDD?

在2004年,由Eric Evans提出的,DDD是面对软件复杂之道,Domain-Driven-Design。

Martin Fowler -> 贫血模型 -> 贫血失忆症。

充血模型

MVC架构 -> 领域优先的四层架构

贫血模型:业务和数据是割裂的,实体里面完全体现不了业务。贫血失忆症。

充血模型:业务和数据是放在一起的,比如价格,addPrice(), setPrice()方法,这样的话,这个实体里面,有哪些业务就一目了然了。

以Entity为核心,把它们包装成一个一个领域,也就是说在应用层看到的是一个一个的领域,这个领域具备了领域内的所有行为。

所有与底层的操作,包括数据库,MQ这些操作,就是基础层。

业务之间会有很多的关联,代码都是混合在一起的,比如Product Entity,在物流领域我可能更关注它的长宽高,而在销售领域我可能更关注它的库存量,价格。

大泥团:

不利于微服务的拆分。大泥团结构拆分出来的微服务依然是泥团结构,当服务业务逐渐复杂,这个泥团又会膨胀成大泥团

大泥团结构,虽然,拆成不同的微服务,但是在业务上,在领域上依然是重用的,物流啊价格啊,这些业务实际上还是重合的。

随着软件的不断复杂,不断复杂,最终都会落到同一个产品表,那它们的产品表,最终还会是原来的Product,业务行为实际上还是重叠的。

DDD只是一种方法论,没有一个稳定的技术框架。DDD要求领域是跟技术无关、跟存储无关、跟通信无关。

你这个领域不管是放在单体架构内,还是放到微服务架构内,它都是足够的高内聚,低耦合的。

三、什么是中台?中台和微服务有什么关系?

中台这个概念是由阿里在2015年提出"小前台,大中台"战略思想。

所谓中台,就是将各个业务线中可以复用的一些功能抽取出来,剥离个性,提取共性,形成一些可复用的组件。盒马鲜生、团购。

大体上,中台可以分为三类 业务中台、数据中台和技术中台。

大数据杀熟-数据中台

电商 收银中台 支付风控中台

中台跟DDD结合:DDD会通过限界上下文将系统拆分成一个一个的领域,而这种限界上下文,天生就成了中台之间的逻辑屏障

DDD在技术与资源调度方面都能够给中台建设提供不错的指导。

DDD分为战略设计和战术设计。上层的战略设计能够很好的指导中台划分,下层的战术设计能够很好的指导微服务搭建。

在目前阶段,DDD还大都处在小范围实验的阶段

四、你的项目中是怎么保证微服务敏捷开发的?微服务的链路追踪、持续集成、AB发布要怎么做?

开发运维一体化

敏捷开发:目的就是为了提高团队的交付效率,快速迭代,快速试错

每个月固定发布新版本,以分支的形式保存到代码仓库中。快速入职、任务面板、站立会议。团队人员灵活流动,同时形成各个专家代表。

测试环境 -> 生产环境  开发测试环境SIT、集成测试环境、压测环境STR、预投产环境、生产环境PRD。

文档优先。晨会、周会、需求拆分会。

链路追踪

1.基于日志。形成全局事务ID,落地到日志文件。filebeat-logstash-Elasticsearch 形成大型报表。

2.基于MQ,往往需要架构支持。经过流式计算形成一些可视化的结果。

持续集成

SpringBoot maven pom -> build -> shell; Jenkins.

AB发布

1、蓝绿发布、红黑发布。老版本和新版本是同时存在的。

2、灰度发布、金丝雀发布。

视频教程

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocal 是 Java 中的一个类,它提供了一种线程局部变量的机制。线程局部变量是指每个线程都有自己的变量副本,每个线程对该变量的访问都是独立的,互不影响。 ThreadLocal 主要用于解决多线程并发访问共享变量时的线程安全问题。在多线程环境下,如果多个线程共同访问同一个变量,可能会出现竞争条件,导致数据不一致或者出现线程安全问题。通过使用 ThreadLocal,可以为每个线程提供独立的副本,从而避免了线程安全问题。 ThreadLocal 的工作原理是,每个 Thread 对象内部都维护了一个 ThreadLocalMap 对象,ThreadLocalMap 是一个 key-value 结构,其中 key 是 ThreadLocal 对象,value 是该线程对应的变量副本。当访问 ThreadLocal 的 get() 方法时,会根据当前线程获取到对应的 ThreadLocalMap 对象,并从中查找到与 ThreadLocal 对象对应的值。如果当前线程尚未设置该 ThreadLocal 对象的值,则会通过 initialValue() 方法初始化一个值,并将其存入 ThreadLocalMap 中。当访问 ThreadLocal 的 set() 方法时,会将指定的值存入当前线程对应的 ThreadLocalMap 中。 需要注意的是,ThreadLocal 并不能解决共享资源的并发访问问题,它只是提供了一种线程内部的隔离机制。在使用 ThreadLocal 时,需要注意合理地使用,避免出现内存泄漏或者数据不一致的情况。另外,由于 ThreadLocal 使用了线程的 ThreadLocalMap,因此在使用完 ThreadLocal 后,需要手动调用 remove() 方法清理对应的变量副本,以防止内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值