在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

保姆級教程:Spring Cloud 集成Seata分布式事務

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-06-09 14:42 ? 次閱讀


環(huán)境搭建

Nacos搭建

最新版本快速搭建 使用Mysql模式

Nacos直接啟動即可。控制臺默認賬號密碼是nacos/nacos,Mysql賬戶密碼有兩個 root/rootnacos/nacos。

3a2d283e-068c-11ee-962d-dac502259ad0.png

Seata搭建

Seata版本1.5.0 快速搭建

Seata1.5.0版本直接是一個SpringBoot項目,下載后修改application.yml 文件中注冊中心、配置中心、存儲模式配置。參考resources/application.example.yml 文件 ,修改后如下

server:
port:7091

spring:
application:
name:seata-server

logging:
config:classpath:logback-spring.xml
file:
path:${user.home}/logs/seata
extend:
logstash-appender:
destination:127.0.0.1:4560
kafka-appender:
bootstrap-servers:127.0.0.1:9092
topic:logback_to_logstash

console:
user:
username:seata
password:seata

seata:
config:
#support:nacos,consul,apollo,zk,etcd3
type:file
registry:
#support:nacos,eureka,redis,zk,consul,etcd3,sofa
type:nacos
nacos:
application:seata-server
server-addr:127.0.0.1:8848
namespace:
group:SEATA_GROUP
cluster:default
username:nacos
password:nacos
##ifuseMSENacoswithauth,mutexwithusername/passwordattribute
#access-key:""
#secret-key:""
store:
#support:file、db、redis
mode:db
db:
datasource:druid
db-type:mysql
driver-class-name:com.mysql.jdbc.Driver
url:jdbc//127.0.0.1:3306/seata?rewriteBatchedStatements=true
user:root
password:root
min-conn:5
max-conn:100
global-table:global_table
branch-table:branch_table
lock-table:lock_table
distributed-lock-table:distributed_lock
query-limit:100
max-wait:5000

>基于SpringBoot+MyBatisPlus+Vue&Element實現(xiàn)的后臺管理系統(tǒng)+用戶小程序,支持RBAC動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
>
>*項目地址:
>*視頻教程

#server:

>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element實現(xiàn)的后臺管理系統(tǒng)+用戶小程序,支持RBAC動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
>
>*項目地址:
>*視頻教程

#service-port:8091#Ifnotconfigured,thedefaultis'${server.port}+1000'
security:
secretKey:SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds:1800000
ignore:
urls:/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

創(chuàng)建seata數(shù)據(jù)庫,執(zhí)行腳本建表

----------------------------------ThescriptusedwhenstoreModeis'db'--------------------------------
--thetabletostoreGlobalSessiondata
CREATETABLEIFNOTEXISTS`global_table`
(
`xid`VARCHAR(128)NOTNULL,
`transaction_id`BIGINT,
`status`TINYINTNOTNULL,
`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,
PRIMARYKEY(`xid`),
KEY`idx_status_gmt_modified`(`status`,`gmt_modified`),
KEY`idx_transaction_id`(`transaction_id`)
)ENGINE=InnoDB
DEFAULTCHARSET=utf8mb4;

--thetabletostoreBranchSessiondata
CREATETABLEIFNOTEXISTS`branch_table`
(
`branch_id`BIGINTNOTNULL,
`xid`VARCHAR(128)NOTNULL,
`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),
PRIMARYKEY(`branch_id`),
KEY`idx_xid`(`xid`)
)ENGINE=InnoDB
DEFAULTCHARSET=utf8mb4;

