springboot + dubbo + nacos + seata 快速集成

Seata

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务,下面我们以最快的速度搭建springboot + dubbo + seata 的demo

1.首先下载seatea最新的安装包,路径如下

https://github.com/seata/seata/releases/

2.解压并配置Seata

首先进入conf/文件夹

打开registry.conf文件,

可以看到默认配置的是读取file和注册到file,我们将其都改为nacos,下面展示主要配置位置,大家按照自己的nacos进行具体配置

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "file"

  nacos {
    application = "seata-server"
    serverAddr = "127.0.0.1:8848"
    group = "SEATA_GROUP"
    namespace = "74fe7825-bbb9-4723-b73e-e9182c903cec"
    cluster = "default"
    username = "nacos"
    password = "nacos"
  }

.
.//省略其他配置
.
}

config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = "74fe7825-bbb9-4723-b73e-e9182c903cec"
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
    dataId = "seataServer.properties"
  }
.
.//省略其他配置
.
}

3.加载默认配置参数到nacos

1)下载配置文件

 地址:https://github.com/seata/seata/blob/develop/script/config-center/config.txt

下载后,放于seata-server-x.x.x\下,

打开文件将没有配置的项删除或赋值,否则会执行失败,下面是我自己执行成功的一份文件

transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=true
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
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
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=false
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
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
store.mode=file
store.lock.mode=file
store.session.mode=file
store.publicKey=seata12345
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
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=123456
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
store.redis.mode=single
store.redis.single.host=127.0.0.1
store.redis.single.port=6379
store.redis.maxConn=10
store.redis.minConn=1
store.redis.maxTotal=100
store.redis.database=0
store.redis.password=123456
store.redis.queryLimit=100
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
client.undo.dataValidation=true
client.undo.logSerialization=jackson
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
log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

正确配置其中service.default.grouplist=127.0.0.1:8091配置的是seata-server的地址

2下载执行脚本

地址:https://github.com/seata/seata/blob/develop/script/config-center/nacos/nacos-config.sh

放于放于seata-server-x.x.x\bin下

修改其中的nacos配置为实际值

#!/usr/bin/env bash
# Copyright 1999-2019 Seata.io Group.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at、
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

while getopts ":h:p:g:t:u:w:" opt
do
  case $opt in
  h)
    host=$OPTARG
    ;;
  p)
    port=$OPTARG
    ;;
  g)
    group=$OPTARG
    ;;
  t)
    tenant=$OPTARG
    ;;
  u)
    username=$OPTARG
    ;;
  w)
    password=$OPTARG
    ;;
  ?)
    echo " USAGE OPTION: $0 [-h host] [-p port] [-g group] [-t tenant] [-u username] [-w password] "
    exit 1
    ;;
  esac
done

