码云地址:https://gitee.com/jessyxu/yc-seata-server

一.镜像构建前确保自己的seata-server 能够启动成功!

seata-server

一 部署前准备

1.1 导入数据库脚本

方式一:

/script/server/db/mysql.sql导入数据库中

方式二:

yc-database项目中的/java微服务/{version}/nacos-mysql.sql导入数据库中

1.2 修改配置文件
注册至Nacos

打开/conf/application.yml配置文件,找到第11行,修改Nacos相关配置,如下所示

spring:
  application:
    name: seata-server
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:30099
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
读取nacos上的配置

打开/conf/application.yml配置文件,找到第46行,如下所示,

seata-server.properties为Nacos的配置

seata:
  config:
    # support: nacos 、 consul 、 apollo 、 zk  、 etcd3
    type: nacos
    nacos:
      # nacos ip地址
      server-addr: ${spring.cloud.nacos.discovery.server-addr}
      group: DEFAULT_GROUP
      namespace:
      username: "nacos"
      password: "nacos"
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key: ""
      #secret-key: ""
      # 读取nacos上的配置文件
      data-id: seata-server.properties
1.3 增加Nacos配置

打开Nacos控制台并登录,依次点击【配置管理】-【配置列表】-【public】,点击右侧【+】,

  • Data ID:seata-server (注意:和上述1.2中读取nacos上的配置中的data-id名称保持一致)
  • Group:默认即可
  • 配置格式:Properties (注意:和上述1.2中读取nacos上的配置中的data-id格式保持一致)
  • 配置内容:复制/script/config-center/config.txt所有内容,并做如下调整
# 第26行
#######事务分组名#######
service.vgroupMapping.default_tx_group=default

# 第28行
#######Seata服务地址#######
service.default.grouplist=127.0.0.1:30095

# 第69-71
######mode改成db模式(根据实际场景修改)######
store.mode=db
store.lock.mode=db
store.session.mode=db

# 第86-89行
######MySQL配置内容######
store.db.datasource=druid
store.db.dbType=mysql
# MySQL5.7.x 驱动为com.mysql.jdbc.Driver,MySQL8.0.x驱动为com.mysql.cj.jdbc.Driver
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/yc_nacos?characterEncoding=utf8&rewriteBatchedStatements=true&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
store.db.user=username
store.db.password=password

二、启动、停止操作

2.1 Windows环境
  • 启动:双击seata-server.bat
  • 停止:双击shutdown.bat
2.2 Linux环境
# 启动
sh startup.sh

# 停止
sh shutdown.sh

三 访问控制台

  • 访问地址: http://127.0.0.1:30095
  • 用户名:seata
  • 密码:seata

四 常见问题

如果直接使用官方下载的安装包并在JDK11环境下运行,需要将bin/seata-server.sh文件中第132行替换成如下内容

JAVA_MAJOR_VERSION=$($JAVACMD -version 2>&1 | head -1 | cut -d'"' -f2 | sed 's/^1\.//' | cut -d'.' -f1)

二、构建docker镜像

nacos 配置文件如下

构建自己专属seata-server 镜像(分布式事务)?(第二篇)-LMLPHP

#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
transport.serialization=seata
transport.compressor=none

#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:30095
service.enableDegrade=false
service.disableGlobalTransaction=false

#Transaction rule configuration, only for the client
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.undo.dataValidation=true
client.undo.logSerialization=kryo
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h

#Log rule configuration, for client and server
log.exceptionRate=100

#Transaction storage configuration, only for the server. The file, DB, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db
#Used for password encryption
store.publicKey=

#If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block.
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100

#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://10.0.2.211:31190/nacos_dev?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
store.db.user=nacos
store.db.password=nacos
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000

#These configurations are required if the `store mode` is `redis`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `redis`, you can remove the configuration block.
store.redis.mode=single
store.redis.single.host=10.0.2.211
store.redis.single.port=31120
store.redis.sentinel.masterName=
store.redis.sentinel.sentinelHosts=
store.redis.maxConn=10
store.redis.minConn=1
store.redis.maxTotal=100
store.redis.database=0
store.redis.password=123qwe##
store.redis.queryLimit=100

