微服务整合Seata1.5.2+Nacos2.2.1+SpringBoot

在这里插入图片描述

文章目录

  • 一、Seata Server端
    • 1、下载seata server
    • 2、客户端配置-application.yml
    • 3、初始Mysql数据库
    • 4、导入初始配置到nacos
    • 5、启动测试
  • 二、Seata Client端搭建
    • 1、为示例业务创建表
    • 2、业务代码集成 Seata

本文以seata-server-1.5.2,以配置中心、注册中心使用Nacos,store.mode=db(mysql)为例进行操作。
Seata简介及入门参看:SpringCloud入门实战(十五)分布式事务框架Seata简介

一、Seata Server端

1、下载seata server

链接: http://seata.io/zh-cn/blog/download.html下载压缩包,解压至非中文目录。

本文版本环境:
Spring Cloud Alibaba 2021.0.4.0
Spring Boot 2.6.11
Nacos 2.2.1
Seata1.5.2

下载版本参考之前我们提到的:SpringBoot、SpringCloud、Spring Cloud Alibaba版本对照表(详细准确)选择适合自己环境的版本。

在这里插入图片描述
解压后可以发现原来的conf/registry.conf配置文件没有了,可直接修改application.yml进行配置。

2、客户端配置-application.yml

配置application.yml(低版本的是file.conf+registry.conf文件),主要配置config:配置中心部分及registry:注册中心部分。

server:port: 7091spring:application:name: seata-server
# 日志配置
logging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seata# 不外接日志,故如下配置可暂不考虑extend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstash
# 新增加的console控制台,
# 可通过访问http://localhost:7091进行登录,账号如下seata/seata
console:user:username: seatapassword: seataseata:# Seata接入Nacos配置中心config:# support: file, nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: 127.0.0.1:8848namespace: 891d7906-dd03-4b8c-9fe9-a1f0609b3189group: SEATA_GROUPusername: nacospassword: nacos##if use MSE Nacos with auth, mutex with username/password attribute#access-key: ""#secret-key: ""# Seata接入Nacos服务注册中心registry:# support: file, nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace: 891d7906-dd03-4b8c-9fe9-a1f0609b3189cluster: defaultusername: nacospassword: nacos##if use MSE Nacos with auth, mutex with username/password attribute#access-key: ""#secret-key: ""# 此处可不必配置,由于接入了nacos配置,以下store相关配置可直接通过seataServer.properties进行配置# store:# support: file 、 db 、 redis# mode: db
#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

Tip:seata 版本客户端和服务端最好还保持一样

3、初始Mysql数据库

新建seata库->执行mysql.sql初始化脚本->【Seata 1.5版本mysql脚本】压缩包目录seata/script/db/mysql.sql

在这里插入图片描述

4、导入初始配置到nacos

1)先任意模式启动nacos,不清楚的参看:nacos安装运行,本文使用单机模式运行nacos。

moon@moondeiMac  ~  %  cd /Users/moon/Downloads/nacos-2.2.1/distribution/target/nacos-server-2.2.1/nacos/bin
moon@moondeiMac bin % sh startup.sh -m standalone

2)新建一个namespace用于本地开发使用eg:dev

在这里插入图片描述

3)修改压缩包目录seata/script/config-center/config.txt文件中几处内容:

# 存储模式
store.mode=dbstore.db.datasource=druid
store.db.dbType=mysql
# 需要根据mysql的版本调整driverClassName
# mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
# mysql8以下版本的driver:com.mysql.jdbc.Driver
store.db.driverClassName=com.mysql.jdbc.Driver
# 注意根据生产实际情况调整参数host和port
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
# 数据库用户名密码
store.db.user=root
store.db.password=12345678
# 微服务里配置与这里一致
service.vgroupMapping.dev_tx_group=default

特别说明下📢:
配置事务分组service.vgroupMapping.dev_tx_group=default
dev_tx_group:需要与客户端保持一致 ,可以自定义
default:需要跟客户端和application.yml中的cluster保持一致
default 必须要等于 registry.conf cluster = “default”

4)官方推荐通过压缩包目录seatascript/config-center/nacos/nacos-config.sh将修改后的config.txt发布到nacos上

# 运行指令 ,通过 Git Bash Here
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 891d7906-dd03-4b8c-9fe9-a1f0609b3189# 具体说明参见:http://seata.io/zh-cn/docs/user/configurations.html
# -h: nacos host,默认localhost
# -p: nacos端口,默认8848
# -g: nacos分组,默认'SEATA_GROUP'.
# -t: 租户信息Tenant information,对应nacos namespace ID,默认''
# -u: nacos用户名,默认''
# -w: nacos用户密码,默认''

5)导入结果:

