From 5d2db6d1b535ff94be539dc4ca9b8f3253648ad3 Mon Sep 17 00:00:00 2001 From: Ling Yuan Date: Thu, 5 Nov 2020 09:22:20 -0800 Subject: [PATCH] Make instance config factory support custom amazon info provider --- .../Ec2EurekaArchaius2InstanceConfig.java | 17 +++++++--- .../providers/AmazonInfoProviderFactory.java | 9 +++++ ...azonInfoProviderInstanceConfigFactory.java | 33 +++++++++++++++++++ 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 eureka-client-archaius2/src/main/java/com/netflix/appinfo/providers/AmazonInfoProviderFactory.java create mode 100644 eureka-client-archaius2/src/main/java/com/netflix/appinfo/providers/CustomAmazonInfoProviderInstanceConfigFactory.java diff --git a/eureka-client-archaius2/src/main/java/com/netflix/appinfo/Ec2EurekaArchaius2InstanceConfig.java b/eureka-client-archaius2/src/main/java/com/netflix/appinfo/Ec2EurekaArchaius2InstanceConfig.java index 9b7430a53..69f2e77d9 100644 --- a/eureka-client-archaius2/src/main/java/com/netflix/appinfo/Ec2EurekaArchaius2InstanceConfig.java +++ b/eureka-client-archaius2/src/main/java/com/netflix/appinfo/Ec2EurekaArchaius2InstanceConfig.java @@ -1,6 +1,7 @@ package com.netflix.appinfo; import javax.inject.Inject; +import javax.inject.Provider; import javax.inject.Singleton; import com.netflix.discovery.CommonConstants; @@ -29,7 +30,7 @@ public class Ec2EurekaArchaius2InstanceConfig extends EurekaArchaius2InstanceCon }; private final AmazonInfoConfig amazonInfoConfig; - private final RefreshableAmazonInfoProvider amazonInfoHolder; + private final Provider amazonInfoHolder; @Inject public Ec2EurekaArchaius2InstanceConfig(Config configInstance, AmazonInfoConfig amazonInfoConfig) { @@ -40,6 +41,12 @@ public Ec2EurekaArchaius2InstanceConfig(Config configInstance, AmazonInfoConfig this(configInstance, new Archaius2AmazonInfoConfig(configInstance), CommonConstants.DEFAULT_CONFIG_NAMESPACE, info, false); } + public Ec2EurekaArchaius2InstanceConfig(Config configInstance, Provider amazonInfoProvider) { + super(configInstance, CommonConstants.DEFAULT_CONFIG_NAMESPACE); + this.amazonInfoConfig = null; + this.amazonInfoHolder = amazonInfoProvider; + } + public Ec2EurekaArchaius2InstanceConfig(Config configInstance, AmazonInfoConfig amazonInfoConfig, String namespace) { this(configInstance, amazonInfoConfig, namespace, null, true); } @@ -73,8 +80,8 @@ public String getFallbackHostname() { @Override public String getHostName(boolean refresh) { - if (refresh) { - amazonInfoHolder.refresh(); + if (refresh && this.amazonInfoHolder instanceof RefreshableAmazonInfoProvider) { + ((RefreshableAmazonInfoProvider)amazonInfoHolder).refresh(); } return amazonInfoHolder.get().get(MetaDataKey.publicHostname); } @@ -98,7 +105,9 @@ public String[] getDefaultAddressResolutionOrder() { */ @Deprecated public synchronized void refreshAmazonInfo() { - amazonInfoHolder.refresh(); + if (this.amazonInfoHolder instanceof RefreshableAmazonInfoProvider) { + ((RefreshableAmazonInfoProvider)amazonInfoHolder).refresh(); + } } @Override diff --git a/eureka-client-archaius2/src/main/java/com/netflix/appinfo/providers/AmazonInfoProviderFactory.java b/eureka-client-archaius2/src/main/java/com/netflix/appinfo/providers/AmazonInfoProviderFactory.java new file mode 100644 index 000000000..211df0a52 --- /dev/null +++ b/eureka-client-archaius2/src/main/java/com/netflix/appinfo/providers/AmazonInfoProviderFactory.java @@ -0,0 +1,9 @@ +package com.netflix.appinfo.providers; + +import com.netflix.appinfo.AmazonInfo; + +import javax.inject.Provider; + +public interface AmazonInfoProviderFactory { + Provider get(); +} diff --git a/eureka-client-archaius2/src/main/java/com/netflix/appinfo/providers/CustomAmazonInfoProviderInstanceConfigFactory.java b/eureka-client-archaius2/src/main/java/com/netflix/appinfo/providers/CustomAmazonInfoProviderInstanceConfigFactory.java new file mode 100644 index 000000000..4b5dc603b --- /dev/null +++ b/eureka-client-archaius2/src/main/java/com/netflix/appinfo/providers/CustomAmazonInfoProviderInstanceConfigFactory.java @@ -0,0 +1,33 @@ +package com.netflix.appinfo.providers; + +import com.netflix.appinfo.AmazonInfo; +import com.netflix.appinfo.Ec2EurekaArchaius2InstanceConfig; +import com.netflix.appinfo.EurekaInstanceConfig; +import com.netflix.archaius.api.Config; + +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; + +@Singleton +public class CustomAmazonInfoProviderInstanceConfigFactory implements EurekaInstanceConfigFactory { + + private final Config configInstance; + private final Provider amazonInfoProvider; + private EurekaInstanceConfig eurekaInstanceConfig; + + @Inject + public CustomAmazonInfoProviderInstanceConfigFactory(Config configInstance, AmazonInfoProviderFactory amazonInfoProviderFactory) { + this.configInstance = configInstance; + this.amazonInfoProvider = amazonInfoProviderFactory.get(); + } + + @Override + public EurekaInstanceConfig get() { + if (eurekaInstanceConfig == null) { + eurekaInstanceConfig = new Ec2EurekaArchaius2InstanceConfig(configInstance, amazonInfoProvider); + } + + return eurekaInstanceConfig; + } +}