diff --git a/pom.xml b/pom.xml index 6d7ce9952..ce1ab8616 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-build - 3.0.1 + 3.0.4 4.0.0 @@ -74,7 +74,7 @@ 1.0.0.2020-SNAPSHOT - 2020.0.1 + 2020.0.5 0.8.3 @@ -244,4 +244,4 @@ - \ No newline at end of file + diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 310c870bb..26f62fa89 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -64,7 +64,7 @@ 1.0.0.2020-SNAPSHOT 23.0 - 1.2.0 + 1.3.0-SNAPSHOT 10.0.0-M6 2.0.0 @@ -252,4 +252,4 @@ - \ No newline at end of file + diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml index c225faf4a..e4c167ece 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml @@ -24,15 +24,6 @@ com.tencent.cloud - - - - - - - - - @@ -62,4 +53,4 @@ - \ No newline at end of file + diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/application.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/application.yml index cd2e70c62..b74534078 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/application.yml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/application.yml @@ -6,20 +6,3 @@ spring: cloud: polaris: address: grpc://127.0.0.1:8091 - consul: - port: 8500 - host: 127.0.0.1 - enabled: true - discovery: - register: true - health-check-path: /actuator/health - health-check-interval: 10s - instance-id: ${spring.application.name}:${server.port} - enabled: true - service-name: ${spring.application.name} - ip-address: localhost - prefer-ip-address: true -eureka: - client: - serviceUrl: - defaultZone: http://127.0.0.1:7654/eureka/ \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml index 5b7aac6c9..cc299b133 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml @@ -28,16 +28,6 @@ com.tencent.cloud - - - - - - - - - - com.tencent.cloud spring-cloud-starter-tencent-polaris-router @@ -71,4 +61,4 @@ - \ No newline at end of file + diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/application.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/application.yml index 106b5ee89..26aaecd68 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/application.yml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/application.yml @@ -8,20 +8,3 @@ spring: configurations: default polaris: address: grpc://127.0.0.1:8091 - consul: - port: 8500 - host: 127.0.0.1 - enabled: true - discovery: - register: true - health-check-path: /actuator/health - health-check-interval: 10s - instance-id: ${spring.application.name}:${server.port} - enabled: true - service-name: ${spring.application.name} - ip-address: localhost - prefer-ip-address: true -eureka: - client: - serviceUrl: - defaultZone: http://127.0.0.1:7654/eureka/ diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/resources/application.yml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/resources/application.yml index 2ca31ba4f..29ab597bf 100644 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/resources/application.yml +++ b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/resources/application.yml @@ -6,4 +6,4 @@ spring: name: GatewayCalleeService cloud: polaris: - address: grpc://127.0.0.1:8091 \ No newline at end of file + address: grpc://127.0.0.1:8091 diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/pom.xml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/pom.xml index 71183a5bb..8f477d20a 100644 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/pom.xml +++ b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/pom.xml @@ -15,18 +15,19 @@ - spring-cloud-starter-tencent-polaris-discovery com.tencent.cloud + spring-cloud-starter-tencent-polaris-discovery - com.tencent.cloud - spring-cloud-tencent-polaris-gateway + org.springframework.cloud + spring-cloud-starter-gateway + org.springframework.cloud - spring-cloud-starter-gateway + spring-cloud-loadbalancer - \ No newline at end of file + 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 f5b67702d..b4594f197 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,7 @@ package com.tencent.cloud.polaris.circuitbreaker; +import com.tencent.cloud.constant.ContextConstant; import com.tencent.cloud.polaris.circuitbreaker.feign.PolarisFeignBeanPostProcessor; import com.tencent.cloud.polaris.context.PolarisConfigModifier; import com.tencent.cloud.polaris.context.PolarisContextConfiguration; @@ -71,5 +72,10 @@ public class PolarisFeignClientAutoConfiguration { //开启熔断配置 configuration.getConsumer().getCircuitBreaker().setEnable(true); } + + @Override + public int getOrder() { + return ContextConstant.ModifierOrder.CIRCUIT_BREAKER_ORDER; + } } } diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/pom.xml b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/pom.xml index 523a41b03..d6c5807aa 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/pom.xml @@ -104,4 +104,4 @@ - \ No newline at end of file + diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisProperties.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisProperties.java index cbeb95379..4677bb755 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisProperties.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/PolarisProperties.java @@ -96,6 +96,12 @@ public class PolarisProperties { @Value("${spring.cloud.polaris.discovery.heartbeat.enabled:#{false}}") private Boolean heartbeatEnabled = true; + /** + * Custom health check url to override default + */ + @Value("${spring.cloud.polaris.discovery.health-check-url:}") + private String healthCheckUrl; + @Autowired private Environment environment; @@ -210,6 +216,14 @@ public class PolarisProperties { this.port = port; } + public String getHealthCheckUrl() { + return healthCheckUrl; + } + + public void setHealthCheckUrl(String healthCheckUrl) { + this.healthCheckUrl = healthCheckUrl; + } + @Override @SuppressWarnings("checkstyle:all") public String toString() { @@ -225,6 +239,7 @@ public class PolarisProperties { ", policy='" + policy + '\'' + ", registerEnabled=" + registerEnabled + ", heartbeatEnabled=" + heartbeatEnabled + + ", healthCheckUrl=" + healthCheckUrl + ", environment=" + environment + '}'; } diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java index b765a36a5..00d04f1df 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java @@ -25,7 +25,10 @@ import com.tencent.polaris.api.core.ProviderAPI; import com.tencent.polaris.api.pojo.ServiceInfo; import com.tencent.polaris.api.rpc.GetAllInstancesRequest; import com.tencent.polaris.api.rpc.GetInstancesRequest; +import com.tencent.polaris.api.rpc.GetServicesRequest; import com.tencent.polaris.api.rpc.InstancesResponse; +import com.tencent.polaris.api.rpc.ServicesResponse; + import java.util.Map; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -93,4 +96,15 @@ public class PolarisDiscoveryHandler { return providerAPI; } + /** + * Return all service for given namespace + * + * @return service list + */ + public ServicesResponse getServices() { + String namespace = polarisProperties.getNamespace(); + GetServicesRequest request = new GetServicesRequest(); + request.setNamespace(namespace); + return polarisConsumer.getServices(request); + } } diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscovery.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscovery.java index c06c3307a..3e78d70f9 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscovery.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscovery.java @@ -20,12 +20,14 @@ package com.tencent.cloud.polaris.discovery; import com.tencent.cloud.polaris.pojo.PolarisServiceInstance; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.Instance; +import com.tencent.polaris.api.pojo.ServiceInfo; import com.tencent.polaris.api.pojo.ServiceInstances; import com.tencent.polaris.api.rpc.InstancesResponse; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; + import org.springframework.cloud.client.ServiceInstance; /** @@ -63,7 +65,12 @@ public class PolarisServiceDiscovery { * @throws PolarisException polarisException */ public List getServices() throws PolarisException { - return Collections.emptyList(); + return polarisDiscoveryHandler. + getServices(). + getServices(). + stream(). + map(ServiceInfo::getService). + collect(Collectors.toList()); } } diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java index 9a7c76236..f9ebc3322 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistry.java @@ -21,6 +21,7 @@ import static org.springframework.util.ReflectionUtils.rethrowRuntimeException; import com.tencent.cloud.metadata.config.MetadataLocalProperties; import com.tencent.cloud.polaris.PolarisProperties; +import com.tencent.cloud.polaris.util.OkHttpUtil; import com.tencent.polaris.api.core.ProviderAPI; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.Instance; @@ -33,6 +34,8 @@ import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.util.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -177,6 +180,21 @@ public class PolarisServiceRegistry implements ServiceRegistry { public void heartbeat(InstanceHeartbeatRequest heartbeatRequest) { heartbeatExecutor.scheduleWithFixedDelay(() -> { try { + String healthCheckEndpoint = polarisProperties.getHealthCheckUrl(); + //先判断是否配置了health-check-url,如果配置了,需要先进行服务实例健康检查,如果健康检查通过,则进行心跳上报,如果不通过,则不上报心跳 + if (Strings.isNotEmpty(healthCheckEndpoint)) { + if (!healthCheckEndpoint.startsWith("/")) { + healthCheckEndpoint = "/" + healthCheckEndpoint; + } + + String healthCheckUrl = String.format("http://%s:%s%s", heartbeatRequest.getHost(), heartbeatRequest.getPort(), healthCheckEndpoint); + + if (!OkHttpUtil.get(healthCheckUrl, null)){ + log.error("backend service health check failed. health check endpoint = {}", healthCheckEndpoint); + return; + } + } + polarisDiscoveryHandler.getProviderAPI().heartbeat(heartbeatRequest); } catch (PolarisException e) { log.error("polaris heartbeat[{}]", e.getCode(), e); diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/util/OkHttpUtil.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/util/OkHttpUtil.java new file mode 100644 index 000000000..6ad90a815 --- /dev/null +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/util/OkHttpUtil.java @@ -0,0 +1,83 @@ +/* + * 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.util; + +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import com.squareup.okhttp.OkHttpClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.Map; +import java.util.Objects; +/** + * okhttp util. + * + * @author kan peng + */ +public class OkHttpUtil { + public final static Logger logger = LoggerFactory.getLogger(OkHttpUtil.class); + /** + * JSON format + */ + public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8"); + /** + * client + */ + private final static OkHttpClient HTTP_CLIENT = new OkHttpClient(); + + /** + * get request. + * + * @param url url + * @param headers headers + * @return response + */ + public static boolean get(String url, Map headers) { + try { + Request.Builder builder = new Request.Builder(); + buildHeader(builder, headers); + Request request = builder.url(url).build(); + Response response = HTTP_CLIENT.newCall(request).execute(); + + if (response.isSuccessful() && Objects.nonNull(response.body())) { + String result = response.body().string(); + logger.debug("exec get request, url: {} success,response data: {}", url, result); + return true; + } + } catch (Exception e) { + logger.error("exec get request,url: {} failed!", url, e); + } + return false; + } + + /** + * build header. + * + * @param builder builder + * @param headers headers + */ + private static void buildHeader(Request.Builder builder, Map headers) { + if (Objects.nonNull(headers) && headers.size() > 0) { + headers.forEach((k, v) -> { + if (Objects.nonNull(k) && Objects.nonNull(v)) { + builder.addHeader(k, v); + } + }); + } + } +} diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json index bf979c146..6122b2d57 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -18,6 +18,12 @@ "defaultValue": true, "description": "If instance is enabled to accept request. The default value is true." }, + { + "name": "spring.cloud.polaris.discovery.health-check-url", + "type": "java.lang.String", + "defaultValue": "", + "description": "backend service health check endpoint." + }, { "name": "spring.cloud.polaris.discovery.token", "type": "java.lang.String", @@ -41,6 +47,12 @@ "type": "java.lang.String", "defaultValue": 100, "description": "the weight of polaris instance , use to loadbalance." + }, + { + "name": "spring.cloud.loadbalancer.polaris.enabled", + "type": "java.lang.String", + "defaultValue": 100, + "description": "polaris loadbalancer enable." } ] } diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscoveryTest.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscoveryTest.java index 77d99d447..c5ea14cd8 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscoveryTest.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscoveryTest.java @@ -95,7 +95,7 @@ public class PolarisServiceDiscoveryTest { PolarisServiceDiscovery polarisServiceDiscovery = context.getBean(PolarisServiceDiscovery.class); List services = polarisServiceDiscovery.getServices(); - assertThat(services.size()).isEqualTo(0); + assertThat(services.size()).isEqualTo(1); }); } diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/constant/ContextConstant.java b/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/constant/ContextConstant.java new file mode 100644 index 000000000..6264b54e6 --- /dev/null +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/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.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 19bfeccde..0fc514ad3 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 @@ -32,15 +32,22 @@ polaris-plugin-api + + + com.tencent.polaris + connector-composite + + + com.tencent.polaris connector-polaris-grpc - + com.tencent.polaris - resource-cache-memory + connector-consul @@ -99,4 +106,4 @@ - \ 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/PolarisConfigModifier.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisConfigModifier.java index 5ab47d2c4..68120ea93 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,25 @@ 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 6c01dded3..cedf6b171 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.constant.ContextConstant; +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,9 +36,11 @@ 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 = ","; + @Bean(name = "polarisContext", initMethod = "init", destroyMethod = "destroy") @ConditionalOnMissingBean public SDKContext polarisContext(PolarisContextProperties properties) throws PolarisException { @@ -57,12 +61,23 @@ public class PolarisContextConfiguration { @Override public void modify(ConfigurationImpl configuration) { if (!StringUtils.isBlank(properties.getAddress())) { - URI uri = URI.create(properties.getAddress()); - List addresses = new ArrayList<>(); - addresses.add(uri.getAuthority()); - configuration.getGlobal().getServerConnector().setAddresses(addresses); + configuration.getGlobal().getServerConnector().setAddresses(getAddressList(properties.getAddress())); } } - } -} \ No newline at end of file + @Override + public int getOrder() { + return ContextConstant.ModifierOrder.FIRST; + } + + private List getAddressList(String addressInfo) { + List addressList = new ArrayList<>(); + String[] addresses = addressInfo.split(ADDRESS_SEPARATOR); + for (String address : addresses) { + URI uri = URI.create(address.trim()); + addressList.add(uri.getAuthority()); + } + return addressList; + } + } +} 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 289dcaf17..7f2f1f2ba 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,10 @@ 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 +70,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); @@ -82,4 +87,4 @@ public class PolarisContextProperties { } return environment.getProperty("spring.cloud.client.ip-address"); } -} \ 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/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 000000000..8afea5ab9 --- /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.constant.ContextConstant; +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 ContextConstant.ModifierOrder.LAST; + } + } +}