namespace: dev
group: SEATA_GROUP
配置项变成了N个,每项都可单独修改。

在这里插入图片描述

5、启动测试

进入seata/bin 目录下,执行命令:

sh seata-server.sh 

可以看到seata-server成功注入nacos,至此Seata Server端处理完毕。
在这里插入图片描述

二、Seata Client端搭建

1、为示例业务创建表

以用户购买商品的业务逻辑为例搭建微服务系统:
仓储服务(Stock):对给定的商品扣除仓储数量。
订单服务(Order):根据采购需求创建订单。
账户服务(Account):从用户账户中扣除余额。
在这里插入图片描述
三个独立的应用,分别使用三个独立的数据源。

为示例业务创建库、表,及每个库增加undo_log表,执行脚本
在这里插入图片描述

注意📢:每个业务数据库都要有UNDO_LOG

在这里插入图片描述

2、业务代码集成 Seata

源码:项目源码

在这里插入图片描述

1)父pom引入依赖:

 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.4</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.4.0</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.6.11</version><type>pom</type><scope>import</scope></dependency>

2)子pom引入依赖:

 <!-- seata -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency><!--seata starter -->
<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId>
</dependency><!--nacos discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--nacos config -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--openfeign -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>3.1.3</version></dependency>

3)yml文件,其他两个类似:

server:port: 2001spring:application:name: seata-order-servicecloud:nacos:discovery:# 服务分组group: SEATA_GROUPserver-addr: http://localhost:8848# 必须填命名空间的IDnamespace: 891d7906-dd03-4b8c-9fe9-a1f0609b3189datasource:type: com.alibaba.druid.pool.DruidDataSource  #当前数据源操作类型driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/seata_order?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false #useSSL安全加固username: rootpassword: 12345678# MyBatis Plus配置
mybatis-plus:# 配置mapper的扫描,找到所有的mapper.xml映射文件mapper-locations: classpath*:mapper/**/*.xml#实体扫描,多个package用逗号或者分号分隔typeAliasesPackage: com.qytest.springcloud.entititesglobal-config:db-config:id-type: autoconfiguration:# 开启驼峰,开启后,只要数据库字段和对象属性名字母相同,无论中间加多少下划线都可以识别map-underscore-to-camel-case: true# Seata 配置
seata:application-id: seata-server# 是否启用数据源bean的自动代理enable-auto-data-source-proxy: falsetx-service-group: dev_tx_group  # 必须和服务器配置一样registry:type: nacosnacos:# Nacos 服务地址server-addr: http://localhost:8848group: SEATA_GROUPnamespace: 891d7906-dd03-4b8c-9fe9-a1f0609b3189application: seata-server # 必须和服务器配置一样username: nacospassword: nacoscluster: defaultconfig:type: nacosnacos:server-addr: ${spring.cloud.nacos.discovery.server-addr}group: SEATA_GROUPnamespace: 891d7906-dd03-4b8c-9fe9-a1f0609b3189service:vgroup-mapping:tx-service-group: dev_tx_group # 必须和服务器配置一样disable-global-transaction: falseclient:rm:# 是否上报成功状态report-success-enable: true# 重试次数report-retry-count: 5

4)编写业务测试类

order通过feign接口调用库存及账户系统接口

@RestController
@RequestMapping("")
@Slf4j
public class OrderController {@Resourceprivate OrderService orderService;@GetMapping("/order/create")public CommonResult<Order> create(Order order) {orderService.create(order);return new CommonResult<Order>(200, "订单创建成功", order);}}public interface OrderService extends IService<Order> {void create(Order order);
}@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {@Resourceprivate StorageService storageService;@Resourceprivate AccountService accountService;/*** 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态* 简单说:下订单->扣库存->减余额->改状态*/@Overridepublic void create(Order order) {//1 新建订单log.info("----->开始新建订单");baseMapper.create(order);log.info("----->新建订单完成");//2 扣减库存log.info("----->订单微服务开始调用库存,做扣减Count");storageService.decrease(order.getProductId(), order.getCount());log.info("----->库存扣减Count完成");//3 扣减账户log.info("----->订单微服务开始调用账户,做扣减Money");accountService.decrease(order.getUserId(), order.getMoney());log.info("----->账户扣减Money完成");//4 修改订单状态,从0到1,1代表已经完成log.info("----->修改订单状态开始");baseMapper.update(order.getUserId(),0);log.info("----->修改订单状态结束");log.info("----->下订单结束了,O(∩_∩)O哈哈~");}
}

更多内容,可查看源码

5)启动测试

