From 750e5fd415195796b2e7a269fbf0ce5da86bbb5e Mon Sep 17 00:00:00 2001 From: lepdou Date: Thu, 16 Jun 2022 17:29:30 +0800 Subject: [PATCH] add instance metadata spi for registration (#244) --- CHANGELOG.md | 1 + .../polaris/registry/PolarisRegistration.java | 49 ++++++++++++++-- ...larisServiceRegistryAutoConfiguration.java | 6 +- .../registry/PolarisRegistrationTest.java | 4 +- .../metadata/StaticMetadataManager.java | 15 ++++- .../service/callee/CustomMetadata.java | 56 +++++++++++++++++++ .../context/spi/InstanceMetadataProvider.java | 55 ++++++++++++++++++ 7 files changed, 174 insertions(+), 12 deletions(-) create mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/CustomMetadata.java create mode 100644 spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/spi/InstanceMetadataProvider.java diff --git a/CHANGELOG.md b/CHANGELOG.md index f1dc5324..7cc73b07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,4 +3,5 @@ [UT: Add config module unit test](https://github.com/Tencent/spring-cloud-tencent/pull/229) [Feature: Add config change listener feature support](https://github.com/Tencent/spring-cloud-tencent/pull/220) [Feature: Support spring cloud gateway routers](https://github.com/Tencent/spring-cloud-tencent/pull/230) +[Feature: Add instance metadata spi for registration](https://github.com/Tencent/spring-cloud-tencent/pull/244) [Bugfix: fix guava version conflict bug & fix router strong dependency on LoadBalancerClientFilter](https://github.com/Tencent/spring-cloud-tencent/pull/236) diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java index bf83ee29..20cfcf6e 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisRegistration.java @@ -19,12 +19,14 @@ package com.tencent.cloud.polaris.registry; import java.net.URI; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.polaris.DiscoveryPropertiesAutoConfiguration; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; +import com.tencent.cloud.polaris.context.spi.InstanceMetadataProvider; import com.tencent.polaris.client.api.SDKContext; import org.apache.commons.lang.StringUtils; @@ -40,6 +42,9 @@ import org.springframework.util.CollectionUtils; */ public class PolarisRegistration implements Registration, ServiceInstance { + private final static String METADATA_KEY_IP = "internal-ip"; + private final static String METADATA_KEY_ADDRESS = "internal-address"; + private final DiscoveryPropertiesAutoConfiguration discoveryPropertiesAutoConfiguration; private final PolarisDiscoveryProperties polarisDiscoveryProperties; @@ -48,15 +53,24 @@ public class PolarisRegistration implements Registration, ServiceInstance { private final StaticMetadataManager staticMetadataManager; + private final InstanceMetadataProvider instanceMetadataProvider; + private Map metadata; + private final String host; + public PolarisRegistration( DiscoveryPropertiesAutoConfiguration discoveryPropertiesAutoConfiguration, - PolarisDiscoveryProperties polarisDiscoveryProperties, SDKContext context, StaticMetadataManager staticMetadataManager) { + PolarisDiscoveryProperties polarisDiscoveryProperties, SDKContext context, + StaticMetadataManager staticMetadataManager, + InstanceMetadataProvider instanceMetadataProvider) { this.discoveryPropertiesAutoConfiguration = discoveryPropertiesAutoConfiguration; this.polarisDiscoveryProperties = polarisDiscoveryProperties; this.polarisContext = context; this.staticMetadataManager = staticMetadataManager; + this.instanceMetadataProvider = instanceMetadataProvider; + + host = polarisContext.getConfig().getGlobal().getAPI().getBindIP(); } @Override @@ -66,7 +80,7 @@ public class PolarisRegistration implements Registration, ServiceInstance { @Override public String getHost() { - return polarisContext.getConfig().getGlobal().getAPI().getBindIP(); + return host; } @Override @@ -92,10 +106,35 @@ public class PolarisRegistration implements Registration, ServiceInstance { @Override public Map getMetadata() { if (CollectionUtils.isEmpty(metadata)) { - metadata = new HashMap<>(); - metadata.putAll(staticMetadataManager.getMergedStaticMetadata()); + Map instanceMetadata = new HashMap<>(); + + // put internal metadata + instanceMetadata.put(METADATA_KEY_IP, host); + instanceMetadata.put(METADATA_KEY_ADDRESS, host + ":" + polarisDiscoveryProperties.getPort()); + + instanceMetadata.putAll(staticMetadataManager.getMergedStaticMetadata()); + // location info will be putted both in metadata and instance's field - metadata.putAll(staticMetadataManager.getLocationMetadata()); + instanceMetadata.putAll(staticMetadataManager.getLocationMetadata()); + + // custom metadata from spi + if (instanceMetadataProvider != null) { + if (StringUtils.isNotBlank(instanceMetadataProvider.getRegion())) { + instanceMetadata.put(StaticMetadataManager.LOCATION_KEY_ZONE, instanceMetadataProvider.getRegion()); + } + if (StringUtils.isNotBlank(instanceMetadataProvider.getZone())) { + instanceMetadata.put(StaticMetadataManager.LOCATION_KEY_ZONE, instanceMetadataProvider.getZone()); + } + if (StringUtils.isNotBlank(instanceMetadataProvider.getCampus())) { + instanceMetadata.put(StaticMetadataManager.LOCATION_KEY_ZONE, instanceMetadataProvider.getCampus()); + } + + if (!CollectionUtils.isEmpty(instanceMetadataProvider.getMetadata())) { + instanceMetadata.putAll(instanceMetadataProvider.getMetadata()); + } + } + + this.metadata = Collections.unmodifiableMap(instanceMetadata); } return metadata; } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java index 5eadee57..e868996d 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.java @@ -21,6 +21,7 @@ package com.tencent.cloud.polaris.registry; import com.tencent.cloud.common.metadata.StaticMetadataManager; import com.tencent.cloud.polaris.DiscoveryPropertiesAutoConfiguration; import com.tencent.cloud.polaris.PolarisDiscoveryProperties; +import com.tencent.cloud.polaris.context.spi.InstanceMetadataProvider; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryAutoConfiguration; import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; import com.tencent.polaris.client.api.SDKContext; @@ -34,6 +35,7 @@ import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationC import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.lang.Nullable; /** * Autoconfiguration of service registry of Polaris. @@ -62,9 +64,9 @@ public class PolarisServiceRegistryAutoConfiguration { public PolarisRegistration polarisRegistration( DiscoveryPropertiesAutoConfiguration discoveryPropertiesAutoConfiguration, PolarisDiscoveryProperties polarisDiscoveryProperties, SDKContext context, - StaticMetadataManager staticMetadataManager) { + StaticMetadataManager staticMetadataManager, @Nullable InstanceMetadataProvider instanceMetadataProvider) { return new PolarisRegistration(discoveryPropertiesAutoConfiguration, - polarisDiscoveryProperties, context, staticMetadataManager); + polarisDiscoveryProperties, context, staticMetadataManager, instanceMetadataProvider); } @Bean diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java index a81d69d2..11d380a7 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/registry/PolarisRegistrationTest.java @@ -78,7 +78,7 @@ public class PolarisRegistrationTest { doReturn(Collections.singletonMap("key2", "value2")).when(staticMetadataManager).getLocationMetadata(); polarisRegistration = new PolarisRegistration( - discoveryPropertiesAutoConfiguration, polarisDiscoveryProperties, polarisContext, staticMetadataManager); + discoveryPropertiesAutoConfiguration, polarisDiscoveryProperties, polarisContext, staticMetadataManager, null); } @Test @@ -111,7 +111,7 @@ public class PolarisRegistrationTest { Map metadata = polarisRegistration.getMetadata(); assertThat(metadata).isNotNull(); assertThat(metadata).isNotEmpty(); - assertThat(metadata.size()).isEqualTo(2); + assertThat(metadata.size()).isEqualTo(4); assertThat(metadata.get("key1")).isEqualTo("value1"); assertThat(metadata.get("key2")).isEqualTo("value2"); } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/StaticMetadataManager.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/StaticMetadataManager.java index 95557598..575775bf 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/StaticMetadataManager.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/metadata/StaticMetadataManager.java @@ -43,9 +43,18 @@ public class StaticMetadataManager { private static final String ENV_METADATA_REGION = "SCT_METADATA_REGION"; private static final String ENV_METADATA_CAMPUS = "SCT_METADATA_CAMPUS"; - private static final String LOCATION_KEY_REGION = "region"; - private static final String LOCATION_KEY_ZONE = "zone"; - private static final String LOCATION_KEY_CAMPUS = "campus"; + /** + * the metadata key of region. + */ + public static final String LOCATION_KEY_REGION = "region"; + /** + * the metadata key of zone. + */ + public static final String LOCATION_KEY_ZONE = "zone"; + /** + * the metadata key of campus/datacenter. + */ + public static final String LOCATION_KEY_CAMPUS = "campus"; private Map envMetadata; private Map envTransitiveMetadata; diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/CustomMetadata.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/CustomMetadata.java new file mode 100644 index 00000000..efe3f816 --- /dev/null +++ b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/CustomMetadata.java @@ -0,0 +1,56 @@ +/* + * 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.discovery.service.callee; + +import java.util.HashMap; +import java.util.Map; + +import com.tencent.cloud.polaris.context.spi.InstanceMetadataProvider; + +import org.springframework.stereotype.Component; + +/** + * custom metadata for instance. + *@author lepdou 2022-06-16 + */ +@Component +public class CustomMetadata implements InstanceMetadataProvider { + + @Override + public Map getMetadata() { + Map metadata = new HashMap<>(); + metadata.put("k1", "v1"); + return metadata; + } + + @Override + public String getRegion() { + return "shanghai"; + } + + @Override + public String getZone() { + return null; + } + + @Override + public String getCampus() { + return null; + } +} diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/spi/InstanceMetadataProvider.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/spi/InstanceMetadataProvider.java new file mode 100644 index 00000000..6b2b73a6 --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/spi/InstanceMetadataProvider.java @@ -0,0 +1,55 @@ +/* + * 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.spi; + +import java.util.Map; + +/** + * + * Instance's custom metadata, metadata will be register to polaris server. + * @author lepdou 2022-06-16 + */ +public interface InstanceMetadataProvider { + + /** + * @return the metadata of instance. + */ + Map getMetadata(); + + /** + * The region of current instance. + * + * @return the region info. + */ + String getRegion(); + + /** + * The zone of current instance. + * + * @return the zone info. + */ + String getZone(); + + /** + * The campus/datacenter of current instance. + * + * @return the campus or datacenter info. + */ + String getCampus(); +}