seata使用

入门和使用

官网地址:http://seata.io/zh-cn/index.html

百度搜索一些文章

使用方法

非常简单,在service服务的接口上添加@GlobalTransactional注解即可

引入依赖

引入cloud alibaba依赖 折叠原码

1

2

3

4

5

6

7

8

9

dependencyManagement {

    imports {

        mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)

        mavenBom('org.springframework.cloud:spring-cloud-dependencies:Greenwich.RELEASE') {//Greenwich.SR1

            bomProperty 'okhttp3.version''3.12.0'

        }

        mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:2.2.0.RELEASE"

    }

}

seata依赖 折叠原码

1

2

3

4

5

//引入seata第三方jar

compile ("com.alibaba.cloud:spring-cloud-starter-alibaba-seata"){

    exclude group: 'io.seata', module: 'seata-spring-boot-starter'

}

compile group: 'io.seata', name: 'seata-spring-boot-starter', version: '1.4.0'

配置文件

seata配置 折叠原码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#seata分布式事务配置

seata:

  tx-service-group: newBoss_tx_group

  registry:

    #注册中心类型

    type: nacos

    nacos:

      server-addr: ${NACOS_ADDR:10.0.250.106:8848}

      username: nacos

      password: nacos

      namespace: ${SEATA_NAMESPACE:newBoss-seata}

  service:

    vgroupMapping:

      #事务群组,newBoss_tx_group为分组,配置项值为TC集群名

      newBoss_tx_group: default

  config:

    #配置中心类型

    type: nacos

    nacos:

      serverAddr: ${NACOS_ADDR:10.0.250.106:8848}

      namespace: ${SEATA_NAMESPACE:newBoss-seata}

      group: SEATA_GROUP

      username: nacos

      password: nacos

注意事项

1.使用原版本的oracle驱动,引入seata后会报错,所以需要升级驱动,依赖如下:

oracle驱动

compile group: 'com.oracle.ojdbc', name: 'ojdbc8', version: '19.3.0.0'

compile group: 'com.oracle.ojdbc', name: 'orai18n', version: '19.3.0.0'

2.在新BOSS中,只有一个主库,其余的用户都是建立的同义词或者视图,如果用户中没有对应数据,seata操作时会报错,报schema找不到相关错误

在seata中操作数据时,会拼接  用户.表名等逻辑,所以需要主动设置schema信息,否则就会找当前微服务设置的用户

schema 展开原码

以上方式不可取,新的解决方案如下:

另外,需要在nacos配置中心上面配置全局schema的值,在common-platform中增加globalSchema变量,值为主库的用户名。

以后现场中也可以直接配置为主库的用户名即可。

3.在所有下游服务中,在启动类中增加SeataXIDFilter.class拦截器

seata 折叠原码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

package com.star.boss.dubbo.session.filter;

import io.seata.core.context.RootContext;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.util.StringUtils;

import javax.ws.rs.container.ContainerRequestContext;

import javax.ws.rs.container.ContainerRequestFilter;

import javax.ws.rs.container.ContainerResponseContext;

import javax.ws.rs.container.ContainerResponseFilter;

import java.io.IOException;

public class SeataXIDFilter implements ContainerRequestFilter, ContainerResponseFilter {

    private static  final Logger LOGGER = LoggerFactory.getLogger(SeataXIDFilter.class);

    @Override

    public void filter(ContainerRequestContext requestContext) throws IOException {

        bindXID(requestContext.getHeaderString(RootContext.KEY_XID));

    }

    @Override

    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        unbindXID(requestContext.getHeaderString(RootContext.KEY_XID));

    }

//    @Override

//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

//                             Object handler) {

//

//        bindXID(request.getHeader(RootContext.KEY_XID));

//

//        return true;

//    }

    private void bindXID(String rpcXid ) {

        String xid = RootContext.getXID();

        if (LOGGER.isDebugEnabled()) {

            LOGGER.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid);

        }

        if (xid == null && rpcXid != null) {

            RootContext.bind(rpcXid);

            if (LOGGER.isDebugEnabled()) {

                LOGGER.debug("bind {} to RootContext", rpcXid);

            }

        }

    }

    private void unbindXID(String rpcXid){

        if (StringUtils.isEmpty(rpcXid)) {

            return;

        }

        String unbindXid = RootContext.unbind();

        if (LOGGER.isDebugEnabled()) {

            LOGGER.debug("unbind {} from RootContext", unbindXid);

        }

        if (!rpcXid.equalsIgnoreCase(unbindXid)) {

            LOGGER.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid);

            if (unbindXid != null) {

                RootContext.bind(unbindXid);

                LOGGER.warn("bind {} back to RootContext", unbindXid);

            }

        }

    }

}

 4.nacos中配置服务url的地方,需要将值改为空

Feign 折叠原码

1

2

3

4

@FeignClient(name = MODULE.NAME, path = MODULE.JAXRS_PATH, url = MODULE.URL, primary = false, contextId = "jaxrs")

@Consumes({MediaType.APPLICATION_JSON})

@Produces({MediaType.APPLICATION_JSON})

@Path("/account")

5.在每个微服务中的application.yml里面,spring.profiles.include中加上一个seata

配置 折叠原码

1

2

3

spring:

  profiles:

    include: tomcat, jpa, mybatis, rest, feign, redis,  task, actuator, seata, common

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值