From 4626e229dd3068928e4a3d2f5219ae8418375efd Mon Sep 17 00:00:00 2001 From: flystar32 Date: Thu, 30 May 2019 16:57:55 +0800 Subject: [PATCH] fix loadbalance feignclient seata info --- .../alibaba/seata/feign/SeataFeignClient.java | 63 +++++++++---------- .../SeataFeignClientAutoConfiguration.java | 2 +- .../seata/feign/SeataFeignContext.java | 2 +- .../feign/SeataLoadBalancerFeignClient.java | 32 +++++++++- 4 files changed, 61 insertions(+), 38 deletions(-) diff --git a/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignClient.java b/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignClient.java index 9f4f2fb2e..cf71842d8 100644 --- a/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignClient.java +++ b/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignClient.java @@ -35,49 +35,44 @@ import org.springframework.util.StringUtils; */ public class SeataFeignClient implements Client { - private final Client delegate; - private final BeanFactory beanFactory; - private static final int MAP_SIZE = 16; + private final Client delegate; + private final BeanFactory beanFactory; + private static final int MAP_SIZE = 16; - SeataFeignClient(BeanFactory beanFactory) { - this.beanFactory = beanFactory; - this.delegate = new Client.Default(null, null); - } + SeataFeignClient(BeanFactory beanFactory) { + this.beanFactory = beanFactory; + this.delegate = new Client.Default(null, null); + } - SeataFeignClient(BeanFactory beanFactory, Client delegate) { - this.delegate = delegate; - this.beanFactory = beanFactory; - } + SeataFeignClient(BeanFactory beanFactory, Client delegate) { + this.delegate = delegate; + this.beanFactory = beanFactory; + } - @Override - public Response execute(Request request, Request.Options options) throws IOException { + @Override + public Response execute(Request request, Request.Options options) throws IOException { - Request modifiedRequest = getModifyRequest(request); + Request modifiedRequest = getModifyRequest(request); + return this.delegate.execute(modifiedRequest, options); + } - try { - return this.delegate.execute(modifiedRequest, options); - } finally { + private Request getModifyRequest(Request request) { - } - } + String xid = RootContext.getXID(); - private Request getModifyRequest(Request request) { + if (StringUtils.isEmpty(xid)) { + return request; + } - String xid = RootContext.getXID(); + Map> headers = new HashMap<>(MAP_SIZE); + headers.putAll(request.headers()); - if (StringUtils.isEmpty(xid)) { - return request; - } + List fescarXid = new ArrayList<>(); + fescarXid.add(xid); + headers.put(RootContext.KEY_XID, fescarXid); - Map> headers = new HashMap<>(MAP_SIZE); - headers.putAll(request.headers()); - - List fescarXid = new ArrayList<>(); - fescarXid.add(xid); - headers.put(RootContext.KEY_XID, fescarXid); - - return Request.create(request.method(), request.url(), headers, request.body(), - request.charset()); - } + return Request.create(request.method(), request.url(), headers, request.body(), + request.charset()); + } } \ No newline at end of file diff --git a/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignClientAutoConfiguration.java b/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignClientAutoConfiguration.java index 5440dc732..030b6b943 100644 --- a/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignClientAutoConfiguration.java +++ b/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignClientAutoConfiguration.java @@ -65,7 +65,7 @@ public class SeataFeignClientAutoConfiguration { protected static class FeignBeanPostProcessorConfiguration { @Bean - SeataBeanPostProcessor seataBeanPostProcessor( + SeataBeanPostProcessor seataBeanPostProcessor( SeataFeignObjectWrapper seataFeignObjectWrapper) { return new SeataBeanPostProcessor(seataFeignObjectWrapper); } diff --git a/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignContext.java b/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignContext.java index 4b8c16e77..c90ac4d44 100644 --- a/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignContext.java +++ b/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataFeignContext.java @@ -32,7 +32,7 @@ public class SeataFeignContext extends FeignContext { private final FeignContext delegate; SeataFeignContext(SeataFeignObjectWrapper seataFeignObjectWrapper, - FeignContext delegate) { + FeignContext delegate) { this.seataFeignObjectWrapper = seataFeignObjectWrapper; this.delegate = delegate; } diff --git a/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataLoadBalancerFeignClient.java b/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataLoadBalancerFeignClient.java index 991ee166d..598d1a283 100644 --- a/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataLoadBalancerFeignClient.java +++ b/spring-cloud-alibaba-seata/src/main/java/org/springframework/cloud/alibaba/seata/feign/SeataLoadBalancerFeignClient.java @@ -17,7 +17,13 @@ package org.springframework.cloud.alibaba.seata.feign; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import io.seata.core.context.RootContext; import org.springframework.beans.factory.BeanFactory; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; @@ -26,23 +32,27 @@ import feign.Request; import feign.Response; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; +import org.springframework.util.StringUtils; /** * @author xiaojing */ public class SeataLoadBalancerFeignClient extends LoadBalancerFeignClient { + private static final int MAP_SIZE = 16; + private final BeanFactory beanFactory; SeataLoadBalancerFeignClient(Client delegate, - CachingSpringLoadBalancerFactory lbClientFactory, - SpringClientFactory clientFactory, BeanFactory beanFactory) { + CachingSpringLoadBalancerFactory lbClientFactory, + SpringClientFactory clientFactory, BeanFactory beanFactory) { super(wrap(delegate, beanFactory), lbClientFactory, clientFactory); this.beanFactory = beanFactory; } @Override public Response execute(Request request, Request.Options options) throws IOException { + Request modifiedRequest = getModifyRequest(request); return super.execute(request, options); } @@ -50,4 +60,22 @@ public class SeataLoadBalancerFeignClient extends LoadBalancerFeignClient { return (Client) new SeataFeignObjectWrapper(beanFactory).wrap(delegate); } + private Request getModifyRequest(Request request) { + + String xid = RootContext.getXID(); + + if (StringUtils.isEmpty(xid)) { + return request; + } + + Map> headers = new HashMap<>(MAP_SIZE); + headers.putAll(request.headers()); + + List fescarXid = new ArrayList<>(); + fescarXid.add(xid); + headers.put(RootContext.KEY_XID, fescarXid); + + return Request.create(request.method(), request.url(), headers, request.body(), + request.charset()); + } }