- seata分布式事物下游不能回滚的问题; 初步分析headers中TX_XID 没有传给下游系统
通过拦截器打印上游服务日志和下游服务日志打印,影响上游服务不能传header 中自定意义参数的地方是启用线程的熔断策略。
feign:
hystrix:
enabled: false #不启用
client:
config:
default:
connectTimeout: 10000
readTimeout: 60000
loggerLevel: basic
okhttp:
enabled: true
httpclient:
enabled: false
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE # 信号量
容器内,运行arthas服务, 监控seata服务内的方法请求参数打印
watch com.alibaba.cloud.seata.feign.SeataFeignClient getModifyRequest '{params,returnObj,throwExp}' -n 5 -x 5 >> arthas_0.log
watch com.zhkj.saas.ims.service.warehouse.impl.InputWarehouseOrderServiceImpl takeOffStockIntransitQuantity '{params,returnObj,throwExp}' -n 5 -x 5
```
private Request getModifyRequest(Request request) {
String xid = RootContext.getXID();
if (StringUtils.isEmpty(xid)) {
return request;
}
Map<String, Collection> headers = new HashMap<>(MAP_SIZE);
headers.putAll(request.headers());
List<String> seataXid = new ArrayList<>();
seataXid.add(xid);
headers.put(RootContext.KEY_XID, seataXid);
return Request.create(request.method(), request.url(), headers, request.body(),
request.charset());
}
从上图可以分析出来,TX_TID是有值并且放入headers中,从上图日志标红出可以发现,调用服务是域名地址:http://platform-ims-service.box-tools.com:80/client/warehouse/outputWarehouseOrder/save 。可以分析域名会经过k8s 的ingress 的nginx 服务。可能涉及没有透传下游服务。解决方案:调整服务注册nacos方式,不指定域名注册。默认使用ip:port 进行注册即可