Refactor : optimize project and code (main). (#506)

pull/518/head
VOPEN.XYZ 2 years ago committed by GitHub
parent 940bfa0f88
commit e7d5e2a67d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -8,4 +8,5 @@
- [Bugfix: update byte-buddy scope test to compile](https://github.com/Tencent/spring-cloud-tencent/pull/495) - [Bugfix: update byte-buddy scope test to compile](https://github.com/Tencent/spring-cloud-tencent/pull/495)
- [feature:add @ConditionalOnConfigReflectEnabled annotation](https://github.com/Tencent/spring-cloud-tencent/pull/496) - [feature:add @ConditionalOnConfigReflectEnabled annotation](https://github.com/Tencent/spring-cloud-tencent/pull/496)
- [Feature: zuul supports polaris router](https://github.com/Tencent/spring-cloud-tencent/pull/502) - [Feature: zuul supports polaris router](https://github.com/Tencent/spring-cloud-tencent/pull/502)
- [Refactor : optimize project and code](https://github.com/Tencent/spring-cloud-tencent/pull/506)
- [Fix typo & Code optimization](https://github.com/Tencent/spring-cloud-tencent/pull/507) - [Fix typo & Code optimization](https://github.com/Tencent/spring-cloud-tencent/pull/507)

@ -152,7 +152,7 @@ public class MetadataTransferAutoConfiguration {
} }
@Bean @Bean
public SmartInitializingSingleton addEncodeTransferMedataInterceptorForRestTemplate(EncodeTransferMedataRestTemplateInterceptor interceptor) { public SmartInitializingSingleton addEncodeTransferMetadataInterceptorForRestTemplate(EncodeTransferMedataRestTemplateInterceptor interceptor) {
return () -> restTemplates.forEach(restTemplate -> { return () -> restTemplates.forEach(restTemplate -> {
List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors()); List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());
list.add(interceptor); list.add(interceptor);

@ -94,7 +94,7 @@ public class MetadataTransferAutoConfigurationTest {
.stream() .stream()
.filter(interceptor -> Objects.equals(interceptor, encodeTransferMedataRestTemplateInterceptor)) .filter(interceptor -> Objects.equals(interceptor, encodeTransferMedataRestTemplateInterceptor))
.collect(Collectors.toList()); .collect(Collectors.toList());
//EncodeTransferMedataFeignInterceptor is not added repeatedly //EncodeTransferMetadataFeignInterceptor is not added repeatedly
Assertions.assertThat(encodeTransferMedataFeignInterceptorList.size()).isEqualTo(1); Assertions.assertThat(encodeTransferMedataFeignInterceptorList.size()).isEqualTo(1);
} }
}); });

@ -80,8 +80,8 @@ public class PolarisConfigAutoConfiguration {
return new PolarisRefreshContextConfigPropertyAutoRefresher(polarisConfigProperties, polarisPropertySourceManager, contextRefresher); return new PolarisRefreshContextConfigPropertyAutoRefresher(polarisConfigProperties, polarisPropertySourceManager, contextRefresher);
} }
@ConditionalOnConfigReflectEnabled
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnConfigReflectEnabled
@AutoConfigureBefore(PolarisConfigAutoConfiguration.class) @AutoConfigureBefore(PolarisConfigAutoConfiguration.class)
public static class PolarisReflectRefresherAutoConfiguration { public static class PolarisReflectRefresherAutoConfiguration {
@Bean @Bean

@ -15,6 +15,7 @@
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
* *
*/ */
package com.tencent.cloud.polaris.config; package com.tencent.cloud.polaris.config;
import com.tencent.cloud.polaris.config.adapter.PolarisConfigFileLocator; import com.tencent.cloud.polaris.config.adapter.PolarisConfigFileLocator;

@ -31,6 +31,7 @@ import com.tencent.polaris.configuration.api.core.ConfigFileMetadata;
import com.tencent.polaris.configuration.api.core.ConfigFileService; import com.tencent.polaris.configuration.api.core.ConfigFileService;
import com.tencent.polaris.configuration.api.core.ConfigKVFile; import com.tencent.polaris.configuration.api.core.ConfigKVFile;
import com.tencent.polaris.configuration.client.internal.DefaultConfigFileMetadata; import com.tencent.polaris.configuration.client.internal.DefaultConfigFileMetadata;
import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -122,33 +123,44 @@ public class PolarisConfigFileLocator implements PropertySourceLocator {
// priority: application-${profile} > application > boostrap-${profile} > boostrap // priority: application-${profile} > application > boostrap-${profile} > boostrap
String[] activeProfiles = environment.getActiveProfiles(); String[] activeProfiles = environment.getActiveProfiles();
buildInternalConfigFiles(internalConfigFiles, namespace, serviceName, activeProfiles);
for (String activeProfile : activeProfiles) { // Compatible with defaultProfiles configuration
if (!StringUtils.hasText(activeProfile)) { if (ArrayUtils.isEmpty(activeProfiles)) {
continue; String[] defaultProfiles = environment.getDefaultProfiles();
} buildInternalConfigFiles(internalConfigFiles, namespace, serviceName, defaultProfiles);
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + activeProfile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + activeProfile + ".yml"));
} }
// build default config properties files .
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.properties")); internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.yml")); internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application.yml"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.yml"));
for (String activeProfile : activeProfiles) { return internalConfigFiles;
if (!StringUtils.hasText(activeProfile)) {
continue;
} }
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + activeProfile + ".properties")); private void buildInternalConfigFiles(List<ConfigFileMetadata> internalConfigFiles, String namespace, String serviceName, String[] profiles) {
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + activeProfile + ".yml"));
if (profiles != null) {
for (String profile : profiles) {
if (!StringUtils.hasText(profile)) {
continue;
} }
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.properties")); internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + profile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap.yml")); internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "application-" + profile + ".yml"));
}
for (String profile : profiles) {
if (!StringUtils.hasText(profile)) {
continue;
}
return internalConfigFiles; internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + profile + ".properties"));
internalConfigFiles.add(new DefaultConfigFileMetadata(namespace, serviceName, "bootstrap-" + profile + ".yml"));
}
}
} }

