refactor: modify the initialization of ApplicationContextAwareUtils.

Signed-off-by: Haotian Zhang <928016560@qq.com>
pull/1778/head
Haotian Zhang 1 week ago
parent 939f0f4386
commit ed95d17af4

@ -14,3 +14,4 @@
- [feat: support kafka lane.](https://github.com/Tencent/spring-cloud-tencent/pull/1765)
- [fix: ApplicationContextAwareUtils may not be ready in postProcessAfterInitialization.](https://github.com/Tencent/spring-cloud-tencent/pull/1779)
- [refactor:optimize metadata context operation.](https://github.com/Tencent/spring-cloud-tencent/pull/1773)
- [refactor: modify the initialization of ApplicationContextAwareUtils.](https://github.com/Tencent/spring-cloud-tencent/pull/1778)

@ -47,7 +47,7 @@ import static org.mockito.Mockito.when;
public class PolarisCircuitBreakerEndpointTest {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withBean(ApplicationContextAwareUtils.class)
.withInitializer(new ApplicationContextAwareUtils())
.withPropertyValues("spring.cloud.polaris.namespace=" + NAMESPACE_TEST)
.withPropertyValues("spring.cloud.polaris.service=" + SERVICE_PROVIDER);

@ -19,14 +19,12 @@ package com.tencent.cloud.polaris.discovery;
import java.util.List;
import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
import com.tencent.polaris.api.exception.PolarisException;
import com.tencent.polaris.api.pojo.DefaultInstance;
import com.tencent.polaris.api.pojo.DefaultServiceInstances;
import com.tencent.polaris.api.pojo.ServiceInfo;
import com.tencent.polaris.api.rpc.InstancesResponse;
import com.tencent.polaris.api.rpc.ServicesResponse;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
@ -36,7 +34,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.StaticApplicationContext;
import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER;
import static java.util.Collections.singletonList;
@ -58,11 +55,6 @@ public class PolarisServiceDiscoveryTest {
@InjectMocks
private PolarisServiceDiscovery polarisServiceDiscovery;
@BeforeEach
void setUp() {
new ApplicationContextAwareUtils().setApplicationContext(new StaticApplicationContext());
}
@Test
public void testGetInstances() {
DefaultServiceInstances mockDefaultServiceInstances = mock(DefaultServiceInstances.class);

@ -19,6 +19,7 @@ package com.tencent.cloud.polaris.ratelimit.endpoint;
import java.util.Map;
import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
import com.tencent.cloud.polaris.context.ServiceRuleManager;
import com.tencent.cloud.polaris.ratelimit.config.PolarisRateLimitProperties;
import com.tencent.polaris.specification.api.v1.model.ModelProto;
@ -57,6 +58,7 @@ public class PolarisRateLimitRuleEndpointTests {
PolarisRateLimitRuleEndpointAutoConfiguration.class,
PolarisRateLimitAutoConfiguration.class,
PolarisRateLimitAutoConfiguration.class))
.withInitializer(new ApplicationContextAwareUtils())
.withPropertyValues("spring.application.name=" + SERVICE_PROVIDER)
.withPropertyValues("server.port=" + PORT)
.withPropertyValues("spring.cloud.polaris.address=grpc://127.0.0.1:10081")

@ -40,9 +40,10 @@ public class FeignAutoConfigurationTest {
RouterAutoConfiguration.class,
RouterConfigModifierAutoConfiguration.class,
PolarisContextAutoConfiguration.class,
FeignAutoConfiguration.class,
ApplicationContextAwareUtils.class
)).withPropertyValues("spring.application.name=test");
FeignAutoConfiguration.class
))
.withInitializer(new ApplicationContextAwareUtils())
.withPropertyValues("spring.application.name=test");
@Test
public void routerLabelInterceptor() {

@ -43,9 +43,10 @@ public class RouterAutoConfigurationTests {
RouterAutoConfiguration.class,
RouterConfigModifierAutoConfiguration.class,
PolarisContextAutoConfiguration.class,
RouterAutoConfiguration.RouterLabelRestTemplateConfig.class,
ApplicationContextAwareUtils.class
)).withPropertyValues("spring.application.name=test");
RouterAutoConfiguration.RouterLabelRestTemplateConfig.class
))
.withInitializer(new ApplicationContextAwareUtils())
.withPropertyValues("spring.application.name=test");
@Test
public void testRouterLabelRestTemplateConfig() {

@ -22,7 +22,6 @@ import java.util.List;
import com.tencent.cloud.common.metadata.StaticMetadataManager;
import com.tencent.cloud.common.spi.InstanceMetadataProvider;
import com.tencent.cloud.common.spi.impl.DefaultInstanceMetadataProvider;
import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -46,8 +45,8 @@ public class MetadataAutoConfiguration {
}
@Bean
public InstanceMetadataProvider defaultInstanceMetadataProvider(ApplicationContextAwareUtils applicationContextAwareUtils) {
return new DefaultInstanceMetadataProvider(applicationContextAwareUtils);
public InstanceMetadataProvider defaultInstanceMetadataProvider() {
return new DefaultInstanceMetadataProvider();
}
@Bean

@ -24,7 +24,6 @@ import java.util.Map;
import java.util.Set;
import com.tencent.cloud.common.spi.InstanceMetadataProvider;
import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
import com.tencent.cloud.common.util.inet.PolarisInetUtils;
import com.tencent.polaris.api.utils.StringUtils;
import com.tencent.polaris.metadata.core.constant.MetadataConstants;
@ -42,13 +41,6 @@ import static com.tencent.cloud.common.metadata.MetadataContext.LOCAL_SERVICE;
*/
public class DefaultInstanceMetadataProvider implements InstanceMetadataProvider {
private final ApplicationContextAwareUtils applicationContextAwareUtils;
// ensure ApplicationContextAwareUtils init before
public DefaultInstanceMetadataProvider(ApplicationContextAwareUtils applicationContextAwareUtils) {
this.applicationContextAwareUtils = applicationContextAwareUtils;
}
@Override
public Map<String, String> getMetadata() {
Map<String, String> metadata = new HashMap<>();

@ -21,17 +21,16 @@ import com.tencent.polaris.api.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.lang.NonNull;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
/**
* Spring Context Util.
*
* @author Hongwei Zhu
*/
public class ApplicationContextAwareUtils implements ApplicationContextAware {
public class ApplicationContextAwareUtils implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationContextAwareUtils.class);
@ -45,11 +44,6 @@ public class ApplicationContextAwareUtils implements ApplicationContextAware {
return applicationContext;
}
@Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
ApplicationContextAwareUtils.applicationContext = applicationContext;
}
/**
* Get application property.
* @param key property name
@ -93,7 +87,7 @@ public class ApplicationContextAwareUtils implements ApplicationContextAware {
}
public static <T> T getBeanIfExists(Class<T> requiredType) {
return getBeanIfExists(requiredType, false);
return getBeanIfExists(requiredType, true);
}
public static <T> T getBeanIfExists(Class<T> requiredType, boolean warnIfFailed) {
@ -107,4 +101,9 @@ public class ApplicationContextAwareUtils implements ApplicationContextAware {
return null;
}
}
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ApplicationContextAwareUtils.applicationContext = applicationContext;
}
}

@ -1,9 +1,10 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.tencent.cloud.common.util.inet.PolarisInetUtilsAutoConfiguration,\
com.tencent.cloud.common.util.ApplicationContextAwareUtils,\
com.tencent.cloud.common.metadata.config.MetadataAutoConfiguration,\
com.tencent.cloud.common.metadata.endpoint.PolarisMetadataEndpointAutoConfiguration,\
com.tencent.cloud.common.async.PolarisAsyncPropertiesAutoConfiguration,\
com.tencent.cloud.common.async.PolarisAsyncConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.tencent.cloud.common.util.inet.PolarisInetUtilsBootstrapConfiguration
org.springframework.context.ApplicationContextInitializer=\
com.tencent.cloud.common.util.ApplicationContextAwareUtils

@ -133,7 +133,7 @@ public class StaticMetadataManagerTest {
when(metadataLocalProperties.getTransitive()).thenReturn(Collections.singletonList("k1"));
StaticMetadataManager metadataManager = new StaticMetadataManager(metadataLocalProperties,
Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider(null)));
Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider()));
Map<String, String> metadata = metadataManager.getAllCustomMetadata();
assertThat(metadata.size()).isGreaterThanOrEqualTo(5);
@ -178,7 +178,7 @@ public class StaticMetadataManagerTest {
when(metadataLocalProperties.getHeaders()).thenReturn(Arrays.asList("b", "d"));
StaticMetadataManager metadataManager = new StaticMetadataManager(metadataLocalProperties,
Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider(null)));
Arrays.asList(new MockedMetadataProvider(), new DefaultInstanceMetadataProvider()));
Map<String, String> metadata = metadataManager.getMergedStaticMetadata();
assertThat(metadata.size()).isGreaterThanOrEqualTo(8);

@ -21,8 +21,8 @@ import com.tencent.cloud.common.async.PolarisAsyncConfiguration;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@ -35,13 +35,13 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class ApplicationContextAwareUtilsTest {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(ApplicationContextAwareUtils.class))
.withInitializer(new ApplicationContextAwareUtils())
.withUserConfiguration(TestConfig.class)
.withPropertyValues("key1=value1");
@Test
public void testApplicationContextAwareUtils() {
this.contextRunner.run(context -> {
assertThat(context).hasSingleBean(ApplicationContextAwareUtils.class);
assertThat(ApplicationContextAwareUtils.getApplicationContext()).isNotNull();
// test getProperties
@ -53,14 +53,19 @@ public class ApplicationContextAwareUtilsTest {
assertThat(ApplicationContextAwareUtils.getProperties("key2", "defaultValue")).isEqualTo("defaultValue");
// test getBean
assertThat(ApplicationContextAwareUtils.getBean(ApplicationContextAwareUtils.class)).isNotNull();
assertThat(ApplicationContextAwareUtils.getBean(TestConfig.class)).isNotNull();
assertThatThrownBy(() -> {
ApplicationContextAwareUtils.getBean(PolarisAsyncConfiguration.class);
}).isInstanceOf(NoSuchBeanDefinitionException.class);
// test getBeanIfExists
assertThat(ApplicationContextAwareUtils.getBeanIfExists(ApplicationContextAwareUtils.class)).isNotNull();
assertThat(ApplicationContextAwareUtils.getBeanIfExists(TestConfig.class)).isNotNull();
assertThat(ApplicationContextAwareUtils.getBeanIfExists(PolarisAsyncConfiguration.class)).isNull();
});
}
@Configuration
static class TestConfig {
}
}

@ -22,8 +22,8 @@ import com.tencent.cloud.common.util.ApplicationContextAwareUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
@ -37,7 +37,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class TsfSpringContextAwareTest {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(ApplicationContextAwareUtils.class))
.withInitializer(new ApplicationContextAwareUtils())
.withUserConfiguration(TestConfig.class)
.withPropertyValues("key1=value1");
@Test
@ -56,10 +57,15 @@ public class TsfSpringContextAwareTest {
assertThat(TsfSpringContextAware.getProperties("key2", "defaultValue")).isEqualTo("defaultValue");
// test getBean
assertThat(TsfSpringContextAware.getBean(ApplicationContextAwareUtils.class)).isNotNull();
assertThat(TsfSpringContextAware.getBean(TestConfig.class)).isNotNull();
assertThatThrownBy(() -> {
TsfSpringContextAware.getBean(PolarisAsyncConfiguration.class);
}).isInstanceOf(NoSuchBeanDefinitionException.class);
});
}
@Configuration
static class TestConfig {
}
}

@ -0,0 +1,60 @@
/*
* Tencent is pleased to support the open source community by making spring-cloud-tencent available.
*
* Copyright (C) 2021 Tencent. 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.quickstart.callee.service;
import java.util.List;
import com.tencent.cloud.polaris.discovery.refresh.ServiceInstanceChangeCallback;
import com.tencent.cloud.polaris.discovery.refresh.ServiceInstanceChangeListener;
import com.tencent.polaris.api.pojo.Instance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* Call back for QuickstartCalleeService.
*
* @author Haotian Zhang
*/
@Component
@ServiceInstanceChangeListener(serviceName = "QuickstartCalleeService")
public class CalleeServiceChangeCallback implements ServiceInstanceChangeCallback {
private static final Logger LOG = LoggerFactory.getLogger(CalleeServiceChangeCallback.class);
@Override
public void callback(List<Instance> currentServiceInstances, List<Instance> addServiceInstances, List<Instance> deleteServiceInstances) {
String current = generateNodeList(currentServiceInstances);
String add = generateNodeList(addServiceInstances);
String delete = generateNodeList(deleteServiceInstances);
LOG.info("current: {}, add: {}, delete: {}", current, add, delete);
}
private String generateNodeList(List<Instance> deleteServiceInstances) {
StringBuilder nodeListStr = new StringBuilder("[");
for (Instance instance : deleteServiceInstances) {
if (nodeListStr.length() > 1) {
nodeListStr.append(", ");
}
nodeListStr.append(instance.getHost()).append(":").append(instance.getPort());
}
nodeListStr.append("]");
return nodeListStr.toString();
}
}
Loading…
Cancel
Save