当前位置:网站首页>nacos-高可用seata之TC搭建(02)
nacos-高可用seata之TC搭建(02)
2022-07-06 05:00:00 【kjshuan】
准備階段(Prepare phase): 事務管理器給每個參與者發送Prepare消息,每個數據庫參與者在本地執行事務,並寫本地的Undo/Redo日志,此時事務沒有提交。 ( Undo日志是記錄修改前的數據,用於數據庫回滾, Redo日志是記錄修改後的數據,用於提交事務後寫入數 據文件) 提交階段(commit phase): 如果事務管理器收到了參與者的執行失敗或者超時消息時,直接給每個參與者發送回滾(Rollback)消息;否則,發送提交(Commit)消息;參與者根據事務管理器的指令執行提交或者回滾操作,並釋放事務處理過程中使用的鎖資源。注意:必須在最後階段釋放鎖資源。
#創建數據庫 create database mydemo1; use mydemo1; create table orders(id int primary key not null auto_increment,orderdate date,shopid int not null,buynum int not null);
mybaits-plus自動生成
package com.kgc.mynacos02.ordermodule; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; public class GeneratorCode { public static void main(String[] args) { AutoGenerator ag = new AutoGenerator(); // //開啟連接數據庫 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://192.168.64.135:3306/mydemo1"); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("3090_Cmok"); ag.setDataSource(dsc); //設置全局配置 GlobalConfig gc = new GlobalConfig(); gc.setOutputDir(System.getProperty("user.dir")+"/mynacos02-ordermodule/src/main/java"); gc.setAuthor("js"); gc.setFileOverride(true); gc.setOpen(false); gc.setMapperName("%sMapper");//OrderMapper gc.setXmlName("%sMapper");//OrderMapper.xml gc.setServiceName("%sService");//Service gc.setServiceImplName("%sServiceImpl"); gc.setControllerName("%sCtrl"); ag.setGlobalConfig(gc); //設置包名 PackageConfig pc = new PackageConfig(); pc.setParent("com.kgc.mynacos02.ordermodule"); pc.setMapper("mapper"); pc.setEntity("domain"); pc.setController("controller"); pc.setService("services"); pc.setServiceImpl("services.impl"); //設置每個類的主鍵方式 gc.setIdType(IdType.AUTO); //設置日期類型 gc.setDateType(DateType.ONLY_DATE); ag.setPackageInfo(pc); //設置策略 StrategyConfig sc = new StrategyConfig(); sc.setEntityLombokModel(true); sc.setRestControllerStyle(true); sc.setColumnNaming(NamingStrategy.underline_to_camel); sc.setNaming(NamingStrategy.underline_to_camel); ag.setStrategy(sc); ag.execute(); } }
第一步導入pom依賴
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- //導入mybaitis核心--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.9</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
第二步配置remote接口
@FeignClient(value = "stockmodule",path = "stock") public interface StockFeignService { @GetMapping(value = "/deduct/{shopid}/{num}") public String deduct(@PathVariable("shopid")Integer shopid, @PathVariable("num") Integer num); }
第三步配置實體類 (domain service controller)
#domain @Data @Builder @EqualsAndHashCode(callSuper = false) public class Orders implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; private Date orderdate; private Integer shopid; private Integer buynum; } #service接口 public interface OrdersService extends IService<Orders> { void ordHndler(Orders ord); } #service接口實現類 @Service public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements OrdersService { @Resource private StockFeignService stockFeignService; @Override @Transactional public void ordHndler(Orders ord){ //把訂單存放到mydemo1數據庫的orders錶中 save(ord); stockFeignService.deduct(ord.getShopid(),ord.getBuynum()); } } #controller @RestController @RequestMapping("/orders") public class OrdersCtrl { @Resource private OrdersService os; @RequestMapping(value = "/addOrder",method = RequestMethod.GET) public String addOrder(@RequestParam("shopid") int shopid,@RequestParam("buynum") int buynum){ Orders ord = Orders.builder().orderdate(new Date()).shopid(shopid).buynum(buynum).build(); os.ordHndler(ord); return "SUCCESS"; } } #application配置注解 @SpringBootApplication @EnableFeignClients @MapperScan("com.kgc.mynacos02.ordermodule.mapper") public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class,args); } }
啟動訂單 和庫存2個服務!!!
postman遠程調用接口
Seata**安裝(史上最細 包成功!!)
准備一下2個jar包 放到opt目錄下
cd /opt/ ls tar -zxf seata-server-1.3.0.tar.gz mv seata soft/seata cd soft/seata/conf vim file.conf #修改4個數據 mode="db" serverAddr 自己的地址 賬號密碼 cd /opt/ mkdir sta mv seata-1.3.0.zip sta/ cd sta/ yum install -y unzip zip unzip seata-1.3.0.zip cd seata-1.3.0 ls mysql -uroot -p3090_Cmok create database seata; use seata; source /opt/sta/seata-1.3.0/script/server/db/mysql.sql exit; cd /opt/soft/seata/conf vim registry.conf #修改type = "nacos" serverAddr你的地址 賬號nacos密碼nacos #修改config type = "nacos" 賬號nacos密碼nacos #一共改7個 :wq cd /opt ls cd sta/seata-1.3.0/script/config-center/ vim config.txt #service.vgroupMapping.my_test_tx_group=default #my_test_tx_group這個為真實機房地址 可以改成nanjing ##事務分組 异地機房停電可以切換 在後期client調用時候使用 seata.service.vgroup- mapping.projectA=自己 #修改4個地方 service.vgroupMapping.nanjing=default store.db.url=jdbc:mysql://192.168.64.135:3306/ store.db.user=root store.db.password=3090_Comk #保存退出 :wq cd nacos/ ls ll #將config.txt文件上傳到配置中心 sh nacos-config.sh -h 192.168.64.135 -p 8848 -g SEATA_GROUP cd /opt/soft/seata/bin/ ls #啟動seata server ./seata-server.sh -p 9009 -n 1
打開瀏覽器!
192.168.64.135:8848/nacos
出現以上界面錶明安裝成功!!
1)啟動Seata server端,Seata server使用nacos作為配置中心和注册中心(上一步已完成) 2)
第一步配置微服務整合seata
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>
第二步: 各微服務對應數據庫中添加undo_log錶
mysql -uroot -p3090_Cmok use mydemo; #執行下面建錶 #==================================== CREATE TABLE `undo_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `branch_id` bigint(20) NOT NULL, `xid` varchar(100) NOT NULL, `context` varchar(128) NOT NULL, `rollback_info` longblob NOT NULL, `log_status` int(11) NOT NULL, `log_created` datetime NOT NULL, `log_modified` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; #==================================== use mydemo1; #同理
第三步:修改application.yml配置(2邊都加)
server: port: 8003 spring: application: name: ordermodule datasource: druid: url: jdbc:mysql://192.168.64.135:3306/mydemo1?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true username: root password: 3090_Cmok initial-size: 3 max-active: 30 min-idle: 3 max-wait: 60000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: select 1 test-on-borrow: true test-while-idle: false test-on-return: false pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 30 filter: stat,wall connection-properties: druid.stat.mergeSql=true;druid.stat.slowSq1Millis=500 use-global-data-source-stat: true cloud: nacos: discovery: server-addr: 192.168.64.135:8848 username: nacos password: nacos namespace: public alibaba: seata: tx-service-group: nanjing mybatis-plus: mapper-locations: mapper/*.xml seata: registry: type: nacos nacos: server-addr: 192.168.64.135:8848 username: nacos password: nacos application: seata-server config: type: nacos nacos: server-addr: 192.168.64.135:8848 username: nacos password: nacos group: SEATA_GROUP namespace: public
postman測試(需要在service實現類中 自定義异常)
查詢數據庫(庫存沒减回滾成功!!!)
边栏推荐
- Introduction of several RS485 isolated communication schemes
- Sorting out the knowledge points of multicast and broadcasting
- RT thread analysis log system RT_ Kprintf analysis
- acwing周赛58
- yolov5 tensorrt加速
- Delete subsequence < daily question >
- Oracle query table index, unique constraint, field
- Ora-01779: the column corresponding to the non key value saving table cannot be modified
- Excellent PM must experience these three levels of transformation!
- Postman断言
猜你喜欢
Orm-f & Q object
Summary of redis basic knowledge points
Idea one key guide package
Basic knowledge and examples of binary tree
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
Use sentinel to interface locally
JS quick start (II)
Postman关联
The IPO of mesk Electronics was terminated: Henan assets, which was once intended to raise 800 million yuan, was a shareholder
Acwing week 58
随机推荐
idea一键导包
nacos-高可用seata之TC搭建(02)
Extension of graph theory
Sorting out the knowledge points of multicast and broadcasting
Microblogging hot search stock selection strategy
Oracle deletes duplicate data, leaving only one
Quatre méthodes de redis pour dépanner les grandes clés sont nécessaires pour optimiser
Vite configures the development environment and production environment
RTP GB28181 文件测试工具
行业专网对比公网,优势在哪儿?能满足什么特定要求?
Three. JS learning - light and shadow (understanding)
项目经理,你会画原型嘛?项目经理需要做产品设计了?
也算是学习中的小总结
最高法院,离婚案件判决标准
Postman断言
MPLS experiment
It is also a small summary in learning
几种RS485隔离通讯的方案介绍
TCP three handshakes you need to know
[detailed steps of FreeRTOS shift value for the first time]