千家信息网

alibaba seata服务端如何实现

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,这篇文章给大家分享的是有关alibaba seata服务端如何实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。seata是什么?seata是来处理分布式服务之间互相调用的
千家信息网最后更新 2024年11月26日alibaba seata服务端如何实现

这篇文章给大家分享的是有关alibaba seata服务端如何实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

seata是什么?

seata是来处理分布式服务之间互相调用的事务问题。

Seata术语

TC (Transaction Coordinator) - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

seata中文文档:Seata 是什么

seata下载地址:https://github.com/seata/seata/releases

seata服务端具体实现

我下载的是1.3.0

解压后目录结构

修改配置文件:registry.conf 注册信息。type默认是file,我要注册到nacos,修改nacos配置信息。

registry {  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa  type = "nacos"   nacos {    application = "seata-server"    serverAddr = "127.0.0.1:3333"    group = "SEATA_GROUP"    namespace = ""    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  type = "file"   nacos {    serverAddr = "127.0.0.1:8848"    namespace = ""    group = "SEATA_GROUP"    username = ""    password = ""  }  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"  }}

file.conf配置数据库信息,这里我配置的是db。要新建数据库。添加四张表。

branch_table、global_table、lock_table、undo_log。1.3.0版本没有给我们sql。其它版本有sql写在下面

## transaction log store, only used in seata-serverstore {  ## store mode: file、db、redis  mode = "db"   ## file store property  file {    ## store location dir    dir = "sessionStore"    # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions    maxBranchSessionSize = 16384    # globe session size , if exceeded throws exceptions    maxGlobalSessionSize = 512    # file buffer size , if exceeded allocate new buffer    fileWriteBufferCacheSize = 16384    # when recover batch read size    sessionReloadReadSize = 100    # async, sync    flushDiskMode = async  }   ## database store property  db {    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.    datasource = "druid"    ## mysql/oracle/postgresql/h3/oceanbase etc.    dbType = "mysql"    driverClassName = "com.mysql.cj.jdbc.Driver"    url = "jdbc:mysql://127.0.0.1:3306/seata?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8"    user = "root"    password = "123456"    minConn = 5    maxConn = 30    globalTable = "global_table"    branchTable = "branch_table"    lockTable = "lock_table"    queryLimit = 100    maxWait = 5000  }   ## redis store property  redis {    host = "127.0.0.1"    port = "6379"    password = ""    database = "0"    minConn = 1    maxConn = 10    queryLimit = 100  } }

sql

SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0; -- ------------------------------ Table structure for branch_table-- ----------------------------DROP TABLE IF EXISTS `branch_table`;CREATE TABLE `branch_table`  (  `branch_id` bigint(20) NOT NULL,  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `transaction_id` bigint(20) DEFAULT NULL,  `resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `status` tinyint(4) DEFAULT NULL,  `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `gmt_create` datetime(6) DEFAULT NULL,  `gmt_modified` datetime(6) DEFAULT NULL,  PRIMARY KEY (`branch_id`) USING BTREE,  INDEX `idx_xid`(`xid`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ------------------------------ Table structure for global_table-- ----------------------------DROP TABLE IF EXISTS `global_table`;CREATE TABLE `global_table`  (  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `transaction_id` bigint(20) DEFAULT NULL,  `status` tinyint(4) NOT NULL,  `application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `timeout` int(11) DEFAULT NULL,  `begin_time` bigint(20) DEFAULT NULL,  `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `gmt_create` datetime(0) DEFAULT NULL,  `gmt_modified` datetime(0) DEFAULT NULL,  PRIMARY KEY (`xid`) USING BTREE,  INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,  INDEX `idx_transaction_id`(`transaction_id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ------------------------------ Table structure for lock_table-- ----------------------------DROP TABLE IF EXISTS `lock_table`;CREATE TABLE `lock_table`  (  `row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `transaction_id` bigint(20) DEFAULT NULL,  `branch_id` bigint(20) NOT NULL,  `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,  `gmt_create` datetime(0) DEFAULT NULL,  `gmt_modified` datetime(0) DEFAULT NULL,  PRIMARY KEY (`row_key`) USING BTREE,  INDEX `idx_branch_id`(`branch_id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_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;

启动你自己的nacos注册中心。

然后在bin目录下双击seata-server.bat文件启动。

查看nacos注册中心,发现有seata的服务,就表示成功了。

seata客户端

pom文件

    4.0.0            spring-cloud-demo        com.xx.job        1.0-SNAPSHOT         seata-order-service2001            1.8                            com.xx.job            cloud-common            ${project.version}                    mysql            mysql-connector-java            org.mybatis.spring.boot            mybatis-spring-boot-starter            2.0.0            org.springframework.boot            spring-boot-starter-data-jpa            com.alibaba            druid            spring-boot-starter-web            spring-boot-starter-test            test            junit            junit            4.11            spring-boot-starter-actuator            com.alibaba.cloud            spring-cloud-starter-alibaba-nacos-discovery            spring-cloud-starter-alibaba-nacos-config            org.springframework.cloud            spring-cloud-starter-openfeign            io.seata            seata-all            org.projectlombok            lombok                                            org.springframework.boot                spring-boot-maven-plugin                            org.apache.maven.plugins                maven-compiler-plugin                                    6                    6                            

yml文件

server:  port: 2001 spring:  application:    name: seata-order-service  cloud:    nacos:      discovery:        server-addr: 127.0.0.1:3333      config:        file-extension: yml  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://127.0.0.1:3306/order?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8    username: root    password: 123456    type: com.alibaba.druid.pool.DruidDataSourcemybatis:  type-aliases-package: com.xx.job.entity  mapper-locations: classpath:mapper/*.xml#====================================Seata Config===============================================seata:  enabled: true  application-id: account-seata-example  tx-service-group: account-service-seata-service-group # 事务群组(可以每个应用独立取名,也可以使用相同的名字)  client:    rm-report-success-enable: true    rm-table-meta-check-enable: false # 自动刷新缓存中的表结构(默认false)    rm-report-retry-count: 5 # 一阶段结果上报TC重试次数(默认5)    rm-async-commit-buffer-limit: 10000 # 异步提交缓存队列长度(默认10000)    rm:      lock:        lock-retry-internal: 10 # 校验或占用全局锁重试间隔(默认10ms)        lock-retry-times: 30 # 校验或占用全局锁重试次数(默认30)        lock-retry-policy-branch-rollback-on-conflict: true # 分支事务与其它全局回滚事务冲突时锁策略(优先释放本地锁让回滚成功)    tm-commit-retry-count: 3 # 一阶段全局提交结果上报TC重试次数(默认1次,建议大于1)    tm-rollback-retry-count: 3 # 一阶段全局回滚结果上报TC重试次数(默认1次,建议大于1)    undo:      undo-data-validation: true # 二阶段回滚镜像校验(默认true开启)      undo-log-serialization: jackson # undo序列化方式(默认jackson)      undo-log-table: undo_log  # 自定义undo表名(默认undo_log)    log:      exceptionRate: 100 # 日志异常输出概率(默认100)    support:      spring:        datasource-autoproxy: true  service:    vgroup-mapping:      my_test_tx_group: default # TC 集群(必须与seata-server保持一致)    enable-degrade: false # 降级开关    disable-global-transaction: false # 禁用全局事务(默认false)    grouplist:      default: 127.0.0.1:8091  transport:    shutdown:      wait: 3    thread-factory:      boss-thread-prefix: NettyBoss      worker-thread-prefix: NettyServerNIOWorker      server-executor-thread-prefix: NettyServerBizHandler      share-boss-worker: false      client-selector-thread-prefix: NettyClientSelector      client-selector-thread-size: 1      client-worker-thread-prefix: NettyClientWorkerThread    type: TCP    server: NIO    heartbeat: true    serialization: seata    compressor: none    enable-client-batch-send-request: true # 客户端事务消息请求是否批量合并发送(默认true)  registry:    file:      name: file.conf    type: nacos      server-addr: localhost:3333      namespace:      cluster: default  config:

业务代码需要加上两个注解,本地事物和分布式事物。

@Transactional@GlobalTransactional
package com.xx.job.seataorderservice2001.controller; import com.xx.job.common.CommonResult;import com.xx.job.entity.Account;import com.xx.job.entity.Order;import com.xx.job.entity.Storage;import com.xx.job.seataorderservice2001.service.AccountService;import com.xx.job.seataorderservice2001.service.OrderService;import com.xx.job.seataorderservice2001.service.StorageSerivce;import io.seata.spring.annotation.GlobalTransactional;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@Slf4j@RestControllerpublic class OrderController {    @Autowired    private OrderService orderService;    private AccountService accountService;    private StorageSerivce storageSerivce;    /**     * 加订单 减余额 减库存     * @param order     * @return     */    @Transactional    @GlobalTransactional    @RequestMapping("/order/create")    public CommonResult create(Order order){        // 加订单        orderService.create(order);        // 减余额        Account account = new Account();        account.setUserId(order.getUserId());        account.setMoney(80);        accountService.update(account);        // 减库存        Storage storage = new Storage();        storage.setCount(999);        storage.setCommodityCode(order.getCommodityCode());        storageSerivce.update(storage);        return new CommonResult(200,"添加订单成功!");    }}

感谢各位的阅读!关于"alibaba seata服务端如何实现"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0