springboot整合dubbo整合seata实现分布式事务

一、seata简介

seata官网:

https://github.com/seata/seata

二、seata整合dubbo

2.1 seata整合nacos

file.conf 修改为db
registry.conf 修改为 nacos
​
sh ${SEATAPATH}/script/config-center/nacos/nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 5a3c7d6c-f497-4d68-a71a-2e5e3340b3ca
​
seata-server.bat -p 8081

 

2.2 下载数据库脚本

https://github.com/seata/seata/tree/1.2.0/script/client/at/db  
-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
    `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT COMMENT 'increment id',
    `branch_id`     BIGINT(20)   NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(100) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME     NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME     NOT NULL COMMENT 'modify datetime',
    PRIMARY KEY (`id`),
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

2.3 demo

主要maven依赖


    com.alibaba.cloud
    spring-cloud-starter-alibaba-seata
    2.2.1.RELEASE

配置

#consumer配置:
dubbo:
  application:
    name: dubbo-consumer
  consumer:
    check: false
    filter: rpcFilter
  protocol:
    name: dubbo
    port: 20881
    accesslog: dubbo-acccess.log
  registry:
    address: zookeeper://localhost:2181
    check: true
    group: dubbo-seata
    simplified: true
  metadata-report:
    address: zookeeper://localhost:2181
    retry-times: 30
    cycle-report: false
    group: dubbo-seata
  scan:
    base-packages: top.happylaishop.consumer.service
  monitor:
    protocol: registry
seata:
  tx-service-group: seata-dubbo-group
  service:
    grouplist:
      default: 127.0.0.1:8091
    vgroup-mapping:
      blade-seata-order-group: default
    disable-global-transaction: false
  client:
    rm:
      report-success-enable: false
      
#producer
dubbo:
  provider:
    filter: rpcFilter
  application:
    name: dubbo-producer
  protocol:
    name: dubbo
    port: 20880
    accesslog: dubbo-acccess.log
  registry:
    address: zookeeper://localhost:2181
    check: true
    group: dubbo-seata
    simplified: true
  metadata-report:
    address: zookeeper://localhost:2181
    retry-times: 30
    cycle-report: false
    group: dubbo-seata
  scan:
    base-packages: top.happylaishop.producer.service
  monitor:
    protocol: registry
seata:
  tx-service-group: seata-dubbo-group
  service:
    grouplist:
      default: 127.0.0.1:8091
    vgroup-mapping:
      blade-seata-storage-group: default
    disable-global-transaction: false
  client:
    rm:
      report-success-enable: false

controller配置

/**
使用@GlobalTransactional开启事务
在业务的发起方的方法上使用@GlobalTransactional开启全局事务,Seata 会将事务的 xid 通过拦截器添加到调用其他服务的请求中,实现分布式事务
*/
@RestController
public class BaseController {
​
    @Autowired
    private BaseService baseService;
    @Reference(loadbalance = "roundrobin", timeout = 30000,mock = "")
    private RpcService rpcService;
​
    @RequestMapping("saveRpc")
    @GlobalTransactional
    public BaseResponse test(@RequestBody RpcDto rpcDto){
        return rpcService.save (rpcDto);
    }
}
​
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.seata.spring.annotation.GlobalTransactional;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import top.happylaishop.api.dto.BaseResponse;
import top.happylaishop.api.dto.ListRestResponse;
import top.happylaishop.api.dto.rpc.RpcDto;
import top.happylaishop.api.service.RpcService;
import top.happylaishop.producer.mapper.RpcMapper;
import top.happylaishop.producer.model.Rpc;
​
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
​
@Service
public class RpcServiceImpl implements RpcService {
​
    @Autowired
    private RpcMapper rpcMapper;
​
    @GlobalTransactional
    public BaseResponse saveRpc(RpcDto rpcDto) {
        save(rpcDto);
        int a = 0;
        a = 1/0;
        return BaseResponse.success ();
    }
​
    @Override
    public BaseResponse save(RpcDto rpcDto) {
        rpcDto.setCreateTime (new Date ());
        rpcDto.setUpdateTime (new Date ());
        Rpc rpcDb = new Rpc ();
        BeanUtils.copyProperties (rpcDto, rpcDb);
        rpcMapper.insert (rpcDb);
        return BaseResponse.success ();
    }
}

 

你可能感兴趣的:(dubbo,seata)