SpringCloud系列之Nacos+Dubbo+Seata应用篇
SpringCloud系列之Nacos+Dubbo+Seata应用篇
原文链接:https://www.cnblogs.com/chinaWu/p/13671620.html
---------- 源码下载 -------------
下载地址:https://z701.com/f/14896800-487860952-3f3d3c
提取码:9077
下载地址:https://pan.baidu.com/s/1IJJRol-Z5qx-VqpPXqQp5Q
提取码:goun
目录
- 前言
- 项目版本
- 项目说明
- Nacos服务
- Seata服务
- 订单模块
- 支付模块
- 参考资料
- 系列文章
前言
本文接上篇文章《SpringCloud系列之Nacos+Dubbo应用篇》继续展开,本次在原先集成Nacos和Dubbo基础上增加分布式事务Seata组件,之前在《SpringCloud系列之集成分布式事务Seata应用篇》中也提及到Seata的集成,只不过原先Seata使用都是基于“file”展开,在本篇中将介绍如何基于nacos进行配置以及Dubbo和Seata的集成验证。
项目版本
spring-boot.version:2.2.5.RELEASE
spring-cloud.version:Hoxton.SR3
nacos.version:1.3.2
dubbo.version:2.6.9/2.7.6
seata.version:1.3.0
关注本文末尾微信公众号,回复“666”获取常用开发工具包,内含常用开发组件(Nacos,Seata等),节省翻墙下载时间。
项目说明
项目模块说明如下:
前端请求接口请求cloud-web模块保留接口,从而调用相应业务微服务模块,执行业务逻辑后响应前端请求。
支付模块对外提供Dubbo服务,其余服务采用Feign进行通讯,用户模块示例中未涉及相关业务调用。
Dubbo 2.6.x 和 Dubbo 2.7.x 除了依赖不一样,其余配置项基本一样,这边就不再单独进行区分说明,详情请查阅本文文末项目源码,有进行区分说明。
Nacos服务
Nacos服务端部署请查阅《SpringCloud系列之Nacos应用篇》
Seata服务
进入Seata配置目录下,编辑registry.conf配置文件,将registry配置项中type配置项配置成"nacos",并配置nacos相关配置,具体如下
registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {application = "seata-server"serverAddr = "127.0.0.1:8848"group = "SEATA_GROUP"namespace = "public"cluster = "default"username = ""password = ""}
}
配置完registry配置项后将config配置项也配置成“nacos”,具体如下
config {# file、nacos 、apollo、zk、consul、etcd3type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = "public"group = "SEATA_GROUP"username = ""password = ""}
}
调整完后启动Seata服务即可在Nacos后台看到已注册的服务,如下图
订单模块
其余模块本次未进行任何调整,只在订单模块中增加Dubbo相关配置
部分pom.xml如下,完整信息请查阅本文文末项目源码
pom.xml
<!--nacos discovery--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><!--nacos config--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><exclusions><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><!--dubbo--><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.1.RELEASE</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.9</version></dependency><!--dubbo nacos--><dependency><groupId>com.alibaba</groupId><artifactId>dubbo-registry-nacos</artifactId><version>2.6.7</version><exclusions><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><!--nacos--><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>1.3.2</version></dependency><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.31.Final</version></dependency><!-- seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-seata</artifactId><version>2.2.0.RELEASE</version><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.3.0</version></dependency>
application.properties
dubbo.application.name=order-service
# dubbo扫描包路径
dubbo.scan.base-packages=com.chinawu.cloud.order.service
# dubbo协议
dubbo.protocol.name=dubbo
# 随机端口
dubbo.protocol.port=-1
# zookeeper地址
dubbo.registry.address=nacos://127.0.0.1:8848spring.main.allow-bean-definition-overriding=true
OrderService.java
@RestController
public class OrderService implements OrderFacade {@Autowiredprivate TbOrderMapper tbOrderMapper;@Autowiredprivate CartFacade cartFacade;@Autowiredprivate GoodsFacade goodsFacade;@Autowiredprivate WalletFacade walletFacade;// Dubbo服务消费@Reference(check = false)DPayFacade dPayFacade;/*** <p >* 功能:新增订单* </p>* @param cartId 购物车ID* @author wuyubin* @date 2020年05月22日* @return*/@Overridepublic void addOrder(Long cartId) {CartDTO cart = cartFacade.getCartById(cartId);TbOrder order = new TbOrder();order.setUserId(cart.getUserId());order.setGoodsId(cart.getGoodsId());order.setOrderNo(String.valueOf(System.currentTimeMillis()));order.setCreateTime(System.currentTimeMillis());order.setUpdateTime(order.getCreateTime());order.setIsDeleted(Byte.valueOf("0"));// 新增订单tbOrderMapper.insert(order);// 删除购物车(Feign)cartFacade.deleteCartById(cartId);GoodsDTO goods = goodsFacade.getByGoodsId(cart.getGoodsId());// 扣减库存(Feign)goodsFacade.substractStock(goods.getId());// 扣减金额(Feign)walletFacade.substractMoney(cart.getUserId(),goods.getMoney());// 记录支付消息(Dubbo调用)dPayFacade.goToPay("wuyubin");throw new RuntimeException();}
}
新增引用支付模块Dubbo服务,dPayFacade.goToPay("wuyubin");
支付模块
支付模块在原先基础上增加Seata依赖,部分pom信息如下
pom.xml
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-seata</artifactId><version>2.2.0.RELEASE</version><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.3.0</version></dependency>
application.properties
# seata配置
seata.enabled=true
#seata.excludes-for-auto-proxying=firstClassNameForExclude,secondClassNameForExclude
seata.application-id=pay-service
# 事务分组名
seata.tx-service-group=pay-service_tx_group
# 默认开启数据源自动代理
seata.enable-auto-data-source-proxy=true
seata.use-jdk-proxy=falseseata.config.type=nacos
seata.registry.type=nacos
seata.registry.nacos.server-addr=127.0.0.1:8848
DPayService.java
@Service
public class DPayService implements DPayFacade {@AutowiredTbPayMapper tbPayMapper;@Overridepublic String goToPay(String userName) {String xid = RootContext.getXID();System.out.println("pay.seata.xid:"+xid);System.out.println("dubbo.method:goToPay request "+userName);TbPay pay = new TbPay();pay.setMoney(new BigDecimal("5"));pay.setStatus(Byte.valueOf("1"));tbPayMapper.insert(pay);return "dubbo.method:goToPay result:" + userName + " pay success";}
}
调整完启动支付模块后,启动过程中发现一行报错日志,信息如下
no available service 'null' found, please make sure registry config correct
其余正常,但心里还是有点担忧,其他服务模块启动后试一下再说
http://localhost:9100/order/add?cartId=1
请求后果然在支付模块报如下错误
Caused by: io.seata.core.exception.RmTransactionException: Runtime
Caused by: io.seata.common.exception.FrameworkException: No available service
看信息应该是缺少服务,后来经过一点点排查后,最终确认是这一行配置项导致,将
seata.config.type=nacos调整至file时并把这行配置项打开即可(用nacos时其余seata配置项都注释掉了)
seata.service.vgroup-mapping.pay-service_tx_group=default
先了解下该行配置项主要作用,原来是靠此配置项用于查询TC服务的。
那是不是只要添加这行配置就可以了呢,重新将seata配置信息调整至“nacos”,根据命名规则尝试创建以下配置项
配置创建成功后,在支付模块后台立马看到有日志输出
2020-09-14 15:58:43.284 ERROR 28292 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : no available service 'null' found, please make sure registry config correct
2020-09-14 15:58:53.252 ERROR 28292 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : no available service 'null' found, please make sure registry config correct
2020-09-14 15:58:53.285 ERROR 28292 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : no available service 'null' found, please make sure registry config correct
2020-09-14 15:59:02.853 INFO 28292 --- [-localhost_8848] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848] [polling-resp] config changed. dataId=service.vgroupMapping.pay-service_tx_group, group=SEATA_GROUP
2020-09-14 15:59:02.853 INFO 28292 --- [-localhost_8848] c.a.n.client.config.impl.ClientWorker : get changedGroupKeys:[service.vgroupMapping.pay-service_tx_group+SEATA_GROUP]
2020-09-14 15:59:02.857 INFO 28292 --- [-localhost_8848] c.a.n.client.config.impl.ClientWorker : [fixed-localhost_8848] [data-received] dataId=service.vgroupMapping.pay-service_tx_group, group=SEATA_GROUP, tenant=null, md5=c21f969b5f03d33d43e04f8f136e7682, content=default, type=text
2020-09-14 15:59:02.857 INFO 28292 --- [-localhost_8848] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848] [notify-context] dataId=service.vgroupMapping.pay-service_tx_group, group=SEATA_GROUP, md5=c21f969b5f03d33d43e04f8f136e7682
2020-09-14 15:59:02.858 INFO 28292 --- [-localhost_8848] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848] [notify-ok] dataId=service.vgroupMapping.pay-service_tx_group, group=SEATA_GROUP, md5=c21f969b5f03d33d43e04f8f136e7682, listener=io.seata.config.nacos.NacosConfiguration$NacosListener@37dd83b6
2020-09-14 15:59:02.858 INFO 28292 --- [-localhost_8848] c.a.nacos.client.config.impl.CacheData : [fixed-localhost_8848] [notify-listener] time cost=1ms in ClientWorker, dataId=service.vgroupMapping.pay-service_tx_group, group=SEATA_GROUP, md5=c21f969b5f03d33d43e04f8f136e7682, listener=io.seata.config.nacos.NacosConfiguration$NacosListener@37dd83b6
2020-09-14 15:59:03.253 INFO 28292 --- [eoutChecker_1_1] com.alibaba.nacos.client.naming : new ips(1) service: SEATA_GROUP@@seata-server@@default -> [{"instanceId":"192.168.2.241#8091#default#SEATA_GROUP@@seata-server","ip":"192.168.2.241","port":8091,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"default","serviceName":"SEATA_GROUP@@seata-server","metadata":{},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceIdGenerator":"simple","instanceHeartBeatTimeOut":15000}]
2020-09-14 15:59:03.254 INFO 28292 --- [eoutChecker_1_1] com.alibaba.nacos.client.naming : current ips:(1) service: SEATA_GROUP@@seata-server@@default -> [{"instanceId":"192.168.2.241#8091#default#SEATA_GROUP@@seata-server","ip":"192.168.2.241","port":8091,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"default","serviceName":"SEATA_GROUP@@seata-server","metadata":{},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceIdGenerator":"simple","instanceHeartBeatTimeOut":15000}]
2020-09-14 15:59:03.254 INFO 28292 --- [eoutChecker_1_1] com.alibaba.nacos.client.naming : [LISTENER] adding SEATA_GROUP@@seata-server with default to listener map
2020-09-14 15:59:03.256 INFO 28292 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.2.241:8091
2020-09-14 15:59:03.258 INFO 28292 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:TMROLE,address:192.168.2.241:8091,msg:< RegisterTMRequest{applicationId='pay-service', transactionServiceGroup='pay-service_tx_group'} >
2020-09-14 15:59:03.281 INFO 28292 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.2.241:8091
2020-09-14 15:59:03.281 INFO 28292 --- [eoutChecker_2_1] i.s.c.rpc.netty.RmNettyRemotingClient : RM will register :jdbc:mysql://127.0.0.1:3306/spring-cloud
2020-09-14 15:59:03.283 INFO 28292 --- [eoutChecker_2_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:RMROLE,address:192.168.2.241:8091,msg:< RegisterRMRequest{resourceIds='jdbc:mysql://127.0.0.1:3306/spring-cloud', applicationId='pay-service', transactionServiceGroup='pay-service_tx_group'} >
2020-09-14 15:59:03.305 INFO 28292 --- [eoutChecker_2_1] i.s.c.rpc.netty.RmNettyRemotingClient : register RM success. client version:1.3.0, server version:1.3.0,channel:[id: 0x15ef339d, L:/192.168.2.241:64550 - R:/192.168.2.241:8091]
2020-09-14 15:59:03.305 INFO 28292 --- [eoutChecker_1_1] i.s.c.rpc.netty.TmNettyRemotingClient : register TM success. client version:1.3.0, server version:1.3.0,channel:[id: 0xd4e407be, L:/192.168.2.241:64548 - R:/192.168.2.241:8091]
2020-09-14 15:59:03.313 INFO 28292 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 39 ms, version:1.3.0,role:TMROLE,channel:[id: 0xd4e407be, L:/192.168.2.241:64548 - R:/192.168.2.241:8091]
2020-09-14 15:59:03.313 INFO 28292 --- [eoutChecker_2_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 26 ms, version:1.3.0,role:RMROLE,channel:[id: 0x15ef339d, L:/192.168.2.241:64550 - R:/192.168.2.241:8091]
感觉有戏,再次请求接口,果然不再报错,提示事务回滚成功,其余模块也提示回滚成功,另外数据也正常,至此就可以使用啦。
pay.seata.xid:192.168.2.241:8091:48803259719028736
dubbo.method:goToPay request wuyubin
2020-09-14 16:06:44.006 INFO 28292 --- [ch_RMROLE_1_1_8] i.s.c.r.p.c.RmBranchRollbackProcessor : rm handle branch rollback process:xid=192.168.2.241:8091:48803259719028736,branchId=48803260146847744,branchType=AT,resourceId=jdbc:mysql://127.0.0.1:3306/spring-cloud,applicationData=null
2020-09-14 16:06:44.010 INFO 28292 --- [ch_RMROLE_1_1_8] io.seata.rm.AbstractRMHandler : Branch Rollbacking: 192.168.2.241:8091:48803259719028736 48803260146847744 jdbc:mysql://127.0.0.1:3306/spring-cloud
2020-09-14 16:06:44.061 INFO 28292 --- [ch_RMROLE_1_1_8] i.s.r.d.undo.AbstractUndoLogManager : xid 192.168.2.241:8091:48803259719028736 branch 48803260146847744, undo_log deleted with GlobalFinished
2020-09-14 16:06:44.063 INFO 28292 --- [ch_RMROLE_1_1_8] io.seata.rm.AbstractRMHandler : Branch Rollbacked result: PhaseTwo_Rollbacked
参考资料
Seata事务分组专题
源码分析Seata-XID传递 Dubbo篇
系列文章
SpringCloud系列之配置中心(Config)使用说明
SpringCloud系列之服务注册发现(Eureka)应用篇
SpringCloud系列之网关(Gateway)应用篇
SpringCloud系列之集成Dubbo应用篇
SpringCloud系列之集成分布式事务Seata应用篇
SpringCloud系列之Nacos应用篇
SpringCloud系列之Nacos+Dubbo应用篇
项目源码
SpringCloud系列之Nacos+Dubbo+Seata应用篇相关推荐
- 08、SpringCloud 系列:Nacos - 安装、启动
SpringCloud 系列列表: 文章名 文章地址 01.Eureka - 集群.服务发现 https://blog.csdn.net/qq_46023503/article/details/128 ...
- springcloud gateway 使用nacos 动态过滤器 记一次线上网关升级cpu升高的问题
大家好,我是烤鸭: 网关升级,想使用 springcloud gateway nacos 动态过滤器配置(原来是硬编码的方式),升级之后出了一些问题(cpu升高,ygc频繁),记录一下. 关于 s ...
- SpringCloud(3)CloudAlibaba Nacos Sentinel Seata
SpringCloud系列: SpringCloud(1)基础 Eureka ZooKeeper Consul CAP SpringCloud(2)Ribbon OpenFeign Hystrix 服 ...
- 【SpringCloud环境搭建】SpringCloud环境搭建jdk、mysql、Nacos、Seata、redis、nginx
目录 前言 一.Jdk安装 1.查看是否自带或者已安装 2.下载并上传安装包 3.解压 4.配置环境变量 二.mysql安装(8.0.21) 1.下载安装包 2.上传&解压 3.安装 4.启动 ...
- SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证【Hoxton版】
阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Spring Cloud Hoxton RELEASE版本 由于knife4j比swagger更加友好,所以本文集成knife4 ...
- 学习笔记:SpringCloud 微服务技术栈_实用篇①_基础知识
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...
- Spring Cloud Alibaba系列四:集成 seata 实现分布式事务
文章目录 Spring Cloud Alibaba系列四:集成 seata 实现分布式事务 前言 Seata 是什么? Seata 术语 安装 seata 1.创建 seata 数据库,并添加对应的表 ...
- SpringCloud 微信小程序授权登录 获取openId SessionKey【SpringCloud系列13】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 自我提升方法推荐:神奇的早起 早上 5:00 -5:20 起床刷牙 5:30-6:00 晨练(跑步.跳绳.骑自行车.打球等等) ...
- SpringCloud Alibaba——精读Nacos+CMDB+核心源码阅读(7w字长篇)
文章目录 Nacos 1.介绍 2.使用场景 2.1.动态配置服务 2.2.服务发现及管理 2.2.1.服务注册 2.2.2.服务心跳 2.2.3.服务同步 2.2.4.服务发现 3.环境搭建 3.1 ...
最新文章
- 优达学城《DeepLearning》项目1:预测每日自行车租赁客流量
- mysql事务在提交后才发送给数据库执行_从一个线上问题分析binlog与内部XA事务提交过程...
- 前端学习(2931):vue里面的虚拟dom和算法
- 一步步编写操作系统 24 编写内核加载器
- Linux学习:第二章-Linux安装
- 电大1253c语言程序设计考试题,电大1253《C语言程序设计》开放大学期末考试试题2020年1月(含答案)...
- linux ps 显示不了中文,enscript转txt为ps文件时中文变成乱码
- docker安装rabbitmq及简单管理
- php 访问url curl,推荐PHP一个用CURL访问URL的函数
- PYthon常用模块 logging 日志
- andrew ng 机器学习笔记_所有笔记目录 | 数据分析 | 机器学习 | 深度学习等
- 转JMeter 利用Jmeter批量数据库插入数据
- 细嚼浏览器兼容----条件注释判断浏览器版本
- nodejs下载集成到idea
- Axure8.1破解码 注册码 授权码
- iOS SQLite 读书笔记
- hdu 4699 模拟栈
- OpenCV学习笔记_图像扭曲及旋转操作
- 【浅墨Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)
- PowerBI视觉对象共计271组,2021.01.20日更新
热门文章
- jmeter java性能_使用JMeter进行性能测试(Java请求)
- mqtt server python_Python使用mqtt极简例子
- 洛谷——P1320 压缩技术(续集版)
- ServletContext的应用(共享数据、获取初始化参数、请求转发、读取资源文件)【源码解析】
- 手机模板区块(HTML、CSS)
- 实验2-2-7 整数四则运算 (10 分)
- html2canvas在iphone7 iphonex都生成不了
- (node:62099) ExperimentalWarning: The fs.promises API is experimental
- Halcon 圆形标定板标定基本流程-标定助手操作
- Redis之-字符串类型