alibaba seata服务端具体实现

网友投稿 229 2022-08-25


alibaba seata服务端具体实现

目录seata是什么?Seata术语seata服务端具体实现 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-server

store {

## 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/h2/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文件

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

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

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

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.DruidDataSource

mybatis:

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

@RestController

public 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(ordehttp://r.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,"添加订单成功!");

}

}

具体demo   gitee:spring-cloud-demo: spring-cloud-demo试例


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:unittest--前置和后置
下一篇:unittest--运行不同文件下的测试(unittest测试用例执行顺序)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~