@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
/** /**
@ -57,7 +58,7 @@ public abstract class PolarisConfigPropertyAutoRefresher
} }
@Override @Override
public void onApplicationEvent(ApplicationReadyEvent event) { public void onApplicationEvent(@NonNull ApplicationReadyEvent event) {
registerPolarisConfigPublishEvent(); registerPolarisConfigPublishEvent();
} }

@ -33,7 +33,9 @@ public interface PolarisConfigPropertyRefresher {
* *
* @param changedKey changedKey * @param changedKey changedKey
*/ */
void refreshSpringValue(String changedKey); default void refreshSpringValue(String changedKey) {
// do nothing,all config will be refreshed by contextRefresher.refresh
}
/** /**
* refresh @ConfigurationProperties beans. * refresh @ConfigurationProperties beans.

@ -36,6 +36,7 @@ import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.lang.NonNull;
/** /**
* PolarisReflectConfigPropertyAutoRefresher to refresh config in reflect type * PolarisReflectConfigPropertyAutoRefresher to refresh config in reflect type
@ -107,14 +108,10 @@ public class PolarisReflectConfigPropertyAutoRefresher extends PolarisConfigProp
Object value = placeholderHelper Object value = placeholderHelper
.resolvePropertyValue(beanFactory, springValue.getBeanName(), springValue.getPlaceholder()); .resolvePropertyValue(beanFactory, springValue.getBeanName(), springValue.getPlaceholder());
if (springValue.isJson()) {
value = parseJsonValue((String) value, springValue.getTargetType());
}
else {
value = springValue.isField() ? this.typeConverter.convertIfNecessary(value, springValue.getTargetType(), springValue.getField()) : value = springValue.isField() ? this.typeConverter.convertIfNecessary(value, springValue.getTargetType(), springValue.getField()) :
this.typeConverter.convertIfNecessary(value, springValue.getTargetType(), this.typeConverter.convertIfNecessary(value, springValue.getTargetType(),
springValue.getMethodParameter()); springValue.getMethodParameter());
}
return value; return value;
} }
@ -129,7 +126,7 @@ public class PolarisReflectConfigPropertyAutoRefresher extends PolarisConfigProp
} }
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
this.context = (ConfigurableApplicationContext) applicationContext; this.context = (ConfigurableApplicationContext) applicationContext;
this.beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); this.beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();
this.typeConverter = this.beanFactory.getTypeConverter(); this.typeConverter = this.beanFactory.getTypeConverter();

@ -40,11 +40,6 @@ public class PolarisRefreshContextConfigPropertyAutoRefresher extends PolarisCon
this.contextRefresher = contextRefresher; this.contextRefresher = contextRefresher;
} }
@Override
public void refreshSpringValue(String changedKey) {
// do nothing,all config will be refreshed by contextRefresher.refresh
}
@Override @Override
public void refreshConfigurationProperties(Set<String> changeKeys) { public void refreshConfigurationProperties(Set<String> changeKeys) {
contextRefresher.refresh(); contextRefresher.refresh();

@ -23,6 +23,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@ -102,6 +103,7 @@ public class SmartConfigurationPropertiesRebinder extends ConfigurationPropertie
case SPECIFIC_BEAN: case SPECIFIC_BEAN:
rebindSpecificBean(event); rebindSpecificBean(event);
break; break;
case ALL_BEANS:
default: default:
rebind(); rebind();
break; break;
@ -112,7 +114,7 @@ public class SmartConfigurationPropertiesRebinder extends ConfigurationPropertie
private void rebindSpecificBean(EnvironmentChangeEvent event) { private void rebindSpecificBean(EnvironmentChangeEvent event) {
Set<String> refreshedSet = new HashSet<>(); Set<String> refreshedSet = new HashSet<>();
beanMap.forEach((name, bean) -> event.getKeys().forEach(changeKey -> { beanMap.forEach((name, bean) -> event.getKeys().forEach(changeKey -> {
String prefix = AnnotationUtils.getValue(bean.getAnnotation()).toString(); String prefix = Objects.requireNonNull(AnnotationUtils.getValue(bean.getAnnotation())).toString();
// prevent multiple refresh one ConfigurationPropertiesBean. // prevent multiple refresh one ConfigurationPropertiesBean.
if (changeKey.startsWith(prefix) && refreshedSet.add(name)) { if (changeKey.startsWith(prefix) && refreshedSet.add(name)) {
rebind(name); rebind(name);

@ -34,4 +34,5 @@ import org.springframework.context.annotation.Conditional;
@Target({ElementType.TYPE, ElementType.METHOD}) @Target({ElementType.TYPE, ElementType.METHOD})
@Conditional(ConfigReflectCondition.class) @Conditional(ConfigReflectCondition.class)
public @interface ConditionalOnConfigReflectEnabled { public @interface ConditionalOnConfigReflectEnabled {
} }

@ -46,12 +46,10 @@ public class NonDefaultBehaviorCondition extends SpringBootCondition {
public ConditionOutcome getMatchOutcome(ConditionContext context, public ConditionOutcome getMatchOutcome(ConditionContext context,
AnnotatedTypeMetadata metadata) { AnnotatedTypeMetadata metadata) {
RefreshBehavior behavior = context.getEnvironment().getProperty( RefreshBehavior behavior = context.getEnvironment().getProperty(
POLARIS_CONFIG_REFRESH_BEHAVIOR, RefreshBehavior.class, POLARIS_CONFIG_REFRESH_BEHAVIOR, RefreshBehavior.class, DEFAULT_REFRESH_BEHAVIOR);
DEFAULT_REFRESH_BEHAVIOR);
if (DEFAULT_REFRESH_BEHAVIOR == behavior) { if (DEFAULT_REFRESH_BEHAVIOR == behavior) {
return ConditionOutcome.noMatch("no matched"); return ConditionOutcome.noMatch("no matched");
} }
return ConditionOutcome.match("matched"); return ConditionOutcome.match("matched");
} }
} }

@ -15,6 +15,7 @@
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
* *
*/ */
package com.tencent.cloud.polaris.config.config; package com.tencent.cloud.polaris.config.config;
import java.util.List; import java.util.List;