#Transaction rule configuration, only for the server
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.distributedLockExpireTime=10000
server.xaerNotaRetryTimeout=60000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=false

#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

docker镜像源码目录结构,请参看本文的资源

构建自己专属seata-server 镜像(分布式事务)?(第二篇)-LMLPHP

构建docker 运行配置

构建自己专属seata-server 镜像(分布式事务)?(第二篇)-LMLPHP

构建日志

Sending build context to Docker daemon…
[==================================================>] 130.1MB
Done

Step 1/12 : FROM openjdk:8u232-jre-stretch
 ---> b3f3caa5767c
Step 2/12 : LABEL maintainer="Seata <seata.io>"
 ---> Using cache
 ---> b0097c486d2f
Step 3/12 : WORKDIR /$BASE_DIR
 ---> Using cache
 ---> 0f0989dffd45
Step 4/12 : ADD bin/ /seata-server/bin
 ---> Using cache
 ---> cf3e4e1c8999
Step 5/12 : ADD ext/ /seata-server/ext
 ---> Using cache
 ---> 950ef7efe613
Step 6/12 : ADD target/ /seata-server/target
 ---> Using cache
 ---> ce72c7af1f96
Step 7/12 : ADD lib/ /seata-server/lib
 ---> Using cache
 ---> 3805cc58ad95
Step 8/12 : ADD conf/ /seata-server/conf
 ---> Using cache
 ---> e88a16b691b6
Step 9/12 : ADD LICENSE /seata-server/LICENSE
 ---> Using cache
 ---> 2b0d5c93750e
Step 10/12 : ENV LOADER_PATH="/seata-server/lib"
 ---> Using cache
 ---> 61d27642c102
Step 11/12 : ENV TZ="Asia/Shanghai"
 ---> Using cache
 ---> 50c76acd87c7
Step 12/12 : CMD ["bash","-c","/seata-server/bin/seata-server.sh && tail -f /dev/null"]
 ---> Using cache
 ---> 5ba8681944cd

Successfully built 5ba8681944cd
Successfully tagged yc-seata-server:1.0.0
Creating container…
Container Id: 0d315169c09de2a3cef87d3dcab37a5b6bb054ba875d798e1b6569c02447b483
Container name: 'yc-seata-server'
Starting container 'yc-seata-server'
'yc-seata-server Dockerfile: dockerfile/1spring-cloud-alibaba/yc-seata-server/Dockerfile' has been deployed successfully.

启动日志

apm-skywalking not enabled
2023-12-13T02:20:17.130679960Z JMX disabled
2023-12-13T02:20:17.135467210Z /usr/local/openjdk-8/bin/java  -Dlog.home=/root/logs/seata -server -Dloader.path=/seata-server/lib -Xmx2048m -Xms2048m -Xss640k -XX:SurvivorRatio=10 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=1024m -XX:-OmitStackTraceInFastThrow -XX:-UseAdaptiveSizePolicy -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/logs/seata/java_heapdump.hprof -XX:+DisableExplicitGC -Xloggc:/root/logs/seata/seata_gc.log -verbose:gc -XX:+PrintGCDetails  -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -Dio.netty.leakDetectionLevel=advanced -Dapp.name=seata-server -Dapp.pid=7 -Dapp.home=/seata-server -Dbasedir=/seata-server  -Dspring.config.additional-location=/seata-server/conf/ -Dspring.config.location=/seata-server/conf/application.yml -Dlogging.config=/seata-server/conf/logback-spring.xml -jar /seata-server/target/seata-server.jar  >> /dev/null 2>&1 &
2023-12-13T02:20:17.135748459Z seata-server is starting, you can check the /root/logs/seata/ *.log

启动页面

构建自己专属seata-server 镜像(分布式事务)?(第二篇)-LMLPHP

12-13 13:56