From a2dd2dea1e2fcc08ec0bfd67c18235825095600e Mon Sep 17 00:00:00 2001 From: SkyeBeFreeman <928016560@qq.com> Date: Fri, 11 Mar 2022 21:34:33 +0800 Subject: [PATCH] feat:Support multi-discovery server. --- pom.xml | 2 +- spring-cloud-tencent-dependencies/pom.xml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../PolarisFeignClientAutoConfiguration.java | 10 +- .../common/constant/ContextConstant.java | 47 +++++++ .../pom.xml | 19 ++- .../context/PolarisConfigModifier.java | 13 +- .../context/PolarisContextConfiguration.java | 10 +- .../context/PolarisContextProperties.java | 4 + .../consul/ConsulContextProperties.java | 126 ++++++++++++++++++ 10 files changed, 225 insertions(+), 14 deletions(-) create mode 100644 spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java create mode 100644 spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/extend/consul/ConsulContextProperties.java diff --git a/pom.xml b/pom.xml index d94ca8ec..3848ac85 100644 --- a/pom.xml +++ b/pom.xml @@ -71,7 +71,7 @@ - 1.1.4.Hoxton.SR9 + 1.2.0.Hoxton.SR9-SNAPSHOT Hoxton.SR9 diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 766f91f7..60165c6d 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -62,8 +62,8 @@ - 1.1.4.Hoxton.SR9 - 1.2.4 + 1.2.0.Hoxton.SR9-SNAPSHOT + 1.3.0-SNAPSHOT 10.0.0-M6 2.0.0 diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml index c40c2101..c681f756 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml @@ -13,9 +13,7 @@ spring: enabled: true discovery: register: true - health-check-path: /actuator/health - health-check-interval: 10s - instance-id: ${spring.application.name}:${server.port} + instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} enabled: true service-name: ${spring.application.name} ip-address: localhost diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/PolarisFeignClientAutoConfiguration.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/PolarisFeignClientAutoConfiguration.java index f5b67702..1ecbbcea 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/PolarisFeignClientAutoConfiguration.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/PolarisFeignClientAutoConfiguration.java @@ -17,6 +17,9 @@ package com.tencent.cloud.polaris.circuitbreaker; +import static org.springframework.core.Ordered.HIGHEST_PRECEDENCE; + +import com.tencent.cloud.common.constant.ContextConstant.ModifierOrder; import com.tencent.cloud.polaris.circuitbreaker.feign.PolarisFeignBeanPostProcessor; import com.tencent.cloud.polaris.context.PolarisConfigModifier; import com.tencent.cloud.polaris.context.PolarisContextConfiguration; @@ -32,8 +35,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; -import static org.springframework.core.Ordered.HIGHEST_PRECEDENCE; - /** * Configuration for Polaris {@link feign.Feign} which can automatically bring in the call results for reporting * @@ -71,5 +72,10 @@ public class PolarisFeignClientAutoConfiguration { //开启熔断配置 configuration.getConsumer().getCircuitBreaker().setEnable(true); } + + @Override + public int getOrder() { + return ModifierOrder.CIRCUIT_BREAKER_ORDER; + } } } diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java b/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java new file mode 100644 index 00000000..3436b661 --- /dev/null +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java @@ -0,0 +1,47 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.common.constant; + +/** + * Constant for Context. + * + * @author skyehtzhang + */ +public interface ContextConstant { + + /** + * Order of configuration modifier. + */ + interface ModifierOrder { + + /** + * First modifier order. + */ + Integer FIRST = Integer.MIN_VALUE; + + /** + * Last modifier order. + */ + Integer LAST = Integer.MAX_VALUE; + + /** + * Order of circuit breaker configuration modifier. + */ + Integer CIRCUIT_BREAKER_ORDER = 1; + } +} diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/pom.xml b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/pom.xml index f8455a28..c4ecedb8 100644 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/pom.xml @@ -1,6 +1,6 @@ - spring-cloud-tencent-starters @@ -37,6 +37,21 @@ connector-polaris-grpc + + com.tencent.polaris + connector-polaris-grpc + + + + com.tencent.polaris + connector-consul + + + + com.tencent.polaris + connector-composite + + com.tencent.polaris diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisConfigModifier.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisConfigModifier.java index 5ab47d2c..f977bebb 100644 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisConfigModifier.java +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisConfigModifier.java @@ -20,14 +20,23 @@ package com.tencent.cloud.polaris.context; import com.tencent.polaris.factory.config.ConfigurationImpl; /** + * Modifier interface for polaris configuration. + * * @author Haotian Zhang */ public interface PolarisConfigModifier { /** - * 修改配置对象 + * Modify configuration. * - * @param configuration 配置对象 + * @param configuration */ void modify(ConfigurationImpl configuration); + + /** + * Get modifier order for sorting. + * + * @return order + */ + int getOrder(); } diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextConfiguration.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextConfiguration.java index 2d30e46b..3a2f5c8d 100644 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextConfiguration.java +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextConfiguration.java @@ -17,6 +17,8 @@ package com.tencent.cloud.polaris.context; +import com.tencent.cloud.common.constant.ContextConstant.ModifierOrder; +import com.tencent.cloud.polaris.context.extend.consul.ConsulContextProperties; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.client.api.SDKContext; import com.tencent.polaris.factory.config.ConfigurationImpl; @@ -34,7 +36,7 @@ import org.springframework.context.annotation.Bean; * * @author Haotian Zhang */ -@EnableConfigurationProperties(PolarisContextProperties.class) +@EnableConfigurationProperties({PolarisContextProperties.class, ConsulContextProperties.class}) public class PolarisContextConfiguration { private static final String ADDRESS_SEPARATOR = ","; @@ -63,6 +65,11 @@ public class PolarisContextConfiguration { } } + @Override + public int getOrder() { + return ModifierOrder.FIRST; + } + private List getAddressList(String addressInfo) { List addressList = new ArrayList<>(); String[] addresses = addressInfo.split(ADDRESS_SEPARATOR); @@ -73,5 +80,4 @@ public class PolarisContextConfiguration { return addressList; } } - } \ No newline at end of file diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextProperties.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextProperties.java index 289dcaf1..ad575c59 100644 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextProperties.java +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextProperties.java @@ -22,7 +22,9 @@ import com.tencent.polaris.api.config.Configuration; import com.tencent.polaris.factory.ConfigAPIFactory; import com.tencent.polaris.factory.config.ConfigurationImpl; import java.util.Collection; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -67,6 +69,8 @@ public class PolarisContextProperties { String defaultHost = getHost(); configuration.getGlobal().getAPI().setBindIP(defaultHost); Collection modifiers = modifierList; + modifiers = modifiers.stream().sorted(Comparator.comparingInt(PolarisConfigModifier::getOrder)) + .collect(Collectors.toList()); if (!CollectionUtils.isEmpty(modifiers)) { for (PolarisConfigModifier modifier : modifiers) { modifier.modify(configuration); diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/extend/consul/ConsulContextProperties.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/extend/consul/ConsulContextProperties.java new file mode 100644 index 00000000..7142c0ad --- /dev/null +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/extend/consul/ConsulContextProperties.java @@ -0,0 +1,126 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.polaris.context.extend.consul; + +import com.tencent.cloud.common.constant.ContextConstant.ModifierOrder; +import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.polaris.api.config.plugin.DefaultPlugins; +import com.tencent.polaris.factory.config.ConfigurationImpl; +import com.tencent.polaris.factory.config.global.ServerConnectorConfigImpl; +import com.tencent.polaris.plugins.connector.common.constant.ConsulConstant.MetadataMapKey; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Map; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.util.CollectionUtils; + +/** + * Discovery configuration of Consul. + * + * @author Haotian Zhang + */ +@ConditionalOnExpression("'true'.equals('${spring.cloud.consul.enabled:true}')" + + " && 'true'.equals('${spring.cloud.consul.discovery.enabled:true}')") +@ConfigurationProperties("spring.cloud.consul") +public class ConsulContextProperties { + + /** + * Host of consul(or consul agent) + */ + private String host; + + private int port; + + private boolean enabled; + @Value("${spring.cloud.consul.discovery.register:#{'true'}}") + private boolean register; + @Value("${spring.cloud.consul.discovery.enabled:#{'true'}}") + private boolean discoveryEnabled; + @Value("${spring.cloud.consul.discovery.instance-id:}") + private String instanceId; + @Value("${spring.cloud.consul.discovery.service-name:${spring.application.name:}}") + private String serviceName; + @Value("${spring.cloud.consul.discovery.ip-address:}") + private String ipAddress; + @Value("${spring.cloud.consul.discovery.prefer-ip-address:#{'false'}}") + private boolean preferIpAddress; + + public void setHost(String host) { + this.host = host; + } + + public void setPort(int port) { + this.port = port; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + @Bean + @ConditionalOnMissingBean + public ConsulConfigModifier consulConfigModifier() { + return new ConsulConfigModifier(); + } + + private static class ConsulConfigModifier implements PolarisConfigModifier { + + @Autowired(required = false) + private ConsulContextProperties consulContextProperties; + + @Override + public void modify(ConfigurationImpl configuration) { + if (consulContextProperties != null && consulContextProperties.enabled + && consulContextProperties.discoveryEnabled && consulContextProperties.register) { + if (CollectionUtils.isEmpty(configuration.getGlobal().getServerConnectors())) { + configuration.getGlobal().setServerConnectors(new ArrayList<>()); + } + configuration.getGlobal().getServerConnectors().add(configuration.getGlobal().getServerConnector()); + ServerConnectorConfigImpl serverConnectorConfig = new ServerConnectorConfigImpl(); + serverConnectorConfig.setAddresses( + Collections.singletonList(consulContextProperties.host + ":" + consulContextProperties.port)); + serverConnectorConfig.setProtocol(DefaultPlugins.SERVER_CONNECTOR_CONSUL); + Map metadata = serverConnectorConfig.getMetadata(); + if (StringUtils.isNotBlank(consulContextProperties.serviceName)) { + metadata.put(MetadataMapKey.SERVICE_NAME_KEY, consulContextProperties.serviceName); + } + if (StringUtils.isNotBlank(consulContextProperties.instanceId)) { + metadata.put(MetadataMapKey.INSTANCE_ID_KEY, consulContextProperties.instanceId); + } + if (consulContextProperties.preferIpAddress && StringUtils.isNotBlank( + consulContextProperties.ipAddress)) { + metadata.put(MetadataMapKey.PREFER_IP_ADDRESS_KEY, + String.valueOf(consulContextProperties.preferIpAddress)); + metadata.put(MetadataMapKey.IP_ADDRESS_KEY, consulContextProperties.ipAddress); + } + configuration.getGlobal().getServerConnectors().add(serverConnectorConfig); + } + } + + @Override + public int getOrder() { + return ModifierOrder.LAST; + } + } +}