@ -15,6 +15,7 @@
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
* *
*/ */
package com.tencent.cloud.polaris.config.config; package com.tencent.cloud.polaris.config.config;
import java.util.List; import java.util.List;

@ -42,7 +42,8 @@ public class PolarisConfigEndpointAutoConfiguration {
@Bean @Bean
@ConditionalOnAvailableEndpoint @ConditionalOnAvailableEndpoint
@ConditionalOnMissingBean @ConditionalOnMissingBean
public PolarisConfigEndpoint polarisConfigEndpoint(PolarisConfigProperties polarisConfigProperties, PolarisPropertySourceManager polarisPropertySourceManager) { public PolarisConfigEndpoint polarisConfigEndpoint(PolarisConfigProperties polarisConfigProperties,
PolarisPropertySourceManager polarisPropertySourceManager) {
return new PolarisConfigEndpoint(polarisConfigProperties, polarisPropertySourceManager); return new PolarisConfigEndpoint(polarisConfigProperties, polarisPropertySourceManager);
} }
} }

@ -16,7 +16,6 @@
* *
*/ */
package com.tencent.cloud.polaris.config.enums; package com.tencent.cloud.polaris.config.enums;
import org.springframework.boot.context.properties.ConfigurationPropertiesBean; import org.springframework.boot.context.properties.ConfigurationPropertiesBean;
@ -36,5 +35,4 @@ public enum RefreshBehavior {
* Refresh specific {@link ConfigurationPropertiesBean} base on change key. * Refresh specific {@link ConfigurationPropertiesBean} base on change key.
*/ */
SPECIFIC_BEAN, SPECIFIC_BEAN,
} }

