开发者社区 > 云原生 > 中间件 > 正文

用seata-spring-boot-starter,要自己处理xid的传递问题吗?

用seata-spring-boot-starter,要自己处理xid的传递问题吗?

展开
收起
叫我饭啊啊 2022-12-16 16:44:47 951 0
1 条回答
写回答
取消 提交回答
  • 当前依赖,全局事务XID,不需要手动进行绑定,自动进行传递

    <dependency>
                <groupId>com.alibaba.cloud</groupId>
                &lt;!&ndash;加入spring-cloud-alibaba-seata,解决xid不传递问题&ndash;&gt;
                <artifactId>spring-cloud-alibaba-seata</artifactId>
                <version>2.2.0.RELEASE</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.seata</groupId>
                        <artifactId>seata-spring-boot-starter</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>io.seata</groupId>
                        <artifactId>seata-all</artifactId>
                    </exclusion>
                </exclusions>
    </dependency>
    
    

    全局事务XID需要通过过滤器或拦截器进行手动绑定,否则下游服务获取不到全局XID回滚不了

    <dependency>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
                <version>1.3.0</version>
                <!-- 这里需要排除自身的seata-all -->
                <exclusions>
                    <exclusion>
                        <artifactId>seata-all</artifactId>
                        <groupId>io.seata</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- 导入与之前下载的seata版本一致的包 -->
            <dependency>
                <groupId>io.seata</groupId>
                <artifactId>seata-all</artifactId>
                <version>1.3.0</version>
            </dependency>
    
    

    OpenFeign进行手动传递XID

    @Component
    public class FeignConfiguration implements RequestInterceptor {
    
        @Override
        public void apply(RequestTemplate requestTemplate) {
            requestTemplate.header("XID", RootContext.getXID());
        }
    }
    
    

    提供者手动绑定XID

    @Component
    public class SeataFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            //手动绑定XID
            String xid = request.getHeader("XID");
            if(StringUtils.isNotBlank(xid)){
                RootContext.bind(xid);
            }
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
    
    
    2022-12-16 23:49:57
    赞同 展开评论 打赏
问答标签:
问答地址:

为企业提供高效、稳定、易扩展的中间件产品。

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载