以实例说明微服务拆分(以SpringCloud+Gradle)
前言
之前,我都是说了很多的关于微服务的概念,说到底,很多人看了之后会认为没有什么意思,因为没有实际的东西说明,即使每个概念都明白了,也很难赋之实践。所以这次,我来用一个实际的例子去说明,在实际的项目过程中我们会如何去构建我们的微服务。
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、异步等等,抛砖引玉、抛砖引玉
后面就看你的了!
以实例说明微服务拆分(以SpringCloud+Gradle)的更多相关文章
- dubbo系列一、dubbo背景介绍、微服务拆分
一.背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 二.传统应用到分布式应用的演进过程 ...
- 一、微服务概述与SpringCloud
一.微服务概述与SpringCloud 1.微服务与微服务架构 微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题/提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面 ...
- 微服务Dubbo和SpringCloud架构设计、优劣势比较
本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...
- 微服务架构之SpringCloud
微服务架构之SpringCloud介绍 1.什么是微服务 2.SpringCloud架构 3.SpringCloud组件 4.微服务相关技术 Docker Jenkins
- 【微服务架构】SpringCloud组件和概念介绍(一)
一:什么是微服务(Microservice) 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及 ...
- 【微服务架构】SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
上篇文章讲解了SpringCloud组件和概念介绍,接下来讲解一下SpringCloud组件相关组件使用.原理和每个组件的作用的,它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix ...
- 微服务介绍和springCloud组件
微服务架构模式是:将整个web服务 组织成一系列小的web 服务,这些小的web服务可以进行独立的编译和部署,并通过各自暴露的API接口 进行相互通信,他们相互协作,作为一个整体,为客户提供服务功 ...
- 31.【微服务架构】SpringCloud之Feign(五)
Feign简介 Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Fei ...
- 微服务实战——微服务架构选型SpringCloud / Dubbo / K8S比较(一)
## 说在前面 大概是三年前,因一些原因公司原项目最初为单体结构部署,所有业务模块都在一个项目里面,而后随着业务的不断膨胀以及模块之间的耦合,导致后面增加或修改一些简单业务时的成本都会变的极大.新入职 ...
随机推荐
- 乞丐版JAVA扫雷
事先声明:本人是一位刚接触Java不久的菜鸟,所以代码写的略显臃肿,敬请谅解!这个扫雷是我在暑假时做的,灵感来源于csdn上某位大神的博客,不过我个人实在不喜欢他的代码实现,于是我自己写了一个实现上不 ...
- (转)Jquery获取上级、下级或者同级的元素
下面介绍JQUERY的父,子,兄弟节点查找方法 jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$(&qu ...
- 软件工程第三周的学习报告 html<input> final finally finalize 的比较 BigInteger
三月十三号下午: html的<input>的三个属性pattern(限定用户的输入格式)与placeholder(显示的)与required(不能为空) 代码案例: pattern与pla ...
- 关于HTTP以及TCP
HTTP协议 HTTP(HyperText Transport Protocol),中文译名为超文本传输协议,是一个基于TCP协议的网络协议,主要用于进行网页信息的传输. HTTP协议是在1960年由 ...
- ThreadLocal是否会导致内存泄露
什么是内存泄露? 维基百科的定义:[内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存],我的理解就是程序失去了对某段内存的控制,那么这段内存就算是泄露了. ThreadLocal为什么会导致 ...
- [.net 面向对象程序设计深入](36)Redis——基础
[.net 面向对象程序设计深入](36)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...
- easyui自定义皮肤及缺陷修改
引言: 一个商业项目的需要,又因为时间紧迫的关系,准备购买一套简洁,易用,可定制化强的UI,经过对国内外多家UI产品进行了对比, 包括:FineUI, EasyUI, EXT.NET, EXTJS, ...
- Dubbo 分布式事务一致性实现
我觉得事务的管理不应该属于Dubbo框架, Dubbo只需实现可被事务管理即可, 像JDBC和JMS都是可被事务管理的分布式资源, Dubbo只要实现相同的可被事务管理的行为,比如可以回滚, 其它事务 ...
- [Swift]LeetCode210. 课程表 II | Course Schedule II
There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...
- PHP文件域上传
PHP中使用文件域上传文件,需要几个步骤,首先先判断有无文件域,然后判断是否选择了文件,最后判断文件是否上传成功. 需要注意的是 表单中有文件域,必须将method设置为post, enctype设置 ...