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

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

展开
收起
叫我饭啊啊 2022-12-16 16:44:47 1022 分享 版权
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
    赞同 展开评论
问答标签:
问答地址:

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

收录在圈子:
+ 订阅
阿里云中间件主要有包含这么几个: 分布式关系型数据库DRDS_水平拆分 做数据库扩展性的 、消息队列MQ 是做消息的中间件、企业级分布式应用服务EDAS 做分布式服务的、还有一些其他的中间件,比如配置服务、缓存等等。
还有其他疑问?
咨询AI助理