Spring Cloud Alibaba使用Seata解决分布式事务全过程解析

Copyregistry {

file 、nacos 、eureka、redis、zk、consul、etcd3、sofa

使用nacos作为注册中心

type = “nacos”

nacos {

注册到nacos应用名称

application = “seata-server”

nacos ip

serverAddr = “127.0.0.1:8848”

所在分组

group = “EXAMPLE-GROUP”

所在命名空间

namespace = “7e3699fa-09eb-4d47-8967-60f6c98da94a”

所在集群

#cluster = “default”

username = “nacos”

password = “nacos”

}

eureka {

serviceUrl = “http://localhost:8761/eureka”

application = “default”

weight = “1”

}

redis {

serverAddr = “localhost:6379”

db = 0

password = “”

cluster = “default”

timeout = 0

}

zk {

cluster = “default”

serverAddr = “127.0.0.1:2181”

sessionTimeout = 6000

connectTimeout = 2000

username = “”

password = “”

}

consul {

cluster = “default”

serverAddr = “127.0.0.1:8500”

}

etcd3 {

cluster = “default”

serverAddr = “http://localhost:2379”

}

sofa {

serverAddr = “127.0.0.1:9603”

application = “default”

region = “DEFAULT_ZONE”

datacenter = “DefaultDataCenter”

cluster = “default”

group = “SEATA_GROUP”

addressWaitTime = “3000”

}

file {

name = “file.conf”

}

}

config {

file、nacos 、apollo、zk、consul、etcd3

使用nacos管理配置

type = “nacos”

nacos {

nacos ip

serverAddr = “127.0.0.1:8848”

所在命名空间

namespace = “7e3699fa-09eb-4d47-8967-60f6c98da94a”

所在分组

group = “EXAMPLE-GROUP”

username = “nacos”

password = “nacos”

}

consul {

serverAddr = “127.0.0.1:8500”

}

apollo {

appId = “seata-server”

apolloMeta = “http://192.168.1.204:8801”

namespace = “application”

}

zk {

serverAddr = “127.0.0.1:2181”

sessionTimeout = 6000

connectTimeout = 2000

username = “”

password = “”

}

etcd3 {

serverAddr = “http://localhost:2379”

}

file {

name = “file.conf”

}

}

以上内容主要修改了注册中心与配置中心为Nacos并且修改了Nacos地址与登录账号/登录密码,命名空间,分组;

配置部署到Nacos

==========

这里简化了下Nacos官网下载的config.txt内容,从官网下载的配置文本以下内容标记需要修改的需要关注

Copy#事务组 重点关注

service.vgroupMapping.my_test_tx_group=default

#服务段分组地址

service.default.grouplist=127.0.0.1:8091

#保持默认

service.enableDegrade=false

#保持默认

service.disableGlobalTransaction=false

#存储方式选择 db模式则数据库

store.mode=db

#需修改

store.lock.mode=db

#需修改

store.session.mode=db

store.publicKey=

#需修改

store.db.datasource=druid

#需修改

store.db.dbType=mysql

#需修改

store.db.driverClassName=com.mysql.jdbc.Driver

#需修改

store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true

#需修改

store.db.user=root

#需修改

store.db.password=123456

store.db.minConn=5

store.db.maxConn=30

store.db.globalTable=global_table

store.db.branchTable=branch_table

store.db.distributedLockTable=distributed_lock

store.db.queryLimit=100

store.db.lockTable=lock_table

store.db.maxWait=5000

client.undo.dataValidation=true

#需修改

#jackson改为kryo 解决数据库Datetime类型问题

client.undo.logSerialization=kryo

client.undo.onlyCareUpdateColumns=true

server.undo.logSaveDays=7

server.undo.logDeletePeriod=86400000

client.undo.logTable=undo_log

client.undo.compress.enable=true

client.undo.compress.type=zip

client.undo.compress.threshold=64k

log.exceptionRate=100

