- 学习项目:https://github.com/14251104246/spring-cloud-rest-tcc
- 下载源码,进入源码目录运行:
mvn clean package
- Docker Compose运行
docker-compose -f infrastructure-compose.yml up -d
docker-compose -f basic-ms-compose.yml up -d
docker-compose -f monitor-ms-compose.yml up -d
docker-compose -f business-ms-compose.yml up -d
全部运行后发现内存不够(电脑没超过16g内存的就可以放弃了)- 只用docker-compose运行前两个,剩下选择性通过源码启动
- 发现mysql没启动成功,改用本地mysql
- 本地数据库执行如下脚本
CREATE USER 'chris' IDENTIFIED BY '123123'; CREATE SCHEMA IF NOT EXISTS `account` DEFAULT CHARACTER SET utf8; CREATE SCHEMA IF NOT EXISTS `product` DEFAULT CHARACTER SET utf8; CREATE SCHEMA IF NOT EXISTS `order` DEFAULT CHARACTER SET utf8; CREATE SCHEMA IF NOT EXISTS `membership` DEFAULT CHARACTER SET utf8; GRANT ALL ON `account`.* TO 'chris'; GRANT ALL ON `product`.* TO 'chris'; GRANT ALL ON `order`.* TO 'chris'; GRANT ALL ON `membership`.* TO 'chris';
- 首先添加host
## solar
127.0.0.1 eureka1
127.0.0.1 eureka2
127.0.0.1 rabbitmq
127.0.0.1 zipkin_server
127.0.0.1 solar_mysql
127.0.0.1 gitlab
- 进入源码启动
ZipkinMsApplication
- 进入源码启动
OrderMsApplication
发现控制台只输出banner
,且没注册到eureka
修改spring cloud配置中心的eureka配置(已上传到示例项目)关闭加密(已上传到示例项目)
- 进入源码启动
- 进入源码启动
- 打开订单服务的swagger测试api
深入了解
- 示例项目中子项目间依赖(使用网关的情况):
image.png
-
Try Confirm Cancel 补偿模式在示例项目中的应用
- RESTful TCC模式分3个阶段执行
graph LR try阶段-->Confirm阶段 Confirm阶段-->Cancel阶段-失败时才有
- 示例项目中的RESTful TCC模式
- 由
order
订单对account
和product
发起尝试,再向tcc
协调器发起确认; -
tcc
协调器对account
和product
进行确认 - 如果失败则进入
cancel
阶段
- 由
- 示例项目中的RESTful TCC模式图例
image.png
- 示例项目整体架构
image.png
各服务解析
首次启动时通过Flyway自动初始化数据库。
对spring cloud config server采用fail fast策略,一旦远程配置服务无法连接则无法启动业务服务。
account
用于获取用户信息,用户注册,修改用户余额,预留余额资源,确认预留余额,撤销预留余额。
product
用于获取产品信息,变更商品库存,预留库存资源,确认预留库存,撤销预留库存。
tcc coordinator
TCC资源协调器,其职责如下:
- 对所有参与者发起Confirm请求。
- 无论是协调器发生的错误还是调用参与者所产生的错误,协调器都必须有自动恢复重试功能,尤其是在确认的阶段,以防止网络抖动的情况。
order
order
服务是本项目的入口,尽管所提供的功能很简单:
- 下单. 即生成预订单,为了更好地测试TCC功能,在下单时就通过Feign向服务
account
与product
发起预留资源请求,并且记录入库。 - 确认订单. 确认订单时根据订单ID从库中获取订单,并获取预留资源确认的URI,交由服务
tcc
统一进行确认,如果发生冲突即记录入库,等待人工处理。
网友评论