前言

关于微服务的概念,说到底,很多人看了之后会认为没有什么意思,因为没有实际的东西说明,即使每个概念都明白了,也很难付之实践。所以这次,我来用一个实际的例子去说明,在实际的项目过程中我们会如何去构建我们的微服务。

PS:我们只是利用场景去模拟我们微服务构建或者说拆分的整个过程,对于场景本身在实际中会出现的问题我们不做考虑,说白了就是我们不考虑场景本身在实际生活中是不是这样的。

使用SpringCloud+Gradle构建

本文目的:让你体会到服务拆分本身,引起你对服务拆分的思考。

场景模拟

我们首先模拟这样一个业务场景,积分兑换实体商品。流程大致如下:

1、用户登录

2、选择商品

3、下单

4、积分支付

5、商品发货

6、订单完成

“抽离业务”这里为了简化我们的实现,我们去掉用户登录和商品发货这样两个步骤,也就是默认用户登录,默认订单一定完成。

如果使用单体架构,那我们最后实现的情况应该大多是这样的。

···

用户点击兑换 ->

【减少商品库存,操作商品表】

【生成订单,操作订单表】

【减少用户积分,操作用户积分表】

【添加用户积分记录,操作积分记录表】

在不考虑并发的情况下,也需要使用事务,也就是说,其中任意一步操作出现问题,都会导致整个兑换出现问题,也就是全部回滚数据。这是我们一般在单体应用中所经常实现的方式。

如何拆分成微服务

现在,无论是老板说了,还是说就是想做,甭管因为什么,反正我就是想要把它做成微服务。怎么办?

那么一个看似耦合性很高的业务场景,我们究竟如何将它拆分成微服务呢?

我们拆分需要掌握的逻辑

1、如果我们要拆分的业务本身耦合度较高,那么拆分的需要做的是拆离业务,说白了就是需要和产品商量业务上面需要进行部分改动。

2、如果我们拆分的业务本身没有耦合度,那么随你拆???不是的,需要考虑两点,一个是粒度太细成本就会上去,一个是后期扩展是否会有影响

架构改变

下面两张图是我们模拟架构改变前后大致画了一下的两张图,我们可以简单从图中获得两者的大体差异

具体拆分

现在我提出一种拆分的方式

1、减少商品库存创建订单放在一个微服务中,构成下单服务

2、减少用户积分和操作用户积分记录放在另一个微服务中,构成支付服务

拆分后的逻辑

用户点击兑换 ->

【减少商品库存,操作商品表】

【生成订单,操作订单表】

【减少用户积分,操作用户积分表】

【添加用户积分记录,操作积分记录表】

拆分达到的效果:

即使用户积分因为种种原因没有正常扣除,后续还可以进行支付

拆分的好处:

后期扩展上来讲,后期如果支付方式不只是积分,可以用别的,那么只需要对支付服务进行修改,对于下单来说没有任何关系

拆分代码

https://github.com/LinkinStars/MicroServiceExample

分析总结

如果你看完代码你就知道,其实拆分本身没有你想象的那么复杂,虽然我们简化了其中的部分细节,但是实际如果需要这样去拆分,逻辑上其实就这样的。没有你想象的那么复杂。

但是!!!

困难其实并不在拆分代码本身,之前一篇博客我就提到了,其实微服务的拆分并没有实际想象的那么复杂,而困难来自于拆分后会导致的各种问题,因为其实对于业务本身来说,很多时候我们都会遇到一些耦合性的业务,这些业务本身很难拆分。所以和上面说的一样,在一些服务进行实际拆分的时候我们会对业务进行调整,虽然对于用户感知本身是一样的,但是实际代码来说是不一样的。

总结以下几点供参考:

1、如果经验不足,先小拆,后大拆

2、假设异常,假设每个服务都分别出现一次异常,会对你拆分后的服务造成什么样的影响

3、优先保证主线业务稳定

4、拆分的原则是为了后期业务扩展,那么你需要优先考虑到后期的扩展大致会怎么样

Follow up

我一直在强调一点就是,我们这个只是一个业务场景的模拟,实际上会有什么问题呢?

1、当用户积分不够所带来的一直无法支付,对于这个订单的后期如何处理?

2、针对于一些大型项目,对于订单和商品都需要进行拆分,那么会对现在的系统造成什么影响呢?

3、减少用户积分(后期别的支付方式),其实添加记录不应该影响支付,那么如何解耦?

...

等等的一些问题,我觉得你都应该去考虑,然后去尝试,然后去发现问题。

这里面就会有很多有趣的东西了,比如mq、异步等等,抛砖引玉、抛砖引玉

后面就看你的了!