transport.serialization=seata

transport.compressor=none

其中该配置需要重点关注service.vgroupMapping.my_test_tx_group=default这里的配置与微服务应用中的配置必须要一致后面会描述到。

由于有时间类型是Seata回滚反序列化Date类型无法成功反序列化,需要修改序列化方式解决该问题: client.undo.logSerialization=kryo

修改完所有配置运行从官网下载的nacos-config.sh文件将文本内容上次到nacos配置中心中:

Copy# -h ip -p 端口 -t 命名空间 -g 分组

sh nacos-config.sh -h localhost -p 8848 -t 7e3699fa-09eb-4d47-8967-60f6c98da94a -g EXAMPLE-GROUP

部署好配置文件之后在Nacos命名空间为7e3699fa-09eb-4d47-8967-60f6c98da94a(dev)的配置管理界面可以看到文本中的内容。

Spring Cloud Alibaba使用Seata解决分布式事务全过程解析

Seata数据库

========

按照config.txt中对应的数据库连接信息创建Seata数据库并且创建以下几张表

CopyCREATE TABLE IF NOT EXISTS global_table

(

xid VARCHAR(128) NOT NULL,

transaction_id BIGINT,

status TINYINT NOT NULL,

application_id VARCHAR(32),

transaction_service_group VARCHAR(32),

transaction_name VARCHAR(128),

timeout INT,

begin_time BIGINT,

application_data VARCHAR(2000),

gmt_create DATETIME,

gmt_modified DATETIME,

PRIMARY KEY (xid),

KEY idx_gmt_modified_status (gmt_modified, status),

KEY idx_transaction_id (transaction_id)

) ENGINE = InnoDB

DEFAULT CHARSET = utf8;

– the table to store BranchSession data

CREATE TABLE IF NOT EXISTS branch_table

(

branch_id BIGINT NOT NULL,

xid VARCHAR(128) NOT NULL,

transaction_id BIGINT,

resource_group_id VARCHAR(32),

resource_id VARCHAR(256),

branch_type VARCHAR(8),

status TINYINT,

client_id VARCHAR(64),

application_data VARCHAR(2000),

gmt_create DATETIME(6),

gmt_modified DATETIME(6),

PRIMARY KEY (branch_id),

KEY idx_xid (xid)

) ENGINE = InnoDB

DEFAULT CHARSET = utf8;

– the table to store lock data

CREATE TABLE IF NOT EXISTS lock_table

(

row_key VARCHAR(128) NOT NULL,

xid VARCHAR(96),

transaction_id BIGINT,

branch_id BIGINT NOT NULL,

resource_id VARCHAR(256),

table_name VARCHAR(32),

pk VARCHAR(36),

gmt_create DATETIME,

gmt_modified DATETIME,

PRIMARY KEY (row_key),

KEY idx_branch_id (branch_id)

) ENGINE = InnoDB

DEFAULT CHARSET = utf8;

部署Seata Server

==============

以上工作准备就绪,进入bin目录运行seata-server.bat(windows用户)/seata-server.sh(linux用户)即可。

Seata应用场景模拟#

============

这里做一个用户服务用户登录成功后调用会员服务增加会员积分场景案例。

父工程改造

=====

工程名称:spring-cloud-alibaba-version-parent,增加mybatis,seata序列化等依赖版本管理。

Copy

<mybatis.plus.version>3.4.2</mybatis.plus.version>

<mybatis.plus.ds.version>2.5.4</mybatis.plus.ds.version>

<seata.serializer.kryo.version>1.3.0</seata.serializer.kryo.version>

com.baomidou

mybatis-plus-boot-starter

${mybatis.plus.version}

io.seata

seata-serializer-kryo

${seata.serializer.kryo.version}

会员服务工程改造

========

工程名称:spring-cloud-alibaba-service-member,增加数据库与Seata依赖,增加用户会员积分接口。

pom.xml

Copy