urlencode() {
  for ((i=0; i < ${#1}; i++))
  do
    char="${1:$i:1}"
    case $char in
    [a-zA-Z0-9.~_-]) printf $char ;;
    *) printf '%%%02X' "'$char" ;;
    esac
  done
}

if [[ -z ${host} ]]; then
    host="127.0.0.1"
fi
if [[ -z ${port} ]]; then
    port=8848
fi
if [[ -z ${group} ]]; then
    group="SEATA_GROUP"
fi
if [[ -z ${tenant} ]]; then
    tenant="74fe7825-bbb9-4723-b73e-e9182c903cec"
fi
if [[ -z ${username} ]]; then
    username="nacos"
fi
if [[ -z ${password} ]]; then
    password="nacos"
fi

nacosAddr=$host:$port
contentType="content-type:application/json;charset=UTF-8"

echo "set nacosAddr=$nacosAddr"
echo "set group=$group"

failCount=0
tempLog=$(mktemp -u)
function addConfig() {
  curl -X POST -H "${contentType}" "http://$nacosAddr/nacos/v1/cs/configs?dataId=$(urlencode $1)&group=$group&content=$(urlencode $2)&tenant=$tenant&username=$username&password=$password" >"${tempLog}" 2>/dev/null
  if [[ -z $(cat "${tempLog}") ]]; then
    echo " Please check the cluster status. "
    exit 1
  fi
  if [[ $(cat "${tempLog}") =~ "true" ]]; then
    echo "Set $1=$2 successfully "
  else
    echo "Set $1=$2 failure "
    (( failCount++ ))
  fi
}

count=0
for line in $(cat $(dirname "$PWD")/config.txt | sed s/[[:space:]]//g); do
  (( count++ ))
	key=${line%%=*}
    value=${line#*=}
	addConfig "${key}" "${value}"
done

echo "========================================================================="
echo " Complete initialization parameters,  total-count:$count ,  failure-count:$failCount "
echo "========================================================================="

if [[ ${failCount} -eq 0 ]]; then
	echo " Init nacos config finished, please start seata-server. "
else
	echo " init nacos config fail. "
fi

修改后,直接执行,如果是在windows环境下,可以通过Git Bash运行,运行成功如下

4.启动seata-server

直接运行 seata-server-x.x.x\bin\seata-server.bat或seata-server-x.x.x\bin\seata-server.sh即可

5.下载seated的demo案例

下载地址:https://github.com/seata/seata-samples

6.配置springboot-dubbo-seata

分别配置samples-account samples-business samples-order samples-storage下的

application.properties和registry.conf

application.properties主要修改nacos配置

registry.conf可以从seata-server的conf下复制过来

7.下面按照官方的说明文档去运行demo就可以了

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用SpringBoot + Dubbo框架的项目中集成Seata,需要进行以下步骤: 1. 添加Seata的相关依赖 在项目的pom.xml文件中添加Seata的相关依赖: ```xml <dependency> <groupId>io.seata</groupId> <artifactId>seata-all</artifactId> <version>${seata.version}</version> </dependency> ``` 2. 配置Seata的注册中心 在项目的application.properties或application.yml文件中添加Seata的注册中心配置,例如: ```yaml spring: cloud: alibaba: seata: tx-service-group: my_test_tx_group config: type: nacos nacos: server-addr: localhost:8848 namespace: seata registry: type: nacos nacos: server-addr: localhost:8848 application: seata-server ``` 其中,tx-service-group是Seata的事务组名称,config和registry是Seata的注册中心配置,这里使用的是Nacos作为注册中心,也可以使用其他的注册中心。 3. 配置DubboSeata拦截器 在Dubbo的服务提供方和服务消费方中都需要添加Seata的拦截器,以实现分布式事务的管理。在SpringBoot + Dubbo框架中,可以通过配置文件或注解的方式来添加Seata的拦截器。 (1)配置文件方式 在Dubbo的服务提供方和服务消费方的application.properties或application.yml文件中添加Seata的拦截器配置,例如: ```yaml # 服务提供方 dubbo.provider.filter=seata # 服务消费方 dubbo.consumer.filter=seata ``` (2)注解方式 在Dubbo的服务提供方和服务消费方的实现类中,使用@DubboService和@DubboReference注解来定义Dubbo服务,同时在@DubboService和@DubboReference注解中添加filter属性来指定Seata的拦截器,例如: ```java // 服务提供方 @DubboService(version = "1.0.0", filter = {"seata"}) public class OrderServiceImpl implements OrderService { // ... } // 服务消费方 public class UserServiceImpl implements UserService { @DubboReference(version = "1.0.0", filter = {"seata"}) private OrderService orderService; // ... } ``` 4. 编写分布式事务代码 在Dubbo的服务提供方和服务消费方中,通过Seata提供的API来实现分布式事务的管理,例如: ```java // 服务提供方 @Service public class OrderServiceImpl implements OrderService { @Override @GlobalTransactional public void createOrder(Order order) { // 保存订单信息 orderMapper.insert(order); // 扣减库存 storageService.reduceStock(order.getProductId(), order.getCount()); // 扣减余额 accountService.reduceBalance(order.getUserId(), order.getMoney()); } } // 服务消费方 @Service public class UserServiceImpl implements UserService { @DubboReference(version = "1.0.0") private OrderService orderService; @Override @GlobalTransactional public void createUser(User user, Order order) { // 注册用户 userMapper.insert(user); // 创建订单 orderService.createOrder(order); } } ``` 在以上代码中,使用@GlobalTransactional注解来标记分布式事务的范围,Seata会根据这个注解来创建全局事务,并在所有涉及到的服务中进行事务的协调和管理。 综上所述,以上就是在SpringBoot + Dubbo框架中使用Seata进行分布式事务管理的步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值