From e8e49ff39b81004f0bc58ede0e90b2083393731e Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Fri, 6 Mar 2020 22:44:27 +0800 Subject: [PATCH] upgrade Seata and Spring Cloud Version --- pom.xml | 20 ++--- spring-cloud-alibaba-dependencies/pom.xml | 2 +- .../src/main/resources/application.properties | 7 +- .../src/main/resources/application.properties | 5 +- .../src/main/resources/file.conf | 4 - .../src/main/resources/registry.conf | 73 ------------------- .../src/main/resources/application.properties | 7 +- .../src/main/resources/application.properties | 7 +- .../SeataFeignBlockingLoadBalancerClient.java | 66 ++--------------- .../seata/feign/SeataFeignObjectWrapper.java | 31 ++------ .../feign/SeataLoadBalancerFeignClient.java | 46 ++---------- .../feign/SentinelContractHolder.java | 4 +- .../DubboServiceBeanMetadataResolver.java | 4 +- ...ubboTransportedMethodMetadataResolver.java | 2 +- 14 files changed, 51 insertions(+), 227 deletions(-) delete mode 100644 spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/file.conf delete mode 100644 spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/registry.conf diff --git a/pom.xml b/pom.xml index 33db9094..ac929206 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.springframework.cloud spring-cloud-build - 2.2.0.RELEASE + 2.2.2.RELEASE @@ -73,15 +73,15 @@ - 2.2.0.RELEASE - 2.2.0.RELEASE - 2.2.0.RELEASE - 2.2.0.RELEASE - 2.2.0.RELEASE - Horsham.RELEASE - 2.2.0.RELEASE - 2.2.0.RELEASE - 2.2.0.RELEASE + 2.2.2.RELEASE + 2.2.2.RELEASE + 2.2.2.RELEASE + 2.2.1.RELEASE + 2.2.2.RELEASE + Horsham.SR3 + 2.2.2.RELEASE + 2.2.2.RELEASE + 2.2.1.RELEASE 4.12 3.0 diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index e3df8f5c..f0f0148a 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -20,7 +20,7 @@ 1.7.1 3.1.0 - 1.0.0 + 1.1.0 1.2.0 0.8.0 1.0.9 diff --git a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/application.properties b/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/application.properties index 3362a705..d5f73adf 100644 --- a/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/seata-example/account-service/src/main/resources/application.properties @@ -5,7 +5,7 @@ spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.datasource.name="accountDataSource" spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://xxx:3306/fescar?useSSL=false&serverTimezone=UTC +spring.datasource.url=jdbc:mysql://xxx:3306/seata?useSSL=false&serverTimezone=UTC spring.datasource.username=xxx spring.datasource.password=xxx spring.datasource.druid.max-active=20 @@ -13,8 +13,9 @@ spring.datasource.druid.min-idle=2 spring.datasource.druid.initial-size=2 seata.enabled=true -seata.service.vgroup-mapping=default -seata.service.grouplist=127.0.0.1:8091 +spring.cloud.alibaba.seata.tx-service-group=account-service +seata.service.vgroup-mapping.account-service=default +seata.service.grouplist.default=127.0.0.1:8091 seata.service.disable-global-transaction=false ## if use registry center diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties index 5bb78b60..e1fc1c85 100644 --- a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties @@ -9,8 +9,9 @@ spring.cloud.nacos.discovery.server-addr=localhost:8848 logging.level.io.seata=debug seata.enabled=true -seata.service.vgroup-mapping=default -seata.service.grouplist=127.0.0.1:8091 +spring.cloud.alibaba.seata.tx-service-group=business-service +seata.service.vgroup-mapping.business-service=default +seata.service.grouplist.default=127.0.0.1:8091 seata.service.disable-global-transaction=false spring.cloud.loadbalancer.ribbon.enabled=true diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/file.conf b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/file.conf deleted file mode 100644 index a0fd5dd8..00000000 --- a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/file.conf +++ /dev/null @@ -1,4 +0,0 @@ -service { - #disable - disableGlobalTransaction = false -} \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/registry.conf b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/registry.conf deleted file mode 100644 index b98f5704..00000000 --- a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/registry.conf +++ /dev/null @@ -1,73 +0,0 @@ -registry { - # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - cluster = "default" - } - eureka { - serviceUrl = "http://localhost:8761/eureka" - application = "default" - weight = "1" - } - redis { - serverAddr = "localhost:6379" - db = "0" - } - zk { - cluster = "default" - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - consul { - cluster = "default" - serverAddr = "127.0.0.1:8500" - } - etcd3 { - cluster = "default" - serverAddr = "http://localhost:2379" - } - sofa { - serverAddr = "127.0.0.1:9603" - application = "default" - region = "DEFAULT_ZONE" - datacenter = "DefaultDataCenter" - cluster = "default" - group = "SEATA_GROUP" - addressWaitTime = "3000" - } - file { - name = "file.conf" - } -} - -config { - # file、nacos 、apollo、zk、consul、etcd3 - type = "file" - - nacos { - serverAddr = "localhost" - namespace = "" - } - consul { - serverAddr = "127.0.0.1:8500" - } - apollo { - app.id = "seata-server" - apollo.meta = "http://192.168.1.204:8801" - } - zk { - serverAddr = "127.0.0.1:2181" - session.timeout = 6000 - connect.timeout = 2000 - } - etcd3 { - serverAddr = "http://localhost:2379" - } - file { - name = "file.conf" - } -} diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/application.properties b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/application.properties index 31248d2e..fb4a4b7c 100644 --- a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/resources/application.properties @@ -5,7 +5,7 @@ spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.datasource.name="orderDataSource" spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://xxx:3306/fescar?useSSL=false&serverTimezone=UTC +spring.datasource.url=jdbc:mysql://xxx:3306/seata?useSSL=false&serverTimezone=UTC spring.datasource.username=xxx spring.datasource.password=xxx spring.datasource.druid.max-active=20 @@ -13,8 +13,9 @@ spring.datasource.druid.min-idle=2 spring.datasource.druid.initial-size=2 seata.enabled=true -seata.service.vgroup-mapping=default -seata.service.grouplist=127.0.0.1:8091 +spring.cloud.alibaba.seata.tx-service-group=business-service +seata.service.vgroup-mapping.business-service=default +seata.service.grouplist.default=127.0.0.1:8091 seata.service.disable-global-transaction=false ## if use registry center diff --git a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/application.properties b/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/application.properties index 3372daec..a2bd463a 100644 --- a/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/seata-example/storage-service/src/main/resources/application.properties @@ -5,7 +5,7 @@ spring.cloud.nacos.discovery.server-addr=localhost:8848 spring.datasource.name="storageDataSource" spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver -spring.datasource.url=jdbc:mysql://xxx:3306/fescar?useSSL=false&serverTimezone=UTC +spring.datasource.url=jdbc:mysql://xxx:3306/seata?useSSL=false&serverTimezone=UTC spring.datasource.username=xxx spring.datasource.password=xxx spring.datasource.druid.max-active=20 @@ -14,8 +14,9 @@ spring.datasource.druid.initial-size=2 seata.enabled=true -seata.service.vgroup-mapping=default -seata.service.grouplist=127.0.0.1:8091 +spring.cloud.alibaba.seata.tx-service-group=business-service +seata.service.vgroup-mapping.business-service=default +seata.service.grouplist.default=127.0.0.1:8091 seata.service.disable-global-transaction=false ## if use registry center diff --git a/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignBlockingLoadBalancerClient.java b/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignBlockingLoadBalancerClient.java index 3ad4a09a..b504ccc8 100644 --- a/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignBlockingLoadBalancerClient.java +++ b/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignBlockingLoadBalancerClient.java @@ -17,79 +17,29 @@ package com.alibaba.cloud.seata.feign; import java.io.IOException; -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; import feign.Client; import feign.Request; import feign.Response; -import io.seata.core.context.RootContext; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; -import org.springframework.http.HttpStatus; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; +import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; /** * @author yuhuangbin */ -public class SeataFeignBlockingLoadBalancerClient implements Client { +public class SeataFeignBlockingLoadBalancerClient + extends FeignBlockingLoadBalancerClient { - private static final Log LOG = LogFactory - .getLog(SeataFeignBlockingLoadBalancerClient.class); - - private final Client delegate; - - private final BlockingLoadBalancerClient loadBalancerClient; - - SeataFeignBlockingLoadBalancerClient(Client delegate, - BlockingLoadBalancerClient loadBalancerClient) { - this.delegate = delegate; - this.loadBalancerClient = loadBalancerClient; + public SeataFeignBlockingLoadBalancerClient(Client delegate, + BlockingLoadBalancerClient loadBalancerClient, + SeataFeignObjectWrapper seataFeignObjectWrapper) { + super((Client) seataFeignObjectWrapper.wrap(delegate), loadBalancerClient); } @Override public Response execute(Request request, Request.Options options) throws IOException { - final URI originalUri = URI.create(request.url()); - String serviceId = originalUri.getHost(); - Assert.state(serviceId != null, - "Request URI does not contain a valid hostname: " + originalUri); - ServiceInstance instance = loadBalancerClient.choose(serviceId); - if (instance == null) { - String message = "Load balancer does not contain an instance for the service " - + serviceId; - if (LOG.isWarnEnabled()) { - LOG.warn(message); - } - return Response.builder().request(request) - .status(HttpStatus.SERVICE_UNAVAILABLE.value()) - .body(message, StandardCharsets.UTF_8).build(); - } - String reconstructedUrl = loadBalancerClient.reconstructURI(instance, originalUri) - .toString(); - Request newRequest = Request.create(request.httpMethod(), reconstructedUrl, - enrichRequstHeader(request.headers()), request.requestBody()); - - return delegate.execute(newRequest, options); - } - - private Map> enrichRequstHeader( - Map> headers) { - String xid = RootContext.getXID(); - if (!StringUtils.isEmpty(xid)) { - Map> newHeaders = new HashMap<>(); - newHeaders.putAll(headers); - newHeaders.put(RootContext.KEY_XID, Arrays.asList(xid)); - return newHeaders; - } - return headers; + return super.execute(request, options); } } diff --git a/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignObjectWrapper.java b/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignObjectWrapper.java index 8846fefb..ae505058 100644 --- a/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignObjectWrapper.java +++ b/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataFeignObjectWrapper.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.seata.feign; -import java.lang.reflect.Field; - import feign.Client; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -25,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanFactory; import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; +import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; @@ -50,36 +49,18 @@ public class SeataFeignObjectWrapper { if (bean instanceof LoadBalancerFeignClient) { LoadBalancerFeignClient client = ((LoadBalancerFeignClient) bean); return new SeataLoadBalancerFeignClient(client.getDelegate(), factory(), - clientFactory(), this.beanFactory); + clientFactory(), this); } - if (bean.getClass().getName().equals( - "org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient")) { - return new SeataFeignBlockingLoadBalancerClient(getClient(bean), - beanFactory.getBean(BlockingLoadBalancerClient.class)); + if (bean instanceof FeignBlockingLoadBalancerClient) { + FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) bean; + return new SeataFeignBlockingLoadBalancerClient(client.getDelegate(), + beanFactory.getBean(BlockingLoadBalancerClient.class), this); } return new SeataFeignClient(this.beanFactory, (Client) bean); } return bean; } - private Client getClient(Object bean) { - Field client = null; - boolean oldAccessible = false; - try { - client = bean.getClass().getDeclaredField("delegate"); - oldAccessible = client.isAccessible(); - client.setAccessible(true); - return (Client) client.get(bean); - } - catch (Exception e) { - LOG.error("get delegate client error", e); - } - finally { - client.setAccessible(oldAccessible); - } - return null; - } - CachingSpringLoadBalancerFactory factory() { if (this.cachingSpringLoadBalancerFactory == null) { this.cachingSpringLoadBalancerFactory = this.beanFactory diff --git a/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java b/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java index bc93c3db..8204fed8 100644 --- a/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java +++ b/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/SeataLoadBalancerFeignClient.java @@ -17,66 +17,32 @@ package com.alibaba.cloud.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 feign.Client; import feign.Request; import feign.Response; -import io.seata.core.context.RootContext; -import org.springframework.beans.factory.BeanFactory; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; -import org.springframework.util.StringUtils; /** * @author xiaojing + * @author yuhuangbin */ 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) { - super(wrap(delegate, beanFactory), lbClientFactory, clientFactory); - this.beanFactory = beanFactory; + SpringClientFactory clientFactory, + SeataFeignObjectWrapper seataFeignObjectWrapper) { + super((Client) seataFeignObjectWrapper.wrap(delegate), lbClientFactory, + clientFactory); } @Override public Response execute(Request request, Request.Options options) throws IOException { - Request modifiedRequest = getModifyRequest(request); - return super.execute(modifiedRequest, options); - } - - private static Client wrap(Client delegate, BeanFactory beanFactory) { - 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 seataXid = new ArrayList<>(); - seataXid.add(xid); - headers.put(RootContext.KEY_XID, seataXid); - - return Request.create(request.method(), request.url(), headers, request.body(), - request.charset()); + return super.execute(request, options); } } diff --git a/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelContractHolder.java b/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelContractHolder.java index 9a5acfd3..4c16165d 100644 --- a/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelContractHolder.java +++ b/spring-cloud-starter-alibaba/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/feign/SentinelContractHolder.java @@ -45,8 +45,8 @@ public class SentinelContractHolder implements Contract { } @Override - public List parseAndValidatateMetadata(Class targetType) { - List metadatas = delegate.parseAndValidatateMetadata(targetType); + public List parseAndValidateMetadata(Class targetType) { + List metadatas = delegate.parseAndValidateMetadata(targetType); metadatas.forEach(metadata -> METADATA_MAP .put(targetType.getName() + metadata.configKey(), metadata)); return metadatas; diff --git a/spring-cloud-starter-alibaba/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java b/spring-cloud-starter-alibaba/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java index 8ae2d4f2..9613e99c 100644 --- a/spring-cloud-starter-alibaba/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java +++ b/spring-cloud-starter-alibaba/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/resolver/DubboServiceBeanMetadataResolver.java @@ -141,7 +141,7 @@ public class DubboServiceBeanMetadataResolver Class targetType) { List methodMetadataList = Collections.emptyList(); try { - methodMetadataList = contract.parseAndValidatateMetadata(targetType); + methodMetadataList = contract.parseAndValidateMetadata(targetType); } catch (Throwable ignored) { // ignore @@ -153,7 +153,7 @@ public class DubboServiceBeanMetadataResolver * Select feign contract methods *

* extract some code from - * {@link Contract.BaseContract#parseAndValidatateMetadata(java.lang.Class)}. + * {@link Contract.BaseContract#parseAndValidateMetadata(Class)}. * @param targetType class of type * @return non-null */ diff --git a/spring-cloud-starter-alibaba/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/resolver/DubboTransportedMethodMetadataResolver.java b/spring-cloud-starter-alibaba/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/resolver/DubboTransportedMethodMetadataResolver.java index b5834adb..2dc19461 100644 --- a/spring-cloud-starter-alibaba/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/resolver/DubboTransportedMethodMetadataResolver.java +++ b/spring-cloud-starter-alibaba/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/resolver/DubboTransportedMethodMetadataResolver.java @@ -90,7 +90,7 @@ public class DubboTransportedMethodMetadataResolver { private Map resolveRestRequestMetadataMap( Class targetType) { - return contract.parseAndValidatateMetadata(targetType).stream().collect(Collectors + return contract.parseAndValidateMetadata(targetType).stream().collect(Collectors .toMap(feign.MethodMetadata::configKey, this::restMethodMetadata)); }