ä¸ãåè¨
è³æ¤ï¼å主ä»ç»äºä¸äºSeataç¯å¢æ建ç常è§åãSeataç两ç§æ¡ä¾ï¼SpringCloudéæSeataãSpringCloudéæNacos + Seataï¼ï¼
- can not get cluster name in registry config âservice.vgroupMapping.xxâ, please make sure registryé®é¢è§£å³ï¼
- Seata Failed to get available servers: endpoint format should like ip:port æ¥éåå /解å³æ¹æ¡æ±æ»çï¼çå®æ¬æå¿ è§£å³é®é¢ï¼
- Seata json decode exception, Cannot construct instance of java.time.LocalDateTimeæ¥éåå /解å³æ¹æ¡æå ¨æ±æ»ç
- ãå¾®æå¡ 31ãè¶ ç»çSpring Cloud æ´åSeataå®ç°åå¸å¼äºå¡ï¼æåçï¼
- ãå¾®æå¡ 32ãSpring Cloudæ´åSeataãNacoså®ç°åå¸å¼äºå¡æ¡ä¾ï¼å·¨ç»æåçï¼ãäºåçã
ä»æ¬æå¼å§ï¼è¿å ¥å°seataæºç 解æç³»åæç« ï¼åé¢å ç¯å°å³AT模å¼ä¸ºä¾è§£æSeata-Server å Seata-Clientç交äºè¿ä½æµç¨ï¼
å¨çæ£å¼å§è§£ææºç ä¹åï¼æ们å å¨IDEAä¸æSeata Serverè·èµ·æ¥ï¼
PSï¼åæä¸æ建çSeataæ¡ä¾ï¼seataççæ¬ä¸º1.3.0ï¼èæ¬æå¼å§çæºç åæå°åºäºå½åï¼2022å¹´8æï¼ææ°ççæ¬1.5.2è¿è¡æºç 解æã
读è è¯·æ ¹æ®ï¼ ãå¾®æå¡ 31ãè¶ ç»çSpring Cloud æ´åSeataå®ç°åå¸å¼äºå¡ï¼æåçï¼â ä¸æèªè¡è°æ´SpringBootãSpringCloudãSpring Cloud AlibabaãSeataççæ¬ï¼åèåæï¼SpringBootãSpringCloudãSpringCloudAlibabaççæ¬å¯¹åºå ³ç³»ï¼ï¼å ·ä½ä½¿ç¨ççæ¬è§ä¸ä¸ç¯æç« ã
äºãIDEAä¸è¿è¡Seata Server
å é®èªå·±ä¸ªé®é¢ï¼ä¸ºä»ä¹è¦å¨æ¬å°è¿è¡seata serverï¼å°±åæ个人æè§ï¼seata serveréé¢çç±»åµå¥ç¹å«æ·±ï¼ææ¶ä¼æè§æ²¡é£ä¹å¿ è¦ï¼æä¸äºç»èç¹éè¦éè¿debugçæ¹å¼éªè¯æ¨æµï¼å®è·µåºçç¥ï¼ï¼ï¼
æ¬çæå°ä¾èµãéªè¯æ ¸å¿åè½çåè¡·ï¼æ¬æSeata Serverçæ¬å°è¿è¡åºäºFileçé ç½®/注åæ¹å¼ãDBçåå¨æ°æ®æ¹å¼ï¼
1ãææºç ä»Githubä¸è¡ä¸æ¥
æºç GitHubå°åï¼ââhttps://github.com/seata/seata/tree/v1.5.2ââï¼
éè¿â
âNew Project from Version Control...â
âçæ¹å¼å°æºç 项ç®æåæ¬å°ï¼
éæ©Git代ç åæ¯ï¼â
âorigin/1.5.2â
âï¼æ´ä½é¡¹ç®ç»æå¦ä¸ï¼
Seata Server使ç¨å°çDB
è¿å ¥å½åæºç 项ç®çå¦ä¸ç®å½ï¼
å¨æ¬å°MySQLæ°æ®åºæ°å»ºæ°æ®åºâ
âseata_serverâ
âï¼ç¶åå¨å ¶ä¸è¿è¡mysql.sqlæ件ï¼çæç表ç»æå¦ä¸ï¼
表çä½ç¨å¦ä¸ï¼
- â
âç¨äºä¿ååæ¯äºå¡æ°æ®âbranch_tableâ
- â
âç¨äºä¿åå ¨å±äºå¡æ°æ®âglobal_tableâ
- â
âç¨äºä¿åå ¨å±éæ°æ®âlock_tableâ
- â
âç¨äºä¿ååå¸å¼éæ°æ®âdistributed_lockâ
mysql.sqlå¦ä¸ï¼
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`status` TINYINT NOT NULL,
`application_id` VARCHAR(32),
`transaction_service_group` VARCHAR(32),
`transaction_name` VARCHAR(128),
`timeout` INT,
`begin_time` BIGINT,
`application_data` VARCHAR(2000),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`xid`),
KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`resource_group_id` VARCHAR(32),
`resource_id` VARCHAR(256),
`branch_type` VARCHAR(8),
`status` TINYINT,
`client_id` VARCHAR(64),
`application_data` VARCHAR(2000),
`gmt_create` DATETIME(6),
`gmt_modified` DATETIME(6),
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
`row_key` VARCHAR(128) NOT NULL,
`xid` VARCHAR(128),
`transaction_id` BIGINT,
`branch_id` BIGINT NOT NULL,
`resource_id` VARCHAR(256),
`table_name` VARCHAR(32),
`pk` VARCHAR(36),
`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_status` (`status`),
KEY `idx_branch_id` (`branch_id`),
KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS `distributed_lock`
(
`lock_key` CHAR(20) NOT NULL,
`lock_value` VARCHAR(20) NOT NULL,
`expire` BIGINT,
primary key (`lock_key`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
2ãè°æ´seata-serverçé ç½®
ä¸è½½å¹¶è¿è¡seata-serveræ¶ï¼å¦æéç¨fileçæ¹å¼ï¼æ们éè¦å¨â
âregistry.confâ
ââä¸é ç½®seata-serverçæå¡æ³¨åä¿¡æ¯ãâ
âfile.confâ
âä¸é ç½®seata-serverçæå¡é 置信æ¯ï¼
æç §è¿ä¸ªæè·¯ï¼ä»¥file.conf为ä¾å ¨å±æç´¢ï¼command + shift + oï¼ï¼file.confï¼
å¯ä»¥çå°æ¥åºäºå¾å¤file.confæ件ï¼ä½æ¯å¾å¤é½æ¯å¨testç®å½ä¸ï¼è¯å®ä¸æ¯æ们æ³è¦çï¼étestç®å½æ两个file.confæ件ï¼æ件ç®å½åå«ä¸ºï¼â
âscript/client/confâ
ââãâ
âconfig/seata-config/core/src/main/resourcesâ
ââï¼åå 为â
âscript/â
ââç®å½æ¯ä¸ä¸ªä½¿ç¨seata-serveræ¶éè¦çä¸äºä¿¡æ¯ç®å½ï¼æ以éå®â
âconfig/seata-config/core/src/main/resourcesâ
âç®å½ï¼ç¶åå¯¹å ¶ååºå¿ è¦ä¿®æ¹ï¼å æ¬seata-serverçæ°æ®åå¨æ¹å¼éç¨DBãregisty.confåæ ·æä½ï¼
è¿è¡é¡¹ç®ååç°ï¼é 置并没æçæï¼å 为seata-serverçæ°æ®åå¨æ¹å¼ä¾æ§éç¨é»è®¤çfileï¼
seata-server
è¿å ¥å°seata-serverç®å½ï¼å¯ä»¥åç°è¿æ¯ä¸ä¸ªSpringBoot项ç®ï¼å ¶ä¸å æ¬äºä¸ä¸ªâ
âapplication.example.ymlâ
âæ件ï¼
â
âapplication.example.ymlâ
âæ件ä¸é¨åå 容å¦ä¸ï¼
è¿ä¸ªä¸å°±æ¯å¨file.confä¸é ç½®çseata-serverçæ°æ®åå¨æ¹å¼åï¼æ们大èæ¨æµIDEAä¸æ¬å°è¿è¡seata-serveræ¶ï¼é 置信æ¯éè¦åå¨application.ymlæ件ä¸ï¼ç¤ºä¾å 容å¦ä¸ï¼
server:
port: 7091
spring:
application:
name: seata-server
logging:
config: classpath:logback-spring.xml
file:
path: ${user.home}/logs/seata
console:
user:
username: seata
password: seata
seata:
server:
service-port: 8091 #If not configured, the default is '${server.port} + 1000'
max-commit-retry-timeout: -1
max-rollback-retry-timeout: -1
rollback-retry-timeout-unlock-enable: false
enable-check-auth: true
enable-parallel-request-handle: true
retry-dead-threshold: 130000
xaer-nota-retry-timeout: 60000
recovery:
handle-all-session-period: 1000
undo:
log-save-days: 7
log-delete-period: 86400000
session:
branch-async-queue-size: 5000 #branch async remove queue size
enable-branch-async-remove: false #enable to asynchronous remove branchSession
config:
# support: nacos ã consul ã apollo ã zk ã etcd3
type: file
registry:
type: file
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
store:
# support: file ã db ã redis
mode: db
session:
mode: db
lock:
mode: db
file:
dir: sessionStore
max-branch-session-size: 16384
max-global-session-size: 512
file-write-buffer-cache-size: 16384
session-reload-read-size: 100
flush-disk-mode: async
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/seata_server?rewriteBatchedStatements=true
user: root
password: 123456
min-conn: 5
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 100
max-wait: 5000
redis:
mode: single
database: 0
min-conn: 1
max-conn: 10
password:
max-total: 100
query-limit: 100
single:
host: 127.0.0.1
port: 6379
sentinel:
master-name:
sentinel-hosts:
metrics:
enabled: false
registry-type: compact
exporter-list: prometheus
exporter-prometheus-port: 9898
transport:
rpc-tc-request-timeout: 30000
enable-tc-server-batch-send-response: false
shutdown:
wait: 3
thread-factory:
boss-thread-prefix: NettyBoss
worker-thread-prefix: NettyServerNIOWorker
boss-thread-size: 1
è¿éæä¸ç¹æ¯è¾æææï¼
- å¦ææ们没æé
ç½®seata-serveréä¿¡ï¼nettyï¼ç端å£å·ï¼åé»è®¤ä¸ºâ
ââï¼å½ç¶å¦ææ们ä¸é ç½®ï¼ç±äºââ${server.port} + 1000â
âé»è®¤æ¯7091ï¼æ以seata-serveréä¿¡ï¼nettyï¼ç端å£å·é»è®¤ä¸º8091ãâserver.portâ
3ãè¿è¡seata-server
seata-server项ç®æ¯ä¸ä¸ªæ£å¸¸çSpringBoot项ç®ï¼å°±ç´æ¥æç §è¿è¡SpringBootçæ¹å¼è¿è¡å ¶å³å¯ï¼
å¨â
âServerâ
âç±»ä¸æ个端ç¹ï¼éªè¯æ们对seata-serverçé ç½®æ¯å¦çæï¼
è¿è¡ç»æå¦æ们é¢æï¼seata-serverçæ°æ®æ¨¡å¼ä¿®æ¹ä¸ºäºdbï¼