1.适用范围
1.使用docker for windows搭建Nacos 1.2.0
2.使用docker for windows搭建Seata 1.2.0
3.使用windows环境搭建mysql 5.7
3.本地工程环境JDK 8
2.重要说明
1.Seata 0.0.9-Seata 1.2.0每个版本都有各自的玩法,千万不要用1.2.0的方式去玩1.0.0,会坑死人。
2.各个配置里面的IP要求很有讲究,需要关注。
3.搭建Nacos
这个就不详细讲了,甩两个命令就好了:
docker pull nacos/nacos-server:1.2.0##这个是单机模式启动,要注意这里搞集群是个坑点docker run -d --env MODE=standalone -p 8848:8848 --name nacos nacos/nacos-server:1.2.0
访问界面:
http:localhost:8848/nacos/index.html#账号密码是默认的:nacos/nacos
4.导入Seata配置到Nacos
在1.0.0之前的版本经常在服务端和客户端都会看到两个文件file.conf、registry.conf两个文件.在1.2.0玩法里面,集成nacos的配置中心之后,服务端可以省略file.conf,客户端可以省掉file.conf,并且客户端在application.yml增加一些配置后还可以省略registry.conf,使用nacos里面的配置即可。
在1.2.0里面不继承nacos是否可以沿用file.conf、registry.conf文件?官网是说是可以的。
如何导入seata配置至nacos呢?先把官网上的代码下载下来:
https://github.com/seata/seata/tree/1.2.0
seata-1.2.0/script/config-center下的config.txt是计划导入的配置。
seata-1.2.0/script/config-center/nacos下的脚本是导入配置的执行脚本,不需要修改,直接用。
config.txt里面的配置有很多,等同于以前的file.conf:
#transport开头不用管,默认配置,具体见官网transport.type=TCPtransport.server=NIOtransport.heartbeat=truetransport.enableClientBatchSendRequest=falsetransport.threadFactory.bossThreadPrefix=NettyBosstransport.threadFactory.workerThreadPrefix=NettyServerNIOWorkertransport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandlertransport.threadFactory.shareBossWorker=falsetransport.threadFactory.clientSelectorThreadPrefix=NettyClientSelectortransport.threadFactory.clientSelectorThreadSize=1transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThreadtransport.threadFactory.bossThreadSize=1transport.threadFactory.workerThreadSize=defaulttransport.shutdown.wait=3#service开头的是客户端需要加载的配置service.vgroupMapping.my_test_tx_group=defaultservice.default.grouplist=127.0.0.1:8091service.enableDegrade=falseservice.disableGlobalTransaction=false#client开头的是客户端需要加载的配置client.rm.asyncCommitBufferLimit=10000client.rm.lock.retryInterval=10client.rm.lock.retryTimes=30client.rm.lock.retryPolicyBranchRollbackOnConflict=trueclient.rm.reportRetryCount=5client.rm.tableMetaCheckEnable=falseclient.rm.sqlParserType=druidclient.rm.reportSuccessEnable=falseclient.rm.sagaBranchRegisterEnable=falseclient.tm.commitRetryCount=5client.tm.rollbackRetryCount=5#数据的存储模式,mode有很多种,这个直接去查,这里采用db存储store.mode=dbstore.file.dir=file_store/datastore.file.maxBranchSessionSize=16384store.file.maxGlobalSessionSize=512store.file.fileWriteBufferCacheSize=16384store.file.flushDiskMode=asyncstore.file.sessionReloadReadSize=100store.db.datasource=druidstore.db.dbType=mysqlstore.db.driverClassName=com.mysql.jdbc.Driverstore.db.url=jdbc:mysql://10.16.84.178:3306/seata?useUnicode=truestore.db.user=rootstore.db.password=rootstore.db.minConn=5store.db.maxConn=30store.db.globalTable=global_tablestore.db.branchTable=branch_tablestore.db.queryLimit=100store.db.lockTable=lock_tablestore.db.maxWait=5000#下面的都不清楚,默认配置server.recovery.committingRetryPeriod=1000server.recovery.asynCommittingRetryPeriod=1000server.recovery.rollbackingRetryPeriod=1000server.recovery.timeoutRetryPeriod=1000server.maxCommitRetryTimeout=-1server.maxRollbackRetryTimeout=-1server.rollbackRetryTimeoutUnlockEnable=falseclient.undo.dataValidation=trueclient.undo.logSerialization=jacksonserver.undo.logSaveDays=7server.undo.logDeletePeriod=86400000client.undo.logTable=undo_logclient.log.exceptionRate=100transport.serialization=seatatransport.compressor=nonemetrics.enabled=falsemetrics.registryType=compactmetrics.exporterList=prometheusmetrics.exporterPrometheusPort=9898
这里面有几个配置是需要修改的,并且比较坑,单独拿出来说说:
#这个不用改,my_test_tx_group代表的分组,my_test_tx_group这个很重要,很多地方要用,default在初学者上手时也不要改service.vgroupMapping.my_test_tx_group=default#这个不用改service.default.grouplist=127.0.0.1:8091#数据库的地址,因为我使用的window本机的mysql,容器访问需要使用本地ip,不能使用localhost/127.0.0.1,会导致访问失败store.db.url=jdbc:mysql://10.16.84.178:3306/seata?useUnicode=truestore.db.user=rootstore.db.password=root
修改完成后,点击nacos-config.sh进行导入。
成功后会提示:
init nacos config finished, please start seata-server
5.启动Seata
5.1建数据库
把seata-1.2.0/script/server/db拿出来执行就行,数据库配置注意与上文的几个配置相符:
store.db.url=jdbc:mysql://10.16.84.178:3306/seata?useUnicode=truestore.db.user=rootstore.db.password=root
5.2.启动Seata
由于使用docker搭建,我们又需要集成nacos,需要外部加载配置文件。
先对配置文件进行修改,主要修改registry.conf。
建议从源码直接拿,seata-1.2.0/server/src/main/resources下:
registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa#type修改为nacostype = "nacos"nacos {#这个不要改application = "seata-server"#这个由于是docker内部访问,使用容器ip访问nacosserverAddr = "172.17.0.2:8848"namespace = ""#这个不要改cluster = "default"username = ""password = ""}eureka {serviceUrl = "http://localhost:8761/eureka"application = "default"weight = "1"}redis {serverAddr = "localhost:6379"db = 0password = ""cluster = "default"timeout = 0}zk {cluster = "default"serverAddr = "127.0.0.1:2181"sessionTimeout = 6000connectTimeout = 2000username = ""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#修改为nacostype = "nacos"nacos {#这个由于是docker内部访问,使用容器ip访问nacosserverAddr = "172.17.0.2:8848"#这个不要改,nacos-config.sh导入配置时的工作空间就是publicnamespace = "public"#这个不要改,nacos-config.sh导入配置时的分组就是SEATA_GROUPgroup = "SEATA_GROUP"username = "nacos"password = "nacos"}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 = 6000connectTimeout = 2000username = ""password = ""}etcd3 {serverAddr = "http://localhost:2379"}file {name = "file:/root/seata-config/file.conf"}}
完成配置修改后,以外部文件共享的形式启动docker:
docker run --name seata-server -p 8091:8091 -h 10.16.84.178 -e SEATA_CONFIG_NAME=file:/root/seata-config/registry -v F:\kuafu\seata-server-1.2.0\seata\conf:/root/seata-config seataio/seata-server:1.2.0
详细说说这个:
-h 10.16.84.178这个一定要改为本地ip,使用localhost/127.0.0.1这两个会导致程序解析为容器ip,从而导致工程启动的时候直连容器ip失败。
-e SEATA_CONFIG_NAME=file:/root/seata-config/registry 这个不用改,意思是设置seata容器加载配置的别名。
-v F:\kuafu\seata-server-1.2.0\seata\conf:/root/seata-config这个是代表宿主机registry.conf配置目录F:\kuafu\seata-server-1.2.0\seata\conf与即将新建的容器目录/root/seata-config 共享。
2020-12-25 12:33:04.961 INFO [main]io.seata.server.ParameterParser.init:90 -The server is running in container.2020-12-25 12:33:05.023 INFO [main]io.seata.config.FileConfiguration.<init>:110 -The configuration file used is file:/root/seata-config/registry.conf2020-12-25 12:33:05.736 INFO [main]io.seata.core.rpc.netty.RpcServerBootstrap.start:155 -Server started ...2020-12-25 12:33:07.045 INFO [ServerHandlerThread_1_500]io.seata.core.rpc.DefaultServerMessageListenerImpl.onRegRmMessage:127 -RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://127.0.0.1/seata_storage', applicationId='seata-storage-service', transactionServiceGroup='my_test_tx_group'},channel:[id: 0x54f789b7, L:/172.17.0.3:8091 - R:/172.17.0.1:56952]
启动成功日志如上,没有全部打印出来,说明有模块未加载成功。
可以使用docker exec -it seata-server /bin/sh进去查看日志。
6.启动工程
6.1pom配置
#nacos依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>#seata依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><artifactId>seata-all</artifactId><groupId>io.seata</groupId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.2.0</version></dependency>
不要使用spring-cloud-starter-alibaba-seata自带的io.seata,谁用谁知道,坑!
另外有个没搞明白的地方,工程不需要导入nacos的配置中心依赖???奇怪了。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
6.2yml设置
server:port: 2001spring:application:#这个与seata无关,只影响注册至nacos的服务名name: seata-order-servicecloud:nacos:discovery:#Nacos注册中心地址server-addr: localhost:8848alibaba:seata:#分组命名,需要与上文关联tx-service-group: my_test_tx_groupdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1/seata_order?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=trueusername: rootpassword: root# type: com.alibaba.druid.pool.DruidDataSourcefeign:hystrix:enabled: truelogging:level:io:seata: infomybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.yangluyao.springcloud.domain#seata:# tx-service-group: fsptxgroup# registry:# nacos:# server-addr: localhost:8848##seata配置,相当于registry.confseata:client:support:spring:datasource-autoproxy: false#分组命名,需要与上文关联tx-service-group: my_test_tx_groupservice:disable-global-transaction: false#service:grouplist一个map数组,需要key-value方式读取,所以grouplist下面,是一个key-value的读取方式,否则会报unconvert to map<String,String>异常。另外有人说需要改成本地ip,我没改也没事,大家注意下grouplist:default: 127.0.0.1:8091#注册类型registry:type: nacos#nacos地址nacos:server-addr: localhost:8848config:nacos:server-addr: localhost:8848type: nacos
6.3代码配置
在业务代码执行入口添加
@GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
name = "fsp-create-order"保证唯一即可。
其他的就不多说了,工程构造有需要可以查询官网:
http://seata.io/zh-cn/docs/user/quickstart.htmlhttps://github.com/seata/seata-samples
6.4工程启动
2020-12-25 21:01:31.987 INFO 3640 --- [ main] i.s.c.r.netty.NettyClientChannelManager : will connect to 10.16.84.178:80912020-12-25 21:01:31.988 INFO 3640 --- [ main] io.seata.core.rpc.netty.RmRpcClient : RM will register :jdbc:mysql://127.0.0.1/seata_account2020-12-25 21:01:31.989 INFO 3640 --- [ main] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:RMROLE,address:10.16.84.178:8091,msg:< RegisterRMRequest{resourceIds='jdbc:mysql://127.0.0.1/seata_account', applicationId='seata-account-service', transactionServiceGroup='my_test_tx_group'} >2020-12-25 21:01:32.272 INFO 3640 --- [ main] io.seata.core.rpc.netty.RmRpcClient : register RM success. server version:1.2.0,channel:[id: 0x81129b53, L:/10.16.84.178:61526 - R:/10.16.84.178:8091]2020-12-25 21:01:32.278 INFO 3640 --- [ main] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 48 ms, version:1.2.0,role:RMROLE,channel:[id: 0x81129b53, L:/10.16.84.178:61526 - R:/10.16.84.178:8091]2020-12-25 21:01:33.525 INFO 3640 --- [ main] o.s.cloud.commons.util.InetUtils : Cannot determine local hostname
看到如上的信息才代表注册成功。
6.5额外说明
网上有很多信息来辅助搭建,推荐几个网址:
https://blog.csdn.net/sinat_38670641/article/details/105857484?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.controlhttps://blog.csdn.net/VincentGTX_huang/article/details/106499162?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.controlhttps://blog.csdn.net/qq_38163309/article/details/105561185https://github.com/seata/seata/issues