# 先单机模式启动nacos
moon@moondeiMac  ~  %  cd /Users/moon/Downloads/nacos-2.2.1/distribution/target/nacos-server-2.2.1/nacos/bin
moon@moondeiMac bin % sh startup.sh -m standalone# 再启动seata
moon@moondeiMac  ~  %  cd /Users/moon/Downloads/seata/bin
moon@moondeiMac bin % sh seata-server.sh 

分别访问:http://localhost:8848/nacos、http://localhost:7091/确认下nacos和seata启动无误。

然后依次启动seata-account-service、seata-storage-service、seata-order-service

在这里插入图片描述

请求接口,模拟正常下单:http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100

运行结果:
在这里插入图片描述

在这里插入图片描述

3、常见问题

1)can not get cluster name in registry config ‘service.vgroupMapping.xx‘, please make sure registry问题解决;
核对项目中和配置文件是否一致:
在这里插入图片描述
2)ERROR — [cos.client.naming.updater] c.a.nacos.client.security.SecurityProxy : [SecurityProxy] login http request failed url: http://127.0.0.1:8848/nacos/v1/auth/users/login, params: {username=nacos}, bodyMap: {password=nacos}, errorMsg: Server returned HTTP response code: 500 for URL: http://127.0.0.1:8848/nacos/v1/auth/users/login?username=nacos

大体上是版本问题,参考文章开头,更换组件版本。

注意以下几点:
Seata相关配置是否正确
Seata Server是否正常启动,并可以被访问
Seata Client是否正确配置,并与Seata Server保持连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度王海峰披露飞桨生态最新成果 开发者数量已达800万

目录 前言文心大模型原生插件机制文心大模型超级助手飞桨开发者数已达800万 模型数超80万星河社区最后 前言 8月16日&#xff0c;由深度学习技术及应用国家工程研究中心举办的WAVE SUMMIT深度学习开发者大会上&#xff0c;位于北京举行。百度的首席技术官兼深度学习技术及应用…

德国金融监管机构网站遭遇大规模DDoS攻击后“瘫痪”

德国波恩的BaFin大楼 BaFin是负责监督和监管德国金融机构和市场的金融监管机构&#xff0c;其职责是确保德国金融体系的稳定性、完整性和透明度。 此外&#xff0c;BaFin 的网站还为企业和消费者提供银行、贷款和财产融资等方面的信息。它还提供消费者帮助热线和举报人信息共…

Java从入门到精通-流程控制(二)

习题讲解&#xff1a; 上次我们给大家留了一些流程控制的问题&#xff0c;这次给大家分析讲解一下&#xff1a; 条件语句练习&#xff1a; 1.编写Java程序&#xff0c;用于接受用户输入的数字&#xff0c;然后判断它是偶数还是奇数&#xff0c;并输出相应的消息。 import ja…

记录使用layui弹窗实现签名、签字

一、前言 本来项目使用的是OCX方式做签字的&#xff0c;因为项目需要转到国产化&#xff0c;不在支持OCX方式&#xff0c;需要使用前端进行签字操作 注&#xff1a;有啥问题看看文档&#xff0c;或者换着思路来&#xff0c;本文仅供参考&#xff01; 二、使用组件 获取jSign…

九章云极DataCanvas公司参与大模型重点项目合作签约,建设产业集聚区

9月3日&#xff0c;2023中国国际服务贸易交易会石景山国际开放合作论坛在石景山首钢园成功举办&#xff0c;北京市委常委、常务副市长夏林茂&#xff0c;商务部服务贸易和商贸服务业司司长王东堂&#xff0c;北京市石景山区委书记常卫出席论坛并致辞。论坛期间正式举行“石景山…

java8 新特性

1、lambda表达式 Lambda 是一个 匿名函数&#xff0c;我们可以把 Lambda 表达式理解为是 一段可以传递的代码&#xff08;将代码像数据一样进行传递&#xff09;。使用它可以写出更简洁、更灵活的代码。 &#xff08;1&#xff09;语法 Lambda 表达式&#xff1a;在Java 8 语…

STM32WB55开发(1)----套件概述

STM32WB55开发----1.套件概述 所用器件视频教学样品申请优势支持协议系统控制和生态系统访问功能示意图系统框图跳线设置开发板原理图 所用器件 所使用的器件是我们自行设计的开发板&#xff0c;该开发板是基于 STM32WB55 系列微控制器所构建。STM32WBXX_VFQFPN68 不仅是一款评…

【MyBatis篇】MyBatis框架基础知识笔记

目录 ORM思想&#xff08;对象关系映射思想&#xff09; 初识MyBatis 什么是MyBatis呢&#xff1f; JDBC VS MyBatis代码 获取数据库连接对比 对表格查询操作&#xff1a; JDBC弊端 MyBatis&#xff0c;JDBC对比 MyBatis进一步介绍以及本质分析 JDBC编程的劣势&…

VectorDraw Developer Framework 10.1004 Crack