com.alibaba.cloud

spring-cloud-starter-alibaba-seata

io.seata

seata-serializer-kryo

com.baomidou

mybatis-plus-boot-starter

mysql

mysql-connector-java

bootstrap.yaml

Copy#注意,此处省略之前配置的信息…

#注意,此处省略之前配置的信息…

#注意,此处省略之前配置的信息…

#注意,此处省略之前配置的信息…

#数据库信息配置

spring:

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/member_db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true

username: root

password: 123456

#Seata配置

seata:

enabled: true

application-id: ${spring.application.name}

#对应nacos配置 service.vgroupMapping.my_test_tx_group

tx-service-group: ‘my_test_tx_group’

service:

vgroup-mapping:

#对应nacos配置 service.vgroupMapping.my_test_tx_group 的值 default

my_test_tx_group: ‘default’

registry:

type: nacos

nacos:

server-addr: ${spring.cloud.nacos.discovery.server-addr}

namespace: ${spring.cloud.nacos.discovery.namespace}

group: ${spring.cloud.nacos.discovery.group}

#cluster: ${spring.cloud.nacos.discovery.cluster}

config:

type: nacos

nacos:

server-addr: ${spring.cloud.nacos.discovery.server-addr}

namespace: ${spring.cloud.nacos.discovery.namespace}

group: ${spring.cloud.nacos.discovery.group}

注意事项:

  1. bootstrap.yaml中seata.tx-service-group 配置项一定要配置nacos配置中心中service.vgroupMapping对应的my_test_tx_group。也就是说一定要保持一致。

  2. bootstrap.yaml中seata.service.vgroup-mapping.my_test_tx_group配置项一定要配置nacos配置中心对应service.vgroupMapping.my_test_tx_group配置祥的值。

如果没有注意上方两点将会导致启动时报:no available service ‘default’ found, please make sure registry config correct。

创建member_db数据库

其中undo_log表为Seata回滚日志表,需要在每个使用到Seata的业务服务数据库中都需要创建。

CopySET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;


– Table structure for t_member_integral


DROP TABLE IF EXISTS t_member_integral;

CREATE TABLE t_member_integral (

ID bigint(20) NOT NULL COMMENT ‘主键’,

USERNAME varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘用户名称’,

INTEGRAL int(11) DEFAULT NULL COMMENT ‘积分’,

CREDATE datetime(0) DEFAULT NULL COMMENT ‘时间’,

PRIMARY KEY (ID) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;


– Table structure for undo_log


DROP TABLE IF EXISTS undo_log;

CREATE TABLE undo_log (

id bigint(20) NOT NULL AUTO_INCREMENT,

branch_id bigint(20) NOT NULL,

xid varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

context varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

rollback_info longblob NOT NULL,

log_status int(11) NOT NULL,

log_created datetime(0) NOT NULL,

log_modified datetime(0) NOT NULL,

ext varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,

PRIMARY KEY (id) USING BTREE,

UNIQUE INDEX ux_undo_log(xid, branch_id) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

新增会员积分CRUD

我这里新增以下类,具体内容大家都比较熟悉。

CopyMemberIntegralController.java

IMemberIntegralBiz.java

IMemberIntegralBizImpl.java

MemberIntegralMapper.java

MemberIntegral.xml

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

最新整理面试题
在这里插入图片描述

上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题

最新整理电子书

在这里插入图片描述

最新整理大厂面试文档

在这里插入图片描述

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
1712072014814)]

[外链图片转存中…(img-CFAXGrMR-1712072014815)]

[外链图片转存中…(img-bV9l8EA8-1712072014815)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

最新整理面试题
[外链图片转存中…(img-Cv2Xw9r3-1712072014816)]

上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题

最新整理电子书

[外链图片转存中…(img-ZLuXvpCJ-1712072014816)]

最新整理大厂面试文档

[外链图片转存中…(img-eSzOyiQG-1712072014816)]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值