@ -15,6 +15,7 @@
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
* *
*/ */
package com.tencent.cloud.polaris.config.enums; package com.tencent.cloud.polaris.config.enums;
/** /**

@ -1,3 +1,21 @@
/*
* 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.config.spring.annotation; package com.tencent.cloud.polaris.config.spring.annotation;
import java.lang.reflect.Field; import java.lang.reflect.Field;

@ -1,3 +1,21 @@
/*
* 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.config.spring.annotation; package com.tencent.cloud.polaris.config.spring.annotation;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
@ -27,6 +45,7 @@ import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.lang.NonNull;
/** /**
* Spring value processor of field or method which has @Value and xml config placeholders. * Spring value processor of field or method which has @Value and xml config placeholders.
@ -59,7 +78,7 @@ public class SpringValueProcessor extends PolarisProcessor implements BeanFactor
} }
@Override @Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) public void postProcessBeanFactory(@NonNull ConfigurableListableBeanFactory beanFactory)
throws BeansException { throws BeansException {
if (polarisConfigProperties.isAutoRefresh() && beanFactory instanceof BeanDefinitionRegistry) { if (polarisConfigProperties.isAutoRefresh() && beanFactory instanceof BeanDefinitionRegistry) {
beanName2SpringValueDefinitions = SpringValueDefinitionProcessor beanName2SpringValueDefinitions = SpringValueDefinitionProcessor
@ -119,11 +138,11 @@ public class SpringValueProcessor extends PolarisProcessor implements BeanFactor
SpringValue springValue; SpringValue springValue;
if (member instanceof Field) { if (member instanceof Field) {
Field field = (Field) member; Field field = (Field) member;
springValue = new SpringValue(key, value.value(), bean, beanName, field, false); springValue = new SpringValue(key, value.value(), bean, beanName, field);
} }
else if (member instanceof Method) { else if (member instanceof Method) {
Method method = (Method) member; Method method = (Method) member;
springValue = new SpringValue(key, value.value(), bean, beanName, method, false); springValue = new SpringValue(key, value.value(), bean, beanName, method);
} }
else { else {
LOGGER.error("Polaris @Value annotation currently only support to be used on methods and fields, " LOGGER.error("Polaris @Value annotation currently only support to be used on methods and fields, "
@ -136,9 +155,9 @@ public class SpringValueProcessor extends PolarisProcessor implements BeanFactor
} }
private void processBeanPropertyValues(Object bean, String beanName) { private void processBeanPropertyValues(Object bean, String beanName) {
Collection<SpringValueDefinition> propertySpringValues = beanName2SpringValueDefinitions Collection<SpringValueDefinition> propertySpringValues = beanName2SpringValueDefinitions.get(beanName);
.get(beanName);
if (propertySpringValues == null || propertySpringValues.isEmpty()) { if (propertySpringValues.isEmpty()) {
return; return;
} }
@ -146,15 +165,18 @@ public class SpringValueProcessor extends PolarisProcessor implements BeanFactor
try { try {
PropertyDescriptor pd = BeanUtils PropertyDescriptor pd = BeanUtils
.getPropertyDescriptor(bean.getClass(), definition.getPropertyName()); .getPropertyDescriptor(bean.getClass(), definition.getPropertyName());
if (pd != null) {
Method method = pd.getWriteMethod(); Method method = pd.getWriteMethod();
if (method == null) { if (method == null) {
continue; continue;
} }
SpringValue springValue = new SpringValue(definition.getKey(), definition.getPlaceholder(), SpringValue springValue = new SpringValue(definition.getKey(), definition.getPlaceholder(),
bean, beanName, method, false); bean, beanName, method);
springValueRegistry.register(beanFactory, definition.getKey(), springValue); springValueRegistry.register(beanFactory, definition.getKey(), springValue);
LOGGER.debug("Monitoring {}", springValue); LOGGER.debug("Monitoring {}", springValue);
} }
}
catch (Throwable ex) { catch (Throwable ex) {
LOGGER.error("Failed to enable auto update feature for {}.{}", bean.getClass(), LOGGER.error("Failed to enable auto update feature for {}.{}", bean.getClass(),
definition.getPropertyName()); definition.getPropertyName());
@ -166,7 +188,7 @@ public class SpringValueProcessor extends PolarisProcessor implements BeanFactor
} }
@Override @Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException { public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
} }
} }

@ -21,7 +21,6 @@ import java.lang.ref.WeakReference;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Type;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
@ -44,23 +43,17 @@ public class SpringValue {
private final String key; private final String key;
private final String placeholder; private final String placeholder;
private final Class<?> targetType; private final Class<?> targetType;
private Type genericType;
private final boolean isJson;
public SpringValue(String key, String placeholder, Object bean, String beanName, Field field, boolean isJson) { public SpringValue(String key, String placeholder, Object bean, String beanName, Field field) {
this.beanRef = new WeakReference<>(bean); this.beanRef = new WeakReference<>(bean);
this.beanName = beanName; this.beanName = beanName;
this.field = field; this.field = field;
this.key = key; this.key = key;
this.placeholder = placeholder; this.placeholder = placeholder;
this.targetType = field.getType(); this.targetType = field.getType();
this.isJson = isJson;
if (isJson) {
this.genericType = field.getGenericType();
}
} }
public SpringValue(String key, String placeholder, Object bean, String beanName, Method method, boolean isJson) { public SpringValue(String key, String placeholder, Object bean, String beanName, Method method) {
this.beanRef = new WeakReference<>(bean); this.beanRef = new WeakReference<>(bean);
this.beanName = beanName; this.beanName = beanName;
this.methodParameter = new MethodParameter(method, 0); this.methodParameter = new MethodParameter(method, 0);
@ -68,10 +61,6 @@ public class SpringValue {
this.placeholder = placeholder; this.placeholder = placeholder;
Class<?>[] paramTps = method.getParameterTypes(); Class<?>[] paramTps = method.getParameterTypes();
this.targetType = paramTps[0]; this.targetType = paramTps[0];
this.isJson = isJson;
if (isJson) {
this.genericType = method.getGenericParameterTypes()[0];
}
} }
public void update(Object newVal) throws IllegalAccessException, InvocationTargetException { public void update(Object newVal) throws IllegalAccessException, InvocationTargetException {
@ -127,14 +116,6 @@ public class SpringValue {
return field; return field;
} }
public Type getGenericType() {
return genericType;
}
public boolean isJson() {
return isJson;
}
boolean isTargetBeanValid() { boolean isTargetBeanValid() {
return beanRef.get() != null; return beanRef.get() != null;
} }

@ -35,6 +35,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.TypedStringValue; import org.springframework.beans.factory.config.TypedStringValue;
import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.lang.NonNull;
/** /**
* To process xml config placeholders, e.g. * To process xml config placeholders, e.g.
@ -59,7 +60,7 @@ public class SpringValueDefinitionProcessor implements BeanDefinitionRegistryPos
private final PlaceholderHelper placeholderHelper; private final PlaceholderHelper placeholderHelper;
private PolarisConfigProperties polarisConfigProperties; private final PolarisConfigProperties polarisConfigProperties;
public SpringValueDefinitionProcessor(PlaceholderHelper placeholderHelper, PolarisConfigProperties polarisConfigProperties) { public SpringValueDefinitionProcessor(PlaceholderHelper placeholderHelper, PolarisConfigProperties polarisConfigProperties) {
this.polarisConfigProperties = polarisConfigProperties; this.polarisConfigProperties = polarisConfigProperties;
@ -67,14 +68,14 @@ public class SpringValueDefinitionProcessor implements BeanDefinitionRegistryPos
} }
@Override @Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { public void postProcessBeanDefinitionRegistry(@NonNull BeanDefinitionRegistry registry) throws BeansException {
if (polarisConfigProperties.isAutoRefresh()) { if (polarisConfigProperties.isAutoRefresh()) {
processPropertyValues(registry); processPropertyValues(registry);
} }
} }
@Override @Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { public void postProcessBeanFactory(@NonNull ConfigurableListableBeanFactory beanFactory) throws BeansException {
} }

@ -94,14 +94,8 @@ public class SpringValueRegistry {
Iterator<Multimap<String, SpringValue>> iterator = registry.values().iterator(); Iterator<Multimap<String, SpringValue>> iterator = registry.values().iterator();
while (!Thread.currentThread().isInterrupted() && iterator.hasNext()) { while (!Thread.currentThread().isInterrupted() && iterator.hasNext()) {
Multimap<String, SpringValue> springValues = iterator.next(); Multimap<String, SpringValue> springValues = iterator.next();
Iterator<Map.Entry<String, SpringValue>> springValueIterator = springValues.entries().iterator();
while (springValueIterator.hasNext()) {
Map.Entry<String, SpringValue> springValue = springValueIterator.next();
if (!springValue.getValue().isTargetBeanValid()) {
// clear unused spring values // clear unused spring values
springValueIterator.remove(); springValues.entries().removeIf(springValue -> !springValue.getValue().isTargetBeanValid());
}
}
} }
} }
} }

@ -83,7 +83,7 @@ public class PolarisPropertiesSourceAutoRefresherTest {
MockedConfigChange mockedConfigChange = new MockedConfigChange(); MockedConfigChange mockedConfigChange = new MockedConfigChange();
mockedConfigChange.setK1("v1"); mockedConfigChange.setK1("v1");
Field field = mockedConfigChange.getClass().getDeclaredField("k1"); Field field = mockedConfigChange.getClass().getDeclaredField("k1");
SpringValue springValue = new SpringValue("v1", "placeholder", mockedConfigChange, "mockedConfigChange", field, false); SpringValue springValue = new SpringValue("v1", "placeholder", mockedConfigChange, "mockedConfigChange", field);
springValues.add(springValue); springValues.add(springValue);

@ -15,6 +15,7 @@
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
* *
*/ */
package com.tencent.cloud.polaris; package com.tencent.cloud.polaris;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

@ -46,5 +46,4 @@ public @interface PolarisClient {
* @return namespace * @return namespace
*/ */
String namespace() default ""; String namespace() default "";
} }

@ -14,6 +14,7 @@
* CONDITIONS OF ANY KIND, either express or implied. See the License for the * CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
*/ */
package com.tencent.cloud.polaris.discovery.refresh; package com.tencent.cloud.polaris.discovery.refresh;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;