VectorDraw 开发人员框架 (VDF) 是一个图形引擎库&#xff0c;开发人员可以使用它来可视化其应用程序。通过提供的功能&#xff0c;我们的客户可以轻松创建、编辑、管理、导出、导入和打印 2D 和 3D 绘图 - 图形文件。VDF 使用的强大格式称为 VDML&#xff08;以及与 VDML 相同…

ssprompt:一个LLM Prompt分发管理工具

阅读顺序 &#x1f31f;前言&#x1f514;ssprompt介绍命令介绍Metafile介绍版本依赖规则 &#x1f30a; PromptHubGitHub Token &#x1f680; Quick Install系统依赖pip安装Linux, macOS, Windows (WSL)Windows (Powershell) &#x1f6a9; Roadmap&#x1f30f; 项目交流讨论…

12.redis 持久化

redis 持久化 redis 持久化redis持久化策略RDB > Redis DataBase 定期备份rdb 文件处理rdb 优缺点 AOF > Append Only File 实时备份AOF 工作流程AOF 缓冲区刷新策略AOF 重写机制AOF 重写流程 混合持久化持久化流程总结 redis 持久化 redis 是一个内存数据库&#xff0c…

【大数据模型】让chatgpt为开发增速(开发专用提示词)

汝之观览&#xff0c;吾之幸也&#xff01;本文主要聊聊怎样才能更好的使用提示词&#xff0c;给开发提速&#xff0c;大大缩减我们的开发时间&#xff0c;比如在开发中使用生成表结构脚本的提示词&#xff0c;生成代码的提示词等等。 一、准备 本文主要根据Claude进行演示&am…

【产线故障】线上接口请求过慢如何排查?

文章目录 前言一、内存使用过高导致CPU满载案例代码分析思路 二、出现了类似死循环导致cpu负载案例代码分析思路 三、死锁案例代码分析思路 前言 首先线上接口变慢&#xff0c;原因可能有很多&#xff0c;有可能是网络&#xff0c;有可能是慢 SQL&#xff0c;有可能是服务本身…

【Linux】- 一文秒懂shell编程

shell编程 1.1 Shell 是什么1.2 Shell 脚本的执行方式1.3 编写第一个 Shell 脚本2.1 Shell 的变量2.2 shell 变量的定义2.3 设置环境变量3.1 位置参数变量3.2 预定义变量4.1 运算符4.2 条件判断5.1 流程控制5.2 case 语句5.3 for 循环5.4 while 循环5.5 read基本语法6.1函数6.2…

Nginx 本地部署服务

nginx 部署服务 一、下载二、解压三、文件替换四、浏览器中输入五、离线部署瓦片服务 一、下载 可以到官网下载&#xff0c;官方网址&#xff1a;https://nginx.org/也可以用我发的包 二、解压 三、文件替换 解压打开后文件&#xff0c;双击 nginx.exe 浏览器输入 localhost…

springboot之一:配置文件(内外部配置优先顺序+properties、xml、yaml基础语法+profile动态切换配置、激活方式)

配置的概念&#xff1a; Spring Boot是基于约定的&#xff0c;所以很多配置都有默认值&#xff0c;但如果想使用自己的配置替换默认配置的话&#xff0c;就可以使用application.properties或者application.yml(application.yaml)进行配置。 注意配置文件的命名必须是applicat…

【LeetCode每日一题合集】2023.8.28-2023.9.3(到家的最少跳跃次数)

文章目录 57. 插入区间823. 带因子的二叉树解法——递推 1654. 到家的最少跳跃次数(BFS&#xff0c;&#x1f6b9;最远距离上界的证明)1761. 一个图中连通三元组的最小度数2240. 买钢笔和铅笔的方案数解法1——完全背包解法2——枚举买了几支钢笔&#xff08;推荐解法&#xff…

LGFormer:LOCAL TO GLOBAL TRANSFORMER FOR VIDEO BASED 3D HUMAN POSE ESTIMATION

基于视频的三维人体姿态估计的局部到全局Transformer 作者&#xff1a;马海峰 *&#xff0c;陆克 * †&#xff0c;薛健 *&#xff0c;牛泽海 *&#xff0c;高鹏程† * 中国科学院大学工程学院&#xff0c;北京100049 鹏程实验室&#xff0c;深圳518055 来源&#xff1a;202…

这可能是最全面的Python入门手册了!

无论是学习任何一门语言&#xff0c;基础知识一定要扎实&#xff0c;基础功非常的重要&#xff0c;找到一个合适的学习方法和资料会让你少走很多弯路&#xff0c; 你的进步速度也会快很多&#xff0c;无论我们学习的目的是什么&#xff0c;不得不说Python真的是一门值得付出时间…