jq项目如何启服务_用小项目详解我们应该如何去构建我们的微服务相关推荐

  1. spring解耦_云端时代的解耦:使用Spring Cloud Azure构建云端原生微服务

    spring解耦 重要要点 云本机应用程序应充分利用云的优势,而不仅仅是迁移到云中 通过在云计算环境上运行,微服务与云原生环境并驾齐驱 集中配置,服务发现,异步消息驱动和分布式跟踪是微服务基础架构 S ...

  2. 图文详解:如何给女朋友解释什么是微服务?

    微服务:微服务是基于分而治之的思想演化出来的.过去传统的一个大型而又全面的系统,随着互联网的发展已经很难满足市场对技术的需求,于是我们从单独架构发展到分布式架构,又从分布式架构发展到 SOA 架构,服 ...

  3. Java微服务_医疗管理项目_基于若依快速开发框架

    一.项目简介 项目简介:尚医疗是专门为各大医院.门]诊提供的一款医疗管理平台.系统包含:系统 管理.药品进销存管理.看病就诊.收费管理.检查管理.数据统计等核心模块.通过尚医 疗系统可以快速方便的管理 ...

  4. 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目

    简介: 技术架构 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目,从项目中台架构技术选型.模块设计.基础设施的构建.分布式解决方 案.互联 ...

  5. nodejs 调用微服务器_无服务器NodeJS:构建下一个微服务的快速,廉价方法

    nodejs 调用微服务器 by Filipe Tavares 由Filipe Tavares 无服务器NodeJS:构建下一个微服务的快速,廉价方法 (Serverless NodeJS: the ...

  6. python计算各类型电影的评分_【Python数据科学实战项目】之 基于MovieLens的影评趋势分析|详解...

    原标题:[Python数据科学实战项目]之 基于MovieLens的影评趋势分析|详解 注:图片源于https://movielens.org/ 1. 项目任务 1.1 数据来源 本项目使用Group ...

  7. 微服务入门篇(二),万字长文带你实操作SpringCloudAlibaba微服务组件

    目录 SpringCloudAlibaba介绍 简介 为什么要学SpringCloudAlibaba 从Spring Cloud netflix 到 Spring Cloud Alibaba 功能组件 ...

  8. 微服务 前台调用后台的慢的原因_20年IT农民工分享SpringCloud微服务架构实战文档...

    前言 越来越多的企业使用 SpringCloud 实现微服务架构设计.我们可以看到这样一种现象:不管是全新开发,还是系统重构,大家似乎都在争先恐后地使用微服务.对于一个Java开发人员来说,学习微服务 ...

  9. 数据库中北大学第二章ppt总结和课后习题详解(小宇特详解)

    数据库中北大学第二章ppt总结和课后习题详解(小宇特详解) 第2章 数据模型与系统结构 2.1 数据模型的基本概念 现实世界--具体事物->信息世界--概念模型->机器世界--DBMS支持 ...

最新文章

  1. Android Stadio 导入Android 源码不停index
  2. cuda-convnet2与caffe对比
  3. Android爬坑之旅之WebView
  4. data后缀文件解码_WMA文件格式和解码流程 | 学步园
  5. .NET不用代码生成器自己写一个生成Code的DLL 自动动态生成三层架构(一)概况...
  6. 使用JUnit和Repeat注​​释编写有效的负载测试
  7. 为什么赚不到90后00后的钱?
  8. Adapter 模式
  9. codeblock的下载
  10. word参考文献的引用
  11. 如何在网页title前面加logo
  12. 错题集 HDLBits Exams/ece241 2013 q7 JK触发器
  13. 解答,修正(JAVA+=运算程序诡异事件 )
  14. iphone手机如何修改Apple ID密码
  15. Hypermesh二次开发系列003
  16. 咱们玩家最幽默(关于《无极》)
  17. VMware Workstation 中安装CentOS-7-x84_64-DVD-1708.iso
  18. 人工智能定义的 IT 基础设施浅析
  19. 青春三宝:书籍、时间和健康
  20. 【愚公系列】2021年12月 Redis数据库-主从的搭建

热门文章

  1. git PHP commit 规范,git commit 时自动对所有 php 文件执行语法错误检查
  2. 51nod1812树的双直径(换根树DP)
  3. js 获取相同name元素的属性值
  4. 数据结构之红黑树(三)——删除操作
  5. [转]Android应用的自动更新
  6. spring 使用小记
  7. 网址路由Routing组件如何在mvc中生成网址
  8. 《C程序设计语言》 第三章 控制流
  9. 为防盗装自动门 不想也会影响生活
  10. java中打开特定编码的文本_指定编码写入和读取文件内容