@ -14,6 +14,7 @@
* CONDITIONS OF ANY KIND, either express or implied. See the License for the * CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
*/ */
package com.tencent.cloud.polaris.discovery.refresh; package com.tencent.cloud.polaris.discovery.refresh;
import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;

@ -14,6 +14,7 @@
* CONDITIONS OF ANY KIND, either express or implied. See the License for the * CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
*/ */
package com.tencent.cloud.polaris.discovery.refresh; package com.tencent.cloud.polaris.discovery.refresh;
import java.util.Set; import java.util.Set;
@ -32,6 +33,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.cloud.client.discovery.event.HeartbeatEvent; import org.springframework.cloud.client.discovery.event.HeartbeatEvent;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.lang.NonNull;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
/** /**
@ -93,7 +95,7 @@ public class PolarisServiceStatusChangeListener extends AbstractResourceEventLis
} }
@Override @Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { public void setApplicationEventPublisher(@NonNull ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher; this.publisher = applicationEventPublisher;
} }
} }

@ -51,7 +51,7 @@ import static org.springframework.util.ReflectionUtils.rethrowRuntimeException;
*/ */
public class PolarisServiceRegistry implements ServiceRegistry<Registration> { public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
private static final Logger LOG = LoggerFactory.getLogger(PolarisServiceRegistry.class); private static final Logger LOGGER = LoggerFactory.getLogger(PolarisServiceRegistry.class);
private final PolarisDiscoveryProperties polarisDiscoveryProperties; private final PolarisDiscoveryProperties polarisDiscoveryProperties;
@ -80,7 +80,7 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
@Override @Override
public void register(Registration registration) { public void register(Registration registration) {
if (StringUtils.isEmpty(registration.getServiceId())) { if (StringUtils.isEmpty(registration.getServiceId())) {
LOG.warn("No service to register for polaris client..."); LOGGER.warn("No service to register for polaris client...");
return; return;
} }
// Register instance. // Register instance.
@ -103,7 +103,7 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
try { try {
ProviderAPI providerClient = polarisDiscoveryHandler.getProviderAPI(); ProviderAPI providerClient = polarisDiscoveryHandler.getProviderAPI();
providerClient.register(instanceRegisterRequest); providerClient.register(instanceRegisterRequest);
LOG.info("polaris registry, {} {} {}:{} {} register finished", LOGGER.info("polaris registry, {} {} {}:{} {} register finished",
polarisDiscoveryProperties.getNamespace(), polarisDiscoveryProperties.getNamespace(),
registration.getServiceId(), registration.getHost(), registration.getServiceId(), registration.getHost(),
registration.getPort(), staticMetadataManager.getMergedStaticMetadata()); registration.getPort(), staticMetadataManager.getMergedStaticMetadata());
@ -116,17 +116,17 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
} }
} }
catch (Exception e) { catch (Exception e) {
LOG.error("polaris registry, {} register failed...{},", registration.getServiceId(), registration, e); LOGGER.error("polaris registry, {} register failed...{},", registration.getServiceId(), registration, e);
rethrowRuntimeException(e); rethrowRuntimeException(e);
} }
} }
@Override @Override
public void deregister(Registration registration) { public void deregister(Registration registration) {
LOG.info("De-registering from Polaris Server now..."); LOGGER.info("De-registering from Polaris Server now...");
if (StringUtils.isEmpty(registration.getServiceId())) { if (StringUtils.isEmpty(registration.getServiceId())) {
LOG.warn("No dom to de-register for polaris client..."); LOGGER.warn("No dom to de-register for polaris client...");
return; return;
} }
@ -142,14 +142,14 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
providerClient.deRegister(deRegisterRequest); providerClient.deRegister(deRegisterRequest);
} }
catch (Exception e) { catch (Exception e) {
LOG.error("ERR_POLARIS_DEREGISTER, de-register failed...{},", registration, e); LOGGER.error("ERR_POLARIS_DEREGISTER, de-register failed...{},", registration, e);
} }
finally { finally {
if (null != heartbeatExecutor) { if (null != heartbeatExecutor) {
heartbeatExecutor.shutdown(); heartbeatExecutor.shutdown();
} }
} }
LOG.info("De-registration finished."); LOGGER.info("De-registration finished.");
} }
@Override @Override
@ -201,7 +201,7 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
heartbeatRequest.getHost(), heartbeatRequest.getPort(), healthCheckEndpoint); heartbeatRequest.getHost(), heartbeatRequest.getPort(), healthCheckEndpoint);
if (!OkHttpUtil.get(healthCheckUrl, null)) { if (!OkHttpUtil.get(healthCheckUrl, null)) {
LOG.error("backend service health check failed. health check endpoint = {}", healthCheckEndpoint); LOGGER.error("backend service health check failed. health check endpoint = {}", healthCheckEndpoint);
return; return;
} }
} }
@ -209,10 +209,10 @@ public class PolarisServiceRegistry implements ServiceRegistry<Registration> {
polarisDiscoveryHandler.getProviderAPI().heartbeat(heartbeatRequest); polarisDiscoveryHandler.getProviderAPI().heartbeat(heartbeatRequest);
} }
catch (PolarisException e) { catch (PolarisException e) {
LOG.error("polaris heartbeat[{}]", e.getCode(), e); LOGGER.error("polaris heartbeat[{}]", e.getCode(), e);
} }
catch (Exception e) { catch (Exception e) {
LOG.error("polaris heartbeat runtime error", e); LOGGER.error("polaris heartbeat runtime error", e);
} }
}, polarisDiscoveryProperties.getHeartbeatInterval(), polarisDiscoveryProperties.getHeartbeatInterval(), MILLISECONDS); }, polarisDiscoveryProperties.getHeartbeatInterval(), polarisDiscoveryProperties.getHeartbeatInterval(), MILLISECONDS);
} }

