日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

8.Spring Cloud Alibaba教程:整合Seata分布式事务

發(fā)布時間:2025/3/19 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8.Spring Cloud Alibaba教程:整合Seata分布式事务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述

Seata 是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡單易用的分布式事務(wù)服務(wù)。

更多的介紹可以參考官方文檔:Seata快速入門
本篇主要是介紹Spring Cloud Alibaba + JPA 整合 Seata 的過程

安裝Seata

  • 下載Seata,打開 https://github.com/seata/seata/releases,現(xiàn)在最新的是1.3.0,所以選擇seata-server-1.3.0.tar.gz 進(jìn)行下載,放到/opt
  • 解壓Seata到/usr/local目錄下
cd /opt tar -zxvf seata-server-1.3.0.tar.gz -C /usr/local cd /usr/local/seata/
  • 這邊采用file單機(jī)模式(db模式相對麻煩一點,以后再另外介紹,從簡單的先開始),直接運行命令啟動即可
./bin/seata-server.sh

看到下面這個提示,說明啟動成功,默認(rèn)端口號8091


接下來介紹Spring Cloud Alibaba 接入Seata

業(yè)務(wù)場景

假設(shè)當(dāng)前存在2個微服務(wù):訂單服務(wù)、支付服務(wù)。

  • 用戶下單時,訂單服務(wù)需要調(diào)用支付服務(wù)進(jìn)行扣款
  • 當(dāng)余額充足時下單成功,并全局提交事務(wù)
  • 當(dāng)余額不足時下單失敗,并全局回滾事務(wù)

版本說明

框架版本號
Spring Boot2.1.13.RELEASE
Spring CloudGreenwich.SR6
Spring Cloud Alibaba2.1.3.RELEASE
MySQL8.0.11

創(chuàng)建父工程

創(chuàng)建父工程 hello-alibaba-seata,并引入依賴:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud-version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba-version}</version><type>pom</type><scope>import</scope></dependency></dependencies> </dependencyManagement><dependencies><!--Spring Boot--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!--Nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--Seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency><!--MySQL--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency> </dependencies>

創(chuàng)建公共服務(wù) common-server

該工程主要封裝公共的VO,由于測試場景比較簡單,目前只有一個類

@Data @Builder public class ReduceAmountDto {private Long userId;private Integer amount; }

創(chuàng)建支付服務(wù) pay-order

在訂單-支付的關(guān)系中,支付服務(wù)相當(dāng)于provider,訂單服務(wù)相當(dāng)于consumer。因此,這邊我們先創(chuàng)建支付服務(wù)。

  • 引入 common-server 依賴
<dependencies><dependency><groupId>com.train</groupId><artifactId>common-server</artifactId><version>${project.parent.version}</version></dependency></dependencies>
  • 創(chuàng)建賬戶 Entity
@Data @Entity @Table(name = "t_account") public class AccountInfo {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;/*** 用戶id*/@Column(name = "user_id")private Long userId;/*** 余額*/@Column(name = "amount")private Integer amount; }
  • 創(chuàng)建Dao
public interface AccountDao extends CrudRepository<AccountInfo, Long> {/*** 根據(jù)userId獲取賬戶信息*/@Query(value = "SELECT a FROM AccountInfo a where a.userId = :userId")AccountInfo getByUserId(@Param("userId") Long userId);/*** 扣減賬戶余額*/@Modifying@Query("UPDATE AccountInfo SET amount = amount - :amount WHERE userId = :userId")Integer reduceAmount(@Param("userId") Long userId, @Param("amount") Integer amount); }
  • 創(chuàng)建 Service
@Service public class PayServiceImpl implements PayService {@Autowiredprivate AccountDao accountDao;@Override@Transactional(rollbackFor = Exception.class)public void reduceAmount(Long userId, Integer reduceAmount) throws Exception {checkAmount(userId, reduceAmount);accountDao.reduceAmount(userId, reduceAmount);}private void checkAmount(Long userId, Integer reduceAmount) throws Exception {AccountInfo accountInfo = accountDao.getByUserId(userId);if (accountInfo == null){throw new Exception("找不到賬戶信息");}if (accountInfo.getAmount() < reduceAmount){throw new Exception("余額不足");}} }
  • 創(chuàng)建 controller
@RestController @RequestMapping("/pay") public class PayController {@Autowiredprivate PayService payService;@PostMapping("/reduceAmount")public String reduceAmount(@RequestBody ReduceAmountDto input) throws Exception {payService.reduceAmount(input.getUserId(), input.getAmount());return "扣款成功";} }
  • application.yml
server:port: 8012spring:application:name: pay-serverjpa:database: mysqldatasource:url: jdbc:mysql://192.168.25.129:3306/pay_db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=falseusername: testpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivercloud:nacos:discovery:server-addr: 192.168.25.131:8848 management:endpoints:web:exposure:include: "*"seata:enabled: trueapplication-id: ${spring.application.name}tx-service-group: my_test_tx_groupservice:vgroup-mapping:my_test_tx_group: defaultgrouplist:default: 192.168.25.131:8091config:type: filefile:name: file.confregistry:type: filefile:name: file.confenable-auto-data-source-proxy: true

