日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 少妇一级淫片免费放播放 | av一二三四 | 91视频专区 | 国产精品免费一区二区三区四区 | 草草色 | 国产色a | 日韩一区二区精品视频 | 久久2018| 国产精品免费一区二区三区 | 青娱乐最新官网 | 中文字幕一区二区三区乱码 | 久久久久亚洲精品中文字幕 | 久久亚洲区 | 不卡的免费av | 亚洲综合久久婷婷 | 人妻熟人中文字幕一区二区 | 国产精品12区 | 亚洲美免无码中文字幕在线 | 精品国产一区二区三区四 | 91免费高清视频 | 免费男女视频 | 欧美 日韩 国产 成人 在线 91 | 欧美视频xxxx | 日韩三级免费看 | 最近免费高清mv | 精品久久久久久无码人妻 | 国产特级片 | 日韩人妻无码精品久久久不卡 | 亚洲狼人综合 | 欧美成人一二三 | 久久无码人妻精品一区二区三区 | 国产成人精品免高潮费视频 | 国产精品 欧美激情 | 欧美成人va| 一本到免费视频 | 动漫玉足吸乳羞免费网站玉足 | 亚洲欧美视频一区 | 奇米影视网 | 亚洲第十页 | 久久精品tv | 午夜网站在线 | a天堂资源在线 | 伊人青青草原 | 国产精品久久在线观看 | 你懂的91 | ass亚洲熟妇毛耸耸pics | 情欲超| 欧美专区日韩专区 | 久久经典| 一级毛毛片 | 色呦呦免费 | 99riAv国产精品无码鲁大师 | 西野翔夫の目の前で犯在线 | 五月天婷婷在线视频 | 精品理论片 | 免费成人黄色网 | 欧美日韩激情在线观看 | 久久久青 | 欧美人与禽猛交乱配 | 在线免费观看一区 | 天堂av在线免费 | 亚洲AV无码国产精品国产剧情 | 国产大学生av | 丝袜 中出 制服 人妻 美腿 | 校园春色av| 亚洲综合自拍 | 一区二区韩国 | 日韩免费观看一区二区三区 | 中文字幕日韩一级 | 久久精视频 | 天天爽| 一区二区三区亚洲精品 | 国产精品成人69xxx免费视频 | 亚洲欧美国产精品 | 91成人免费在线观看视频 | 国产超91 | 午夜日韩精品 | 日韩免费a| 国产一区久久久 | 日韩高清影视 | 亚洲精品乱码久久久久久久久久久久 | 亚洲精品日韩欧美 | 天天操欧美 | 色小说在线 | 日日夜夜噜噜噜 | 欧美性受xxxx黑人xyx性 | 久久天堂精品 | 天天看视频 | 中国美女一级黄色片 | 国产资源视频 | 拔插拔插影库 | 亚洲欧美成人一区二区三区 | 国产一区二区精品在线观看 | 欧美性受xxxx黒人xyx性爽 | 欧美色炮 | 亚洲深夜福利视频 | av三级在线观看 | 色啪综合 | 99成人|