@ -39,7 +39,7 @@ public class PolarisServerList extends AbstractServerList<Server> {
private String serviceId; private String serviceId;
private PolarisDiscoveryHandler polarisDiscoveryHandler; private final PolarisDiscoveryHandler polarisDiscoveryHandler;
public PolarisServerList(PolarisDiscoveryHandler polarisDiscoveryHandler) { public PolarisServerList(PolarisDiscoveryHandler polarisDiscoveryHandler) {
this.polarisDiscoveryHandler = polarisDiscoveryHandler; this.polarisDiscoveryHandler = polarisDiscoveryHandler;

@ -36,7 +36,7 @@ public final class OkHttpUtil {
/** /**
* Logger. * Logger.
*/ */
public final static Logger logger = LoggerFactory.getLogger(OkHttpUtil.class); public final static Logger LOGGER = LoggerFactory.getLogger(OkHttpUtil.class);
/** /**
* client. * client.
@ -62,12 +62,12 @@ public final class OkHttpUtil {
if (response.isSuccessful() && Objects.nonNull(response.body())) { if (response.isSuccessful() && Objects.nonNull(response.body())) {
String result = response.body().string(); String result = response.body().string();
logger.debug("exec get request, url: {} successresponse data: {}", url, result); LOGGER.debug("exec get request, url: {} successresponse data: {}", url, result);
return true; return true;
} }
} }
catch (Exception e) { catch (Exception e) {
logger.error("exec get requesturl: {} failed!", url, e); LOGGER.error("exec get requesturl: {} failed!", url, e);
} }
return false; return false;
} }

@ -27,6 +27,13 @@ import org.springframework.core.Ordered;
*/ */
public final class RateLimitConstant { public final class RateLimitConstant {
/**
* Default Private Constructor .
*/
private RateLimitConstant() {
}
/** /**
* Order of filter. * Order of filter.
*/ */
@ -41,7 +48,4 @@ public final class RateLimitConstant {
* The build in label method. * The build in label method.
*/ */
public static String LABEL_METHOD = "method"; public static String LABEL_METHOD = "method";
private RateLimitConstant() {
}
} }

@ -76,7 +76,7 @@ public class PolarisRateLimitRuleEndpoint {
} }
for (RateLimitProto.Rule rule : rateLimit.getRulesList()) { for (RateLimitProto.Rule rule : rateLimit.getRulesList()) {
String ruleJson = ""; String ruleJson;
try { try {
ruleJson = JsonFormat.printer().print(rule); ruleJson = JsonFormat.printer().print(rule);
} }

@ -46,5 +46,4 @@ public class PolarisRateLimitRuleEndpointAutoConfiguration {
public PolarisRateLimitRuleEndpoint polarisRateLimitRuleEndpoint(ServiceRuleManager serviceRuleManager, PolarisRateLimitProperties properties) { public PolarisRateLimitRuleEndpoint polarisRateLimitRuleEndpoint(ServiceRuleManager serviceRuleManager, PolarisRateLimitProperties properties) {
return new PolarisRateLimitRuleEndpoint(serviceRuleManager, properties); return new PolarisRateLimitRuleEndpoint(serviceRuleManager, properties);
} }
} }

@ -60,7 +60,7 @@ import static com.tencent.cloud.polaris.ratelimit.constant.RateLimitConstant.LAB
*/ */
public class QuotaCheckReactiveFilter implements WebFilter, Ordered { public class QuotaCheckReactiveFilter implements WebFilter, Ordered {
private static final Logger LOG = LoggerFactory.getLogger(QuotaCheckReactiveFilter.class); private static final Logger LOGGER = LoggerFactory.getLogger(QuotaCheckReactiveFilter.class);
private final LimitAPI limitAPI; private final LimitAPI limitAPI;
@ -114,14 +114,14 @@ public class QuotaCheckReactiveFilter implements WebFilter, Ordered {
} }
// Unirate // Unirate
if (quotaResponse.getCode() == QuotaResultCode.QuotaResultOk && quotaResponse.getWaitMs() > 0) { if (quotaResponse.getCode() == QuotaResultCode.QuotaResultOk && quotaResponse.getWaitMs() > 0) {
LOG.debug("The request of [{}] will waiting for {}ms.", path, quotaResponse.getWaitMs()); LOGGER.debug("The request of [{}] will waiting for {}ms.", path, quotaResponse.getWaitMs());
return Mono.delay(Duration.ofMillis(quotaResponse.getWaitMs())).flatMap(e -> chain.filter(exchange)); return Mono.delay(Duration.ofMillis(quotaResponse.getWaitMs())).flatMap(e -> chain.filter(exchange));
} }
} }
catch (Throwable t) { catch (Throwable t) {
// An exception occurs in the rate limiting API call, // An exception occurs in the rate limiting API call,
// which should not affect the call of the business process. // which should not affect the call of the business process.
LOG.error("fail to invoke getQuota, service is " + localService, t); LOGGER.error("fail to invoke getQuota, service is " + localService, t);
} }
return chain.filter(exchange); return chain.filter(exchange);
@ -153,7 +153,7 @@ public class QuotaCheckReactiveFilter implements WebFilter, Ordered {
return labelResolver.resolve(exchange); return labelResolver.resolve(exchange);
} }
catch (Throwable e) { catch (Throwable e) {
LOG.error("resolve custom label failed. resolver = {}", labelResolver.getClass().getName(), e); LOGGER.error("resolve custom label failed. resolver = {}", labelResolver.getClass().getName(), e);
} }
} }
return Maps.newHashMap(); return Maps.newHashMap();

@ -46,6 +46,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.lang.NonNull;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import static com.tencent.cloud.polaris.ratelimit.constant.RateLimitConstant.LABEL_METHOD; import static com.tencent.cloud.polaris.ratelimit.constant.RateLimitConstant.LABEL_METHOD;
@ -91,7 +92,8 @@ public class QuotaCheckServletFilter extends OncePerRequestFilter {
} }
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response,
@NonNull FilterChain filterChain)
throws ServletException, IOException { throws ServletException, IOException {
String localNamespace = MetadataContext.LOCAL_NAMESPACE; String localNamespace = MetadataContext.LOCAL_NAMESPACE;
String localService = MetadataContext.LOCAL_SERVICE; String localService = MetadataContext.LOCAL_SERVICE;

@ -14,6 +14,7 @@
* CONDITIONS OF ANY KIND, either express or implied. See the License for the * CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
*/ */
package com.tencent.cloud.polaris.ratelimit.utils; package com.tencent.cloud.polaris.ratelimit.utils;
import java.util.Map; import java.util.Map;

@ -25,11 +25,15 @@ package com.tencent.cloud.polaris.router;
*/ */
public final class RouterConstants { public final class RouterConstants {
/** /**
* the header of router label. * Default Private Constructor.
*/ */
public static final String ROUTER_LABEL_HEADER = "internal-router-label";
private RouterConstants() { private RouterConstants() {
} }
/**
* the header of router label.
*/
public static final String ROUTER_LABEL_HEADER = "internal-router-label";
} }

@ -33,6 +33,7 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.NonNull;
/** /**
* Decorate IRule with PolarisLoadBalancerCompositeRule. * Decorate IRule with PolarisLoadBalancerCompositeRule.
@ -44,7 +45,7 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessor implements BeanPo
private BeanFactory beanFactory; private BeanFactory beanFactory;
@Override @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
if (bean instanceof AbstractLoadBalancerRule) { if (bean instanceof AbstractLoadBalancerRule) {
RouterAPI routerAPI = beanFactory.getBean(RouterAPI.class); RouterAPI routerAPI = beanFactory.getBean(RouterAPI.class);
PolarisLoadBalancerProperties polarisLoadBalancerProperties = beanFactory.getBean(PolarisLoadBalancerProperties.class); PolarisLoadBalancerProperties polarisLoadBalancerProperties = beanFactory.getBean(PolarisLoadBalancerProperties.class);
@ -59,7 +60,7 @@ public class PolarisLoadBalancerCompositeRuleBeanPostProcessor implements BeanPo
} }
@Override @Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException { public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory; this.beanFactory = beanFactory;
} }
} }

@ -34,9 +34,11 @@ import com.tencent.cloud.polaris.router.interceptor.RuleBasedRouterRequestInterc
import com.tencent.cloud.polaris.router.spi.ServletRouterLabelResolver; import com.tencent.cloud.polaris.router.spi.ServletRouterLabelResolver;
import com.tencent.cloud.polaris.router.zuul.PolarisRibbonRoutingFilter; import com.tencent.cloud.polaris.router.zuul.PolarisRibbonRoutingFilter;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration;
import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper;
import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandFactory; import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -93,8 +95,15 @@ public class RouterAutoConfiguration {
return new RuleBasedRouterRequestInterceptor(polarisRuleBasedRouterProperties); return new RuleBasedRouterRequestInterceptor(polarisRuleBasedRouterProperties);
} }
@Bean(initMethod = "init") /**
* AutoConfiguration for router module integrate for zuul.
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(name = "org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter") @ConditionalOnClass(name = "org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter")
@AutoConfigureAfter(ZuulServerAutoConfiguration.class)
public static class ZuulRouterAutoConfiguration {
@Bean(initMethod = "init")
public PolarisRibbonRoutingFilter ribbonRoutingFilter(ProxyRequestHelper helper, public PolarisRibbonRoutingFilter ribbonRoutingFilter(ProxyRequestHelper helper,
RibbonCommandFactory<?> ribbonCommandFactory, RibbonCommandFactory<?> ribbonCommandFactory,
MetadataLocalProperties metadataLocalProperties, MetadataLocalProperties metadataLocalProperties,
@ -104,3 +113,4 @@ public class RouterAutoConfiguration {
routerRuleLabelResolver, routerLabelResolvers); routerRuleLabelResolver, routerLabelResolvers);
} }
} }
}

@ -49,6 +49,7 @@ import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper;
import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandFactory; import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandFactory;
import org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter; import org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.lang.NonNull;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
@ -177,7 +178,7 @@ public class PolarisRibbonRoutingFilter extends RibbonRoutingFilter implements B
} }
@Override @Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException { public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {
this.factory = beanFactory; this.factory = beanFactory;
} }

@ -80,7 +80,7 @@ import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class PolarisLoadBalancerCompositeRuleTest { public class PolarisLoadBalancerCompositeRuleTest {
private static AtomicBoolean initTransitiveMetadata = new AtomicBoolean(false); private static final AtomicBoolean initTransitiveMetadata = new AtomicBoolean(false);
@Mock @Mock
private PolarisLoadBalancerProperties polarisLoadBalancerProperties; private PolarisLoadBalancerProperties polarisLoadBalancerProperties;
@Mock @Mock

@ -18,7 +18,6 @@
package com.tencent.cloud.polaris.router; package com.tencent.cloud.polaris.router;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;

@ -1,3 +1,21 @@
/*
* 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.router.beanprocessor; package com.tencent.cloud.polaris.router.beanprocessor;
import com.netflix.loadbalancer.AbstractLoadBalancerRule; import com.netflix.loadbalancer.AbstractLoadBalancerRule;
@ -25,7 +43,6 @@ import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
/** /**
* Test for {@link PolarisLoadBalancerCompositeRuleBeanPostProcessor}. * Test for {@link PolarisLoadBalancerCompositeRuleBeanPostProcessor}.
* *

@ -18,7 +18,6 @@
package com.tencent.cloud.polaris.router.resttemplate; package com.tencent.cloud.polaris.router.resttemplate;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.Collections; import java.util.Collections;

@ -18,7 +18,6 @@
package com.tencent.cloud.polaris.router.scg; package com.tencent.cloud.polaris.router.scg;
import java.net.URI; import java.net.URI;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;

@ -369,5 +369,4 @@ public class PolarisRibbonRoutingFilterTest {
verify(polarisLoadBalancer).chooseServer(routerContext); verify(polarisLoadBalancer).chooseServer(routerContext);
verify(metadataLocalProperties, times(1)).getContent(); verify(metadataLocalProperties, times(1)).getContent();
} }
} }

@ -33,7 +33,6 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory;
public final class BeanFactoryUtils { public final class BeanFactoryUtils {
private BeanFactoryUtils() { private BeanFactoryUtils() {
} }
public static <T> List<T> getBeans(BeanFactory beanFactory, Class<T> requiredType) { public static <T> List<T> getBeans(BeanFactory beanFactory, Class<T> requiredType) {

@ -26,8 +26,6 @@ import com.tencent.cloud.polaris.context.config.PolarisContextProperties;
import com.tencent.polaris.factory.config.ConfigurationImpl; import com.tencent.polaris.factory.config.ConfigurationImpl;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
/** /**
* Modify polaris server address. * Modify polaris server address.
* *
@ -35,8 +33,11 @@ import org.springframework.beans.factory.annotation.Autowired;
*/ */
public class ModifyAddress implements PolarisConfigModifier { public class ModifyAddress implements PolarisConfigModifier {
@Autowired private final PolarisContextProperties properties;
private PolarisContextProperties properties;
public ModifyAddress(PolarisContextProperties properties) {
this.properties = properties;
}
@Override @Override
public void modify(ConfigurationImpl configuration) { public void modify(ConfigurationImpl configuration) {

@ -63,8 +63,8 @@ public class PolarisContextAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public ModifyAddress polarisConfigModifier() { public ModifyAddress polarisConfigModifier(PolarisContextProperties properties) {
return new ModifyAddress(); return new ModifyAddress(properties);
} }
@Bean @Bean

@ -24,6 +24,7 @@ import org.springframework.boot.context.logging.LoggingApplicationListener;
import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.GenericApplicationListener; import org.springframework.context.event.GenericApplicationListener;
import org.springframework.core.ResolvableType; import org.springframework.core.ResolvableType;
import org.springframework.lang.NonNull;
/** /**
* Reload of Polaris logging configuration. * Reload of Polaris logging configuration.
@ -50,7 +51,7 @@ public class PolarisLoggingApplicationListener implements GenericApplicationList
} }
@Override @Override
public void onApplicationEvent(ApplicationEvent applicationEvent) { public void onApplicationEvent(@NonNull ApplicationEvent applicationEvent) {
PolarisLogging.getInstance().loadConfiguration(); PolarisLogging.getInstance().loadConfiguration();
} }
} }

@ -14,11 +14,9 @@
* CONDITIONS OF ANY KIND, either express or implied. See the License for the * CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License. * specific language governing permissions and limitations under the License.
*/ */
// CHECKSTYLE:OFF
package com.tencent.cloud.polaris.loadbalancer; package com.tencent.cloud.polaris.loadbalancer;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -52,7 +50,6 @@ import org.springframework.cloud.netflix.ribbon.StaticServerList;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
/** /**
* Test for {@link PolarisLoadBalancer}. * Test for {@link PolarisLoadBalancer}.
* *

@ -31,6 +31,7 @@ import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient;
import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory; import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient; import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient;
import org.springframework.lang.NonNull;
/** /**
* Wrap Spring Bean and decorating proxy for Feign Client. * Wrap Spring Bean and decorating proxy for Feign Client.
@ -48,7 +49,7 @@ public class EnhancedFeignBeanPostProcessor implements BeanPostProcessor, BeanFa
} }
@Override @Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { public Object postProcessBeforeInitialization(@NonNull Object bean, @NonNull String beanName) throws BeansException {
return wrapper(bean); return wrapper(bean);
} }

@ -24,6 +24,7 @@ import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
import org.springframework.lang.NonNull;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
@ -59,7 +60,7 @@ public class EnhancedRestTemplateModifier implements ApplicationContextAware, Sm
} }
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext; this.applicationContext = applicationContext;
} }
} }

@ -17,7 +17,6 @@
package com.tencent.cloud.rpc.enhancement.resttemplate; package com.tencent.cloud.rpc.enhancement.resttemplate;
import java.io.IOException;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URI; import java.net.URI;
import java.net.URL; import java.net.URL;
@ -46,7 +45,7 @@ import org.springframework.web.client.ResponseErrorHandler;
*/ */
public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter implements ResponseErrorHandler { public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter implements ResponseErrorHandler {
private static final Logger LOG = LoggerFactory.getLogger(EnhancedRestTemplateReporter.class); private static final Logger LOGGER = LoggerFactory.getLogger(EnhancedRestTemplateReporter.class);
private static final String FIELD_NAME = "connection"; private static final String FIELD_NAME = "connection";
@ -67,10 +66,10 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter
} }
@Override @Override
public void handleError(@NonNull URI url, @NonNull HttpMethod method, @NonNull ClientHttpResponse response) public void handleError(@NonNull URI url, @NonNull HttpMethod method, @NonNull ClientHttpResponse response) {
throws IOException {
ServiceCallResult resultRequest = createServiceCallResult(url); ServiceCallResult resultRequest = createServiceCallResult(url);
try { try {
HttpURLConnection connection = (HttpURLConnection) ReflectionUtils.getFieldValue(response, FIELD_NAME); HttpURLConnection connection = (HttpURLConnection) ReflectionUtils.getFieldValue(response, FIELD_NAME);
if (connection != null) { if (connection != null) {
URL realURL = connection.getURL(); URL realURL = connection.getURL();
@ -78,20 +77,19 @@ public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter
resultRequest.setPort(realURL.getPort()); resultRequest.setPort(realURL.getPort());
} }
// checking response http status code
if (apply(response.getStatusCode())) { if (apply(response.getStatusCode())) {
resultRequest.setRetStatus(RetStatus.RetFail); resultRequest.setRetStatus(RetStatus.RetFail);
} }
}
catch (Exception e) { // processing report with consumerAPI .
LOG.error("Will report response of {} url {}", response, url, e); LOGGER.debug("Will report result of {}. URL=[{}]. Response=[{}].", resultRequest.getRetStatus().name(),
resultRequest.setRetStatus(RetStatus.RetFail);
throw e;
}
finally {
LOG.debug("Will report result of {}. URL=[{}]. Response=[{}].", resultRequest.getRetStatus().name(),
url, response); url, response);
consumerAPI.updateServiceCallResult(resultRequest); consumerAPI.updateServiceCallResult(resultRequest);
} }
catch (Exception e) {
LOGGER.error("RestTemplate response reporter execute failed of {} url {}", response, url, e);
}
} }
private ServiceCallResult createServiceCallResult(URI uri) { private ServiceCallResult createServiceCallResult(URI uri) {

Loading…
Cancel
Save