注意:如果用的不是MySQL8,就要改下 driver-class-name

創(chuàng)建訂單服務(wù) order-server

  • 引入 common-server 依賴
<dependencies><dependency><groupId>com.train</groupId><artifactId>common-server</artifactId><version>${project.parent.version}</version></dependency></dependencies>
  • 創(chuàng)建訂單 Entity
@Data @Entity @Table(name = "t_order") public class Orders {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;/*** 用戶id*/@Column(name = "user_id")private Long userId;/*** 金額*/@Column(name = "amount")private Integer amount; }
  • 創(chuàng)建訂單 Dao
public interface OrdersDao extends CrudRepository<Orders, Long> { }
  • 創(chuàng)建 Service
@Service @Slf4j public class OrderServiceImpl implements OrderService {@Autowiredprivate OrdersDao orderDao;@Autowiredprivate RestTemplate restTemplate;@Override@GlobalTransactionalpublic void save(Orders order) {orderDao.save(order);//扣款String reduceUrl = "http://pay-server/pay/reduceAmount";ReduceAmountDto input = ReduceAmountDto.builder().userId(order.getUserId()).amount(order.getAmount()).build();String result = restTemplate.postForObject(reduceUrl, input, String.class);log.info("調(diào)用pay-server結(jié)果:" + result);} }

@GlobalTransactional 表示開啟Seata全局事務(wù)

  • 創(chuàng)建 controller
@RestController @RequestMapping("/order") public class OrderController {@Autowiredprivate OrderService orderService;@RequestMapping("/save")public String save(@RequestBody Orders order){orderService.save(order);return "操作結(jié)束";} }

測試

  • 啟動Nacos
  • 啟動Seata
  • 啟動pay-server
  • 啟動order-server
  • 調(diào)用創(chuàng)建訂單接口 http://localhost:8011/order/save ,構(gòu)造相應(yīng)的測試數(shù)據(jù)進(jìn)行測試就行
  • 總結(jié)

    以上是生活随笔為你收集整理的8.Spring Cloud Alibaba教程:整合Seata分布式事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 全部免费毛片 | 精品xxxxx | 鲁一鲁色一色 | 精品人妻在线播放 | 四虎精品在永久在线观看 | 橹图极品美女无圣光 | 天天人人精品 | 日韩免费不卡视频 | 嫩草研究院在线观看 | 久久久国产精品成人免费 | 婷婷综合六月 | 日日夜夜免费精品 | 亚洲网站一区 | 中文字幕一区二区三区四区欧美 | 西西人体做爰大胆gogo直播 | 日韩美女视频在线观看 | 日本啪啪网 | 久久天天东北熟女毛茸茸 | 国产精品v亚洲精品v日韩精品 | 在线免费观看一级片 | 自拍偷拍欧美亚洲 | 精品亚洲永久免费 | 成人女同av免费观看 | 日韩欧美一区二区在线观看 | 欧类av怡春院| 蜜桃视频在线网站 | 欧美日韩一区二区三区视频 | 青春草视频在线免费观看 | 免费成人电影在线观看 | 亚洲成人精品一区二区 | 欧洲女女同性videoso | 一区二区三区四区免费 | 欧美性猛交乱大交3 | 91av不卡 | 动漫3d精品一区二区三区乱码 | 欧美影视一区二区三区 | 国产成人av电影 | 中文一区二区 | 国产青青草 | 色臀av | www色网 | 伦一理一级一a一片 | 善良的女邻居在线观看 | 久久久久久久久久久久Av | 成人在线视屏 | 欧美福利视频在线 | 男人的天堂2019 | 国产一级网站 | 最新av免费观看 | 九九热精品视频在线 | 日本va视频 | 18禁一区二区三区 | 欧美精品二区三区四区免费看视频 | 亚洲毛片视频 | 台湾佬久久| 午夜天堂在线观看 | 中年夫妇啪啪高潮 | 奇米影视在线 | 成人免费观看视频 | 午夜久久乐 | 黄色在线免费观看视频 | 国产又色又爽又黄又免费 | 伊人三级 | 天堂国产一区二区三区 | 手机看片久久久 | 中文字幕不卡视频 | 视色av| 男女无遮挡xx00动态图120秒 | 亚洲无av在线中文字幕 | 97超碰总站 | 欧美日韩专区 | 秋霞视频在线 | 国产日韩精品一区二区 | 天堂网在线视频 | 欧美亚洲国产视频 | 欧美成人精品激情在线视频 | 亚洲精品1234| 亚洲天堂h | 亚洲激情综合 | 精品国产免费av | 久久尤物视频 | 成人免费在线播放视频 | 国产日韩专区 | 91播放在线 | 国产精品91在线 | 亚洲视频精选 | 伊人色图 | 九九天堂网 | 爱情岛论坛成人av | 91久久色 | 在线观看的毛片 | 日韩午夜激情视频 | www.av天天| 色综合久久88色综合天天6 | 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 天天干天天干天天 | 在线成人看片 | 日日拍夜夜拍 | 国产乱码精品一区二区三区忘忧草 |