Merge pull request #686 from flystar32/master

fix loadbalance feignclient seata info
pull/710/head
format 6 years ago committed by GitHub
commit 97602ef03c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -35,49 +35,44 @@ import org.springframework.util.StringUtils;
*/ */
public class SeataFeignClient implements Client { public class SeataFeignClient implements Client {
private final Client delegate; private final Client delegate;
private final BeanFactory beanFactory; private final BeanFactory beanFactory;
private static final int MAP_SIZE = 16; private static final int MAP_SIZE = 16;
SeataFeignClient(BeanFactory beanFactory) { SeataFeignClient(BeanFactory beanFactory) {
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
this.delegate = new Client.Default(null, null); this.delegate = new Client.Default(null, null);
} }
SeataFeignClient(BeanFactory beanFactory, Client delegate) { SeataFeignClient(BeanFactory beanFactory, Client delegate) {
this.delegate = delegate; this.delegate = delegate;
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
} }
@Override @Override
public Response execute(Request request, Request.Options options) throws IOException { 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 { private Request getModifyRequest(Request request) {
return this.delegate.execute(modifiedRequest, options);
} finally {
} String xid = RootContext.getXID();
}
private Request getModifyRequest(Request request) { if (StringUtils.isEmpty(xid)) {
return request;
}
String xid = RootContext.getXID(); Map<String, Collection<String>> headers = new HashMap<>(MAP_SIZE);
headers.putAll(request.headers());
if (StringUtils.isEmpty(xid)) { List<String> fescarXid = new ArrayList<>();
return request; fescarXid.add(xid);
} headers.put(RootContext.KEY_XID, fescarXid);
Map<String, Collection<String>> headers = new HashMap<>(MAP_SIZE); return Request.create(request.method(), request.url(), headers, request.body(),
headers.putAll(request.headers()); request.charset());
}
List<String> fescarXid = new ArrayList<>();
fescarXid.add(xid);
headers.put(RootContext.KEY_XID, fescarXid);
return Request.create(request.method(), request.url(), headers, request.body(),
request.charset());
}
} }

@ -65,7 +65,7 @@ public class SeataFeignClientAutoConfiguration {
protected static class FeignBeanPostProcessorConfiguration { protected static class FeignBeanPostProcessorConfiguration {
@Bean @Bean
SeataBeanPostProcessor seataBeanPostProcessor( SeataBeanPostProcessor seataBeanPostProcessor(
SeataFeignObjectWrapper seataFeignObjectWrapper) { SeataFeignObjectWrapper seataFeignObjectWrapper) {
return new SeataBeanPostProcessor(seataFeignObjectWrapper); return new SeataBeanPostProcessor(seataFeignObjectWrapper);
} }

@ -32,7 +32,7 @@ public class SeataFeignContext extends FeignContext {
private final FeignContext delegate; private final FeignContext delegate;
SeataFeignContext(SeataFeignObjectWrapper seataFeignObjectWrapper, SeataFeignContext(SeataFeignObjectWrapper seataFeignObjectWrapper,
FeignContext delegate) { FeignContext delegate) {
this.seataFeignObjectWrapper = seataFeignObjectWrapper; this.seataFeignObjectWrapper = seataFeignObjectWrapper;
this.delegate = delegate; this.delegate = delegate;
} }

@ -17,7 +17,13 @@
package org.springframework.cloud.alibaba.seata.feign; package org.springframework.cloud.alibaba.seata.feign;
import java.io.IOException; 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.beans.factory.BeanFactory;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
@ -26,23 +32,27 @@ import feign.Request;
import feign.Response; import feign.Response;
import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient;
import org.springframework.util.StringUtils;
/** /**
* @author xiaojing * @author xiaojing
*/ */
public class SeataLoadBalancerFeignClient extends LoadBalancerFeignClient { public class SeataLoadBalancerFeignClient extends LoadBalancerFeignClient {
private static final int MAP_SIZE = 16;
private final BeanFactory beanFactory; private final BeanFactory beanFactory;
SeataLoadBalancerFeignClient(Client delegate, SeataLoadBalancerFeignClient(Client delegate,
CachingSpringLoadBalancerFactory lbClientFactory, CachingSpringLoadBalancerFactory lbClientFactory,
SpringClientFactory clientFactory, BeanFactory beanFactory) { SpringClientFactory clientFactory, BeanFactory beanFactory) {
super(wrap(delegate, beanFactory), lbClientFactory, clientFactory); super(wrap(delegate, beanFactory), lbClientFactory, clientFactory);
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
} }
@Override @Override
public Response execute(Request request, Request.Options options) throws IOException { public Response execute(Request request, Request.Options options) throws IOException {
Request modifiedRequest = getModifyRequest(request);
return super.execute(request, options); return super.execute(request, options);
} }
@ -50,4 +60,22 @@ public class SeataLoadBalancerFeignClient extends LoadBalancerFeignClient {
return (Client) new SeataFeignObjectWrapper(beanFactory).wrap(delegate); return (Client) new SeataFeignObjectWrapper(beanFactory).wrap(delegate);
} }
private Request getModifyRequest(Request request) {
String xid = RootContext.getXID();
if (StringUtils.isEmpty(xid)) {
return request;
}
Map<String, Collection<String>> headers = new HashMap<>(MAP_SIZE);
headers.putAll(request.headers());
List<String> fescarXid = new ArrayList<>();
fescarXid.add(xid);
headers.put(RootContext.KEY_XID, fescarXid);
return Request.create(request.method(), request.url(), headers, request.body(),
request.charset());
}
} }

Loading…
Cancel
Save