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;
+ }
+ }
+}