--thetabletostorelockdata
CREATETABLEIFNOTEXISTS`lock_table`
(
`row_key`VARCHAR(128)NOTNULL,
`xid`VARCHAR(128),
`transaction_id`BIGINT,
`branch_id`BIGINTNOTNULL,
`resource_id`VARCHAR(256),
`table_name`VARCHAR(32),
`pk`VARCHAR(36),
`status`TINYINTNOTNULLDEFAULT'0'COMMENT'0:locked,1:rollbacking',
`gmt_create`DATETIME,
`gmt_modified`DATETIME,
PRIMARYKEY(`row_key`),
KEY`idx_status`(`status`),
KEY`idx_branch_id`(`branch_id`),
KEY`idx_xid`(`xid`)
)ENGINE=InnoDB
DEFAULTCHARSET=utf8mb4;

CREATETABLEIFNOTEXISTS`distributed_lock`
(
`lock_key`CHAR(20)NOTNULL,
`lock_value`VARCHAR(20)NOTNULL,
`expire`BIGINT,
primarykey(`lock_key`)
)ENGINE=InnoDB
DEFAULTCHARSET=utf8mb4;

INSERTINTO`distributed_lock`(lock_key,lock_value,expire)VALUES('AsyncCommitting','',0);
INSERTINTO`distributed_lock`(lock_key,lock_value,expire)VALUES('RetryCommitting','',0);
INSERTINTO`distributed_lock`(lock_key,lock_value,expire)VALUES('RetryRollbacking','',0);
INSERTINTO`distributed_lock`(lock_key,lock_value,expire)VALUES('TxTimeoutCheck','',0);

啟動seata-server,控制臺登錄頁面如下,賬號密碼為seata/seata。

3a361552-068c-11ee-962d-dac502259ad0.png

項目搭建

業(yè)務背景

用戶購買商品的業(yè)務邏輯。整個業(yè)務邏輯由3個微服務提供支持:

  • 倉儲服務: 對給定的商品扣除倉儲數(shù)量。
  • 訂單服務: 根據(jù)采購需求創(chuàng)建訂單。
  • 帳戶服務: 從用戶帳戶中扣除余額。

架構(gòu)

3a4771c6-068c-11ee-962d-dac502259ad0.png

業(yè)務表創(chuàng)建

------------------------------
--Tablestructurefort_account
------------------------------
DROPTABLEIFEXISTS`t_account`;
CREATETABLE`t_account`
(
`id`int(11)NOTNULLAUTO_INCREMENT,
`user_id`varchar(255)DEFAULTNULL,
`amount`double(14,2
)DEFAULT'0.00',
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;

------------------------------
--Recordsoft_account
------------------------------
INSERTINTO`t_account`
VALUES('1','1','4000.00');

------------------------------
--Tablestructurefort_order
------------------------------
DROPTABLEIFEXISTS`t_order`;
CREATETABLE`t_order`
(
`id`int(11)NOTNULLAUTO_INCREMENT,
`order_no`varchar(255)DEFAULTNULL,
`user_id`varchar(255)DEFAULTNULL,
`commodity_code`varchar(255)DEFAULTNULL,
`count`int(11)DEFAULT'0',
`amount`double(14,2
)DEFAULT'0.00',
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=64DEFAULTCHARSET=utf8;

------------------------------
--Recordsoft_order
------------------------------

------------------------------
--Tablestructurefort_stock
------------------------------
DROPTABLEIFEXISTS`t_stock`;
CREATETABLE`t_stock`
(
`id`int(11)NOTNULLAUTO_INCREMENT,
`commodity_code`varchar(255)DEFAULTNULL,
`name`varchar(255)DEFAULTNULL,
`count`int(11)DEFAULT'0',
PRIMARYKEY(`id`),
UNIQUEKEY`commodity_code`(`commodity_code`)
)ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;

------------------------------
--Recordsoft_stock
------------------------------
INSERTINTO`t_stock`
VALUES('1','C201901140001','水杯','1000');

------------------------------
--Tablestructureforundo_log
--注意此處0.3.0+增加唯一索引ux_undo_log
------------------------------
DROPTABLEIFEXISTS`undo_log`;
CREATETABLE`undo_log`
(
`id`bigint(20)NOTNULLAUTO_INCREMENT,
`branch_id`bigint(20)NOTNULL,
`xid`varchar(100)NOTNULL,
`context`varchar(128)NOTNULL,
`rollback_info`longblobNOTNULL,
`log_status`int(11)NOTNULL,
`log_created`datetimeNOTNULL,
`log_modified`datetimeNOTNULL,
PRIMARYKEY(`id`),
UNIQUEKEY`ux_undo_log`(`xid`,`branch_id`)
)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;

------------------------------
--Recordsofundo_log
------------------------------
SET
FOREIGN_KEY_CHECKS=1;

服務創(chuàng)建

業(yè)務服務

以order服務為例,引入依賴、配置參數(shù)、提供創(chuàng)建訂單接口。

pom.xml文件中引入依賴

<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-seataartifactId>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
dependencies>

application.properties配置參數(shù)

server.port=81
spring.application.name=order
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc//127.0.0.1:3306/seata_samples?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

提供創(chuàng)建訂單接口

@RequestMapping("/add")
publicvoidadd(StringuserId,StringcommodityCode,Integercount,BigDecimalamount){
Orderorder=newOrder();
order.setOrderNo(UUID.randomUUID().toString());
order.setUserId(userId);
order.setAmount(amount);
order.setCommodityCode(commodityCode);
order.setCount(count);
orderService.save(order);
}
聚合服務

business服務遠程調(diào)用倉儲、訂單、帳戶服務,完成下單流程。

1.pom.xml文件中引入依賴

<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-seataartifactId>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
dependencies>

2.application.properties配置參數(shù)

server.port=80
spring.application.name=business
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc//127.0.0.1:3306/seata_samples?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
service.disableGlobalTransaction=false
# 連接超時時間
ribbon.ConnectTimeout=3000
# 響應超時時間
ribbon.ReadTimeout=5000

3.聲明account、stock、order的feign接口。

@FeignClient(value="account")
publicinterfaceAccountFeign{
@RequestMapping("/account/reduce")
publicvoidreduce(@RequestParam("userId")StringuserId,@RequestParam("amount")BigDecimalamount);

}
@FeignClient(value="order")
publicinterfaceOrderFeign{
@RequestMapping("/order/add")
publicvoidadd(@RequestParam("userId")StringuserId,@RequestParam("commodityCode")StringcommodityCode,@RequestParam("count")Integercount,@RequestParam("amount")BigDecimalamount);

}
@FeignClient(value="stock")
publicinterfaceStockFeign{
@RequestMapping("/stock/deduct")
publicvoiddeduct(@RequestParam("commodityCode")StringcommodityCode,@RequestParam("count")Integercount);

}

4.全局事務開啟,調(diào)用feign接口

@Autowired
privateOrderFeignorderFeign;

@Autowired
privateStockFeignstockFeign;

@Autowired
privateAccountFeignaccountFeign;

@GlobalTransactional
@RequestMapping("/toOrder")
publicvoidtoOrder(StringuserId,StringcommodityCode,Integercount,BigDecimalamount){
accountFeign.reduce(userId,amount);
stockFeign.deduct(commodityCode,count);
orderFeign.add(userId,commodityCode,count,amount);
}

測試驗證

當前資金賬戶4000,庫存1000,模擬用戶購買商品2000個,消費4000,業(yè)務調(diào)用后,數(shù)據(jù)庫數(shù)據(jù)狀態(tài)應該如下:

  • 用戶資金滿足4000,數(shù)據(jù)庫更新用戶資金為0。
  • 商品庫存不滿足2000個,異常。
  • business服務提交全局回滾。
  • 資金服務回滾操作,更新資金為4000。

驗證:

1.瀏覽器輸入地址請求訪問

  • http://127.0.0.1/business/toOrder?userId=1&commodityCode=C201901140001&count=2000&amount=4000

2.account、stock服務日志觀察。

3a5f22e4-068c-11ee-962d-dac502259ad0.png3a88011e-068c-11ee-962d-dac502259ad0.png

3.數(shù)據(jù)庫數(shù)據(jù)依然為原始狀態(tài)。

3aacbdec-068c-11ee-962d-dac502259ad0.png

注意事項

1.Seata1.5版本的mysql驅(qū)動是5.7,需要為8,在libs文件夾刪除mysql-connector-java-5.xx.jar,替換mysql-connector-java-8.xx.jar即可

2.Spring Boot &Spring Cloud&Spring Cloud Alibaba版本兼容問題

Spring Cloud Alibaba版本說明

3ab9d7fc-068c-11ee-962d-dac502259ad0.png

3.druid和數(shù)據(jù)驅(qū)動版本兼容

通過druid倉庫版本查看各依賴版本說明

3acad4da-068c-11ee-962d-dac502259ad0.png

代碼倉庫

  • https://gitee.com/codeWBG/springcloud_alibaba


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4828

    瀏覽量

    69063
  • 管理系統(tǒng)
    +關(guān)注

    關(guān)注

    1

    文章

    2577

    瀏覽量

    36111
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14392

原文標題:保姆級教程:Spring Cloud 集成 Seata 分布式事務

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Spring事務實現(xiàn)原理

    這些操作。 spring事務有編程式事務和聲明事務兩種實現(xiàn)方式。編程式事務是通過編寫代碼來管理
    的頭像 發(fā)表于 11-08 10:10 ?874次閱讀
    <b class='flag-5'>Spring</b><b class='flag-5'>事務</b>實現(xiàn)原理

    EDAS再升級!全面支持Spring Cloud應用

    摘要: 近日,阿里中間件(Aliware)的企業(yè)分布式應用服務EDAS宣布再次升級,全面支持Spring Cloud應用。點此查看原文:[url=]http://click.aliy
    發(fā)表于 02-02 15:20

    微服務架構(gòu)下分布式事務解決方案 —— 阿里GTS

    ,完成事務的發(fā)起與結(jié)束。GTS RM完成事務分支的創(chuàng)建、提交、回滾等操作。GTS Server主要負責分布式事務的整體推進,事務生命周期的管
    發(fā)表于 03-16 11:14

    一行代碼,保障分布式事務一致性—GTS:微服務架構(gòu)下分布式事務解決方案

    主要完成事務的發(fā)起與結(jié)束。GTS RM完成分支事務的開啟、提交、回滾等操作。GTS Server主要負責分布式事務的整體推進,事務生命周期的
    發(fā)表于 06-05 19:14

    詳解Spring事務管理

    在學習spring事務管理時,我忍不住要問,spring為什么進行事務管理,spring怎么進行的事務
    發(fā)表于 07-12 06:54

    F0rCES路由器分布式事務研究

    研究了分布式事務在ForCES路由器中的應用及實現(xiàn)機制。首先對ForCES中分布式事務的需求做了詳細分析,在此基礎(chǔ)上將修改的2PC機制引入ForCES,之后提出了一種基于狀態(tài)機的
    發(fā)表于 09-26 15:24 ?17次下載
    F0rCES路由器<b class='flag-5'>分布式</b><b class='flag-5'>事務</b>研究

    分布式事務控制的原理實例分析

    對于分布式數(shù)據(jù)庫而言,分布式事務控制是重點和難點,一直以來沒有成熟的方案可以突破CAP理論,幾乎每個分布式數(shù)據(jù)庫研發(fā)團隊都在分布式
    發(fā)表于 09-28 19:04 ?0次下載
    <b class='flag-5'>分布式</b><b class='flag-5'>事務</b>控制的原理實例分析

    Apache RocketMQ 正式開源分布式事務消息

    版本開源了社區(qū)最為關(guān)心的分布式事務消息,而且實現(xiàn)了對外部組件的零依賴。接下來,本文將詳細探秘RocketMQ事務消息的設計原理以及實現(xiàn)機制。一、需求緣起在微服務架構(gòu)中,隨著服務的逐步拆分,數(shù)據(jù)庫私有
    發(fā)表于 08-20 15:15 ?346次閱讀

    從代碼角度詳解Seata AT事務模式的流程

    Seata 四種事務模式中,AT 事務模式是阿里體系獨創(chuàng)的事務模式,對業(yè)務無侵入,也是 Seata 用戶最多的一種
    的頭像 發(fā)表于 09-29 10:08 ?1212次閱讀

    分布式鏈路跟蹤Sleuth與Zipkin

    Spring Cloud Sleuth 也為我們提供了一套完整的解決方案。在本章中,我們將詳細介紹如何使用 Spring Cloud Sleuth + Zipkin 來為我們的微服務架
    的頭像 發(fā)表于 01-13 10:11 ?700次閱讀

    spring分布式框架有哪些

    Spring分布式框架。 Spring Cloud Spring Cloud是基于
    的頭像 發(fā)表于 11-16 10:58 ?825次閱讀

    springclould分布式教程

    Spring Cloud是一個基于Spring Boot的分布式系統(tǒng)開發(fā)工具,它提供了一系列的分布式系統(tǒng)解決方案,可以幫助開發(fā)者快速構(gòu)建和部
    的頭像 發(fā)表于 11-16 10:59 ?553次閱讀

    springcloud如何實現(xiàn)分布式

    Spring Cloud是基于Spring Boot開發(fā)的一套分布式系統(tǒng)解決方案,它主要包括了多個子項目,如服務注冊與發(fā)現(xiàn)、配置中心、負載均衡、斷路器、路由等等。通過使用
    的頭像 發(fā)表于 11-16 11:01 ?722次閱讀

    springcloud分布式事務解決方案

    Spring Cloud是一套用于構(gòu)建分布式系統(tǒng)的開源框架,它提供了一系列組件和工具,可以幫助開發(fā)人員快速構(gòu)建和管理基于微服務架構(gòu)的應用程序。在分布式系統(tǒng)中,
    的頭像 發(fā)表于 11-16 11:03 ?2094次閱讀

    springcloud 分布式事務解決方案實例

    么都執(zhí)行成功,要么都執(zhí)行失敗。本文將介紹如何使用Spring Cloud來實現(xiàn)分布式事務。 在分布式系統(tǒng)中,使用數(shù)據(jù)庫
    的頭像 發(fā)表于 12-03 16:32 ?1188次閱讀
    主站蜘蛛池模板: 中文字幕欧美成人免费 | 成人五级毛片免费播放 | 亚洲免费看片 | 日本三级吹潮 | 天天做天天摸天天爽天天爱 | 日日噜噜夜夜狠狠tv视频免费 | 欧美精品国产第一区二区 | 人人洗澡人人洗澡人人 | 户外露出精品视频国产 | 人人玩人人干 | 亚洲天堂ww | avtom影院永久转四虎入口 | 在线观看www妖精免费福利视频 | 六月综合网 | 久久www免费人成看片色多多 | 国产亚洲欧美视频 | 四虎884tt紧急大通知 | 亚洲成色www久久网站 | 边做边爱在线观看视频免费 | 欧美精彩狠狠色丁香婷婷 | 一二三区电影 | 午夜视频你懂的 | 电影天堂在线观看三级 | 亚洲免费一 | 99亚洲自拍| 中国特黄一级片 | 我要看一级大片 | 好吊色视频988gao在线观看 | 丁香狠狠| 中年艳妇乱小玩 | 欧美色欧美亚洲高清在线观看 | 影音先锋在线亚洲精品推荐 | 亚洲成网站 | 国产精品成人在线播放 | 污视频18高清在线观看 | 四虎影业 | 99热国内精品 | 天天操天天干天天爽 | 免费在线一区二区三区 | 香蕉视频在线免费播放 | 91成人免费 |