feat:support body store switch. (#1771)

Signed-off-by: Haotian Zhang <928016560@qq.com>
2021
Haotian Zhang 1 week ago
parent ad0f40f645
commit ffbe8749a5

@ -33,3 +33,4 @@
- [fix: fix nacos service discovery.](https://github.com/Tencent/spring-cloud-tencent/pull/1752)
- [fix:fix NPE when rate-limiting with null value.](https://github.com/Tencent/spring-cloud-tencent/pull/1763)
- [fix: get source service name from upstream application meta in getServerPreSpanAttributes & set custom tag in current server span in tsf.](https://github.com/Tencent/spring-cloud-tencent/pull/1767)
- [feat:support body store switch.](https://github.com/Tencent/spring-cloud-tencent/pull/1771)

@ -31,7 +31,7 @@ import org.springframework.context.annotation.Configuration;
* @author Haotian Zhang
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "spring.cloud.polaris.fault-injection.enabled", matchIfMissing = true)
@ConditionalOnProperty("spring.cloud.polaris.fault-injection.enabled")
@EnableConfigurationProperties(FaultInjectionProperties.class)
public class FaultInjectionAutoConfiguration {

@ -28,9 +28,9 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
public class FaultInjectionProperties {
/**
* If traffic mirroring is enabled. Default is true.
* If traffic mirroring is enabled. Default is false.
*/
private boolean enabled = true;
private boolean enabled = false;
public boolean isEnabled() {
return enabled;

@ -33,7 +33,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnPolarisRouterEnabled
@ConditionalOnProperty(value = "spring.cloud.polaris.traffic-mirroring.enabled", matchIfMissing = true)
@ConditionalOnProperty("spring.cloud.polaris.traffic-mirroring.enabled")
@EnableConfigurationProperties(TrafficMirroringProperties.class)
public class TrafficMirroringAutoConfiguration {

@ -28,9 +28,9 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
public class TrafficMirroringProperties {
/**
* If traffic mirroring is enabled. Default is true.
* If traffic mirroring is enabled. Default is false.
*/
private boolean enabled = true;
private boolean enabled = false;
/**
* Traffic mirroring request pool size. Default is 100.

@ -31,7 +31,7 @@ public class TrafficMirroringPropertiesTest {
void testDefaultValues() {
TrafficMirroringProperties properties = new TrafficMirroringProperties();
assertThat(properties.isEnabled()).isTrue();
assertThat(properties.isEnabled()).isFalse();
assertThat(properties.getRequestPoolSize()).isEqualTo(100);
assertThat(properties.getRequestConnectionTimeout()).isEqualTo(5000L);
}
@ -40,9 +40,9 @@ public class TrafficMirroringPropertiesTest {
void testEnabledProperty() {
TrafficMirroringProperties properties = new TrafficMirroringProperties();
properties.setEnabled(false);
properties.setEnabled(true);
assertThat(properties.isEnabled()).isFalse();
assertThat(properties.isEnabled()).isTrue();
}
@Test
@ -88,14 +88,14 @@ public class TrafficMirroringPropertiesTest {
@Test
void testToString() {
TrafficMirroringProperties properties = new TrafficMirroringProperties();
properties.setEnabled(false);
properties.setEnabled(true);
properties.setRequestPoolSize(8);
properties.setRequestConnectionTimeout(2000);
String result = properties.toString();
assertThat(result)
.contains("enabled=false")
.contains("enabled=true")
.contains("requestPoolSize=8")
.contains("requestConnectionTimeout=2000");
}

@ -17,6 +17,7 @@
package com.tencent.cloud.rpc.enhancement.beanprocessor;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.cloud.rpc.enhancement.instrument.resttemplate.PolarisBlockingLoadBalancerClient;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
@ -54,7 +55,8 @@ public class BlockingLoadBalancerClientBeanPostProcessor implements BeanPostProc
BlockingLoadBalancerClient delegate = (BlockingLoadBalancerClient) bean;
ReactiveLoadBalancer.Factory<ServiceInstance> requestFactory = this.factory.getBean(ReactiveLoadBalancer.Factory.class);
EnhancedPluginRunner pluginRunner = this.factory.getBean(EnhancedPluginRunner.class);
return new PolarisBlockingLoadBalancerClient(requestFactory, delegate, pluginRunner);
RpcEnhancementProperties rpcEnhancementProperties = this.factory.getBean(RpcEnhancementProperties.class);
return new PolarisBlockingLoadBalancerClient(requestFactory, delegate, pluginRunner, rpcEnhancementProperties);
}
return bean;
}

@ -164,8 +164,8 @@ public class RpcEnhancementAutoConfiguration {
protected static class PolarisFeignClientAutoConfiguration {
@Bean
public EnhancedFeignBeanPostProcessor polarisFeignBeanPostProcessor(@Lazy EnhancedPluginRunner pluginRunner) {
return new EnhancedFeignBeanPostProcessor(pluginRunner);
public EnhancedFeignBeanPostProcessor polarisFeignBeanPostProcessor(@Lazy EnhancedPluginRunner pluginRunner, RpcEnhancementProperties rpcEnhancementProperties) {
return new EnhancedFeignBeanPostProcessor(pluginRunner, rpcEnhancementProperties);
}
@Bean

@ -0,0 +1,55 @@
/*
* 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.rpc.enhancement.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Properties of RPC enhancement.
*
* @author Haotian Zhang
*/
@ConfigurationProperties("spring.cloud.tencent.rpc-enhancement")
public class RpcEnhancementProperties {
/**
* Whether report call result to polaris.
*/
private boolean enabled = true;
/**
* Whether to ignore the body of the request.
*/
private boolean ignoreBody = true;
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean isIgnoreBody() {
return ignoreBody;
}
public void setIgnoreBody(boolean ignoreBody) {
this.ignoreBody = ignoreBody;
}
}

@ -34,6 +34,12 @@ import org.springframework.web.client.RestTemplate;
@ConditionalOnPolarisEnabled
public class RpcEnhancementPropertiesAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public RpcEnhancementProperties rpcEnhancementProperties() {
return new RpcEnhancementProperties();
}
@Bean
@ConditionalOnMissingBean
public RpcEnhancementReporterProperties rpcEnhancementReporterProperties() {

@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.http.HttpStatus;
/**
* Properties of Polaris CircuitBreaker .
* Properties of RPC enhancement reporter.
*
* @author <a href="mailto:iskp.me@gmail.com">Elve.Xu</a> 2022-07-08
*/

@ -17,6 +17,7 @@
package com.tencent.cloud.rpc.enhancement.instrument.feign;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
import feign.Client;
@ -38,10 +39,13 @@ public class EnhancedFeignBeanPostProcessor implements BeanPostProcessor, BeanFa
private final EnhancedPluginRunner pluginRunner;
private final RpcEnhancementProperties rpcEnhancementProperties;
private BeanFactory factory;
public EnhancedFeignBeanPostProcessor(EnhancedPluginRunner pluginRunner) {
public EnhancedFeignBeanPostProcessor(EnhancedPluginRunner pluginRunner, RpcEnhancementProperties rpcEnhancementProperties) {
this.pluginRunner = pluginRunner;
this.rpcEnhancementProperties = rpcEnhancementProperties;
}
@Override
@ -77,7 +81,7 @@ public class EnhancedFeignBeanPostProcessor implements BeanPostProcessor, BeanFa
}
private EnhancedFeignClient createPolarisFeignClient(Client delegate) {
return new EnhancedFeignClient(delegate, pluginRunner);
return new EnhancedFeignClient(delegate, pluginRunner, rpcEnhancementProperties);
}
@Override

@ -29,6 +29,7 @@ import java.util.Map;
import com.tencent.cloud.common.constant.MetadataConstant;
import com.tencent.cloud.common.metadata.MetadataContext;
import com.tencent.cloud.common.metadata.MetadataContextHolder;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType;
@ -61,9 +62,12 @@ public class EnhancedFeignClient implements Client {
private final EnhancedPluginRunner pluginRunner;
public EnhancedFeignClient(Client target, EnhancedPluginRunner pluginRunner) {
private final RpcEnhancementProperties rpcEnhancementProperties;
public EnhancedFeignClient(Client target, EnhancedPluginRunner pluginRunner, RpcEnhancementProperties rpcEnhancementProperties) {
this.delegate = checkNotNull(target, "target");
this.pluginRunner = pluginRunner;
this.rpcEnhancementProperties = rpcEnhancementProperties;
}
@Override
@ -88,7 +92,7 @@ public class EnhancedFeignClient implements Client {
.build();
enhancedPluginContext.setRequest(enhancedRequestContext);
enhancedPluginContext.setOriginRequest(request);
if (request.body() != null) {
if (request.body() != null && !rpcEnhancementProperties.isIgnoreBody()) {
enhancedPluginContext.setOriginBody(request.body());
}

@ -25,6 +25,7 @@ import com.tencent.cloud.common.constant.ContextConstant;
import com.tencent.cloud.common.constant.MetadataConstant;
import com.tencent.cloud.common.metadata.MetadataContext;
import com.tencent.cloud.common.metadata.MetadataContextHolder;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginType;
@ -56,9 +57,13 @@ public class EnhancedRestTemplateBlockingLoadBalancerClientInterceptor {
private final LoadBalancerClient delegate;
public EnhancedRestTemplateBlockingLoadBalancerClientInterceptor(EnhancedPluginRunner pluginRunner, LoadBalancerClient delegate) {
private final RpcEnhancementProperties rpcEnhancementProperties;
public EnhancedRestTemplateBlockingLoadBalancerClientInterceptor(EnhancedPluginRunner pluginRunner,
LoadBalancerClient delegate, RpcEnhancementProperties rpcEnhancementProperties) {
this.pluginRunner = pluginRunner;
this.delegate = delegate;
this.rpcEnhancementProperties = rpcEnhancementProperties;
}
@ -84,7 +89,7 @@ public class EnhancedRestTemplateBlockingLoadBalancerClientInterceptor {
.build();
enhancedPluginContext.setRequest(enhancedRequestContext);
enhancedPluginContext.setOriginRequest(httpRequest);
if (body != null) {
if (body != null && !rpcEnhancementProperties.isIgnoreBody()) {
enhancedPluginContext.setOriginBody(body);
}

@ -19,6 +19,7 @@ package com.tencent.cloud.rpc.enhancement.instrument.resttemplate;
import java.io.IOException;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginRunner;
import org.springframework.cloud.client.ServiceInstance;
@ -36,13 +37,15 @@ import org.springframework.http.HttpRequest;
public class PolarisBlockingLoadBalancerClient extends BlockingLoadBalancerClient {
private final EnhancedPluginRunner enhancedPluginRunner;
private BlockingLoadBalancerClient delegate;
private final BlockingLoadBalancerClient delegate;
private final RpcEnhancementProperties rpcEnhancementProperties;
public PolarisBlockingLoadBalancerClient(ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerClientFactory,
BlockingLoadBalancerClient delegate, EnhancedPluginRunner enhancedPluginRunner) {
BlockingLoadBalancerClient delegate, EnhancedPluginRunner enhancedPluginRunner, RpcEnhancementProperties rpcEnhancementProperties) {
super(loadBalancerClientFactory);
this.delegate = delegate;
this.enhancedPluginRunner = enhancedPluginRunner;
this.rpcEnhancementProperties = rpcEnhancementProperties;
}
/**
@ -55,7 +58,7 @@ public class PolarisBlockingLoadBalancerClient extends BlockingLoadBalancerClien
return delegate.execute(serviceId, request);
}
byte[] body = LoadBalancerUtils.getHttpBodyIfAvailable(request);
EnhancedRestTemplateBlockingLoadBalancerClientInterceptor enhancedRestTemplateBlockingLoadBalancerClientInterceptor = new EnhancedRestTemplateBlockingLoadBalancerClientInterceptor(enhancedPluginRunner, delegate);
EnhancedRestTemplateBlockingLoadBalancerClientInterceptor enhancedRestTemplateBlockingLoadBalancerClientInterceptor = new EnhancedRestTemplateBlockingLoadBalancerClientInterceptor(enhancedPluginRunner, delegate, rpcEnhancementProperties);
return enhancedRestTemplateBlockingLoadBalancerClientInterceptor.intercept(httpRequest, body, serviceId, null, request);
}
@ -69,7 +72,7 @@ public class PolarisBlockingLoadBalancerClient extends BlockingLoadBalancerClien
return delegate.execute(serviceId, serviceInstance, request);
}
byte[] body = LoadBalancerUtils.getHttpBodyIfAvailable(request);
EnhancedRestTemplateBlockingLoadBalancerClientInterceptor enhancedRestTemplateBlockingLoadBalancerClientInterceptor = new EnhancedRestTemplateBlockingLoadBalancerClientInterceptor(enhancedPluginRunner, delegate);
EnhancedRestTemplateBlockingLoadBalancerClientInterceptor enhancedRestTemplateBlockingLoadBalancerClientInterceptor = new EnhancedRestTemplateBlockingLoadBalancerClientInterceptor(enhancedPluginRunner, delegate, rpcEnhancementProperties);
return enhancedRestTemplateBlockingLoadBalancerClientInterceptor.intercept(httpRequest, body, serviceId, serviceInstance, request);
}
}

@ -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.rpc.enhancement.config;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Test For {@link RpcEnhancementProperties}.
*
* @author Haotian Zhang
*/
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = RpcEnhancementPropertiesTest.TestApplication.class, properties = {
"spring.application.name=test",
"spring.cloud.gateway.enabled=false",
"spring.cloud.tencent.rpc-enhancement=true",
"spring.cloud.tencent.rpc-enhancement.ignore-body=false"
})
@ActiveProfiles("test")
public class RpcEnhancementPropertiesTest {
@Autowired
private RpcEnhancementProperties rpcEnhancementProperties;
@Test
public void testDefaultInitialization() {
assertThat(rpcEnhancementProperties).isNotNull();
assertThat(rpcEnhancementProperties.isEnabled()).isTrue();
assertThat(rpcEnhancementProperties.isIgnoreBody()).isFalse();
}
@SpringBootApplication
protected static class TestApplication {
}
}

@ -17,6 +17,7 @@
package com.tencent.cloud.rpc.enhancement.instrument.feign;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import feign.Client;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@ -44,7 +45,7 @@ public class EnhancedFeignBeanPostProcessorTest {
@BeforeEach
void setUp() {
enhancedFeignBeanPostProcessor = new EnhancedFeignBeanPostProcessor(null);
enhancedFeignBeanPostProcessor = new EnhancedFeignBeanPostProcessor(null, null);
}
@Test
@ -61,6 +62,9 @@ public class EnhancedFeignBeanPostProcessorTest {
if (clazz.equals(LoadBalancerClientFactory.class)) {
return mock(LoadBalancerClientFactory.class);
}
if (RpcEnhancementProperties.class.equals(clazz)) {
return mock(RpcEnhancementProperties.class);
}
return null;
}).when(beanFactory).getBean(any(Class.class));
enhancedFeignBeanPostProcessor.setBeanFactory(beanFactory);

@ -25,6 +25,7 @@ import java.util.HashMap;
import java.util.List;
import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.cloud.rpc.enhancement.plugin.DefaultEnhancedPluginRunner;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPlugin;
import com.tencent.cloud.rpc.enhancement.plugin.EnhancedPluginContext;
@ -67,7 +68,7 @@ public class EnhancedFeignClientTest {
@Test
public void testConstructor() {
try {
new EnhancedFeignClient(null, null);
new EnhancedFeignClient(null, null, null);
fail("NullPointerException should be thrown.");
}
catch (Throwable e) {
@ -76,7 +77,7 @@ public class EnhancedFeignClientTest {
}
try {
new EnhancedFeignClient(mock(Client.class), null);
new EnhancedFeignClient(mock(Client.class), null, null);
}
catch (Throwable e) {
fail("Exception encountered.", e);
@ -85,7 +86,8 @@ public class EnhancedFeignClientTest {
List<EnhancedPlugin> enhancedPlugins = getMockEnhancedFeignPlugins();
try {
new EnhancedFeignClient(mock(Client.class),
new DefaultEnhancedPluginRunner(enhancedPlugins, new ArrayList<>(), polarisSDKContextManager.getSDKContext()));
new DefaultEnhancedPluginRunner(enhancedPlugins, new ArrayList<>(), polarisSDKContextManager.getSDKContext()),
new RpcEnhancementProperties());
}
catch (Throwable e) {
fail("Exception encountered.", e);
@ -115,7 +117,8 @@ public class EnhancedFeignClientTest {
requestTemplate.feignTarget(target);
EnhancedFeignClient polarisFeignClient = new EnhancedFeignClient(delegate,
new DefaultEnhancedPluginRunner(getMockEnhancedFeignPlugins(), new ArrayList<>(), polarisSDKContextManager.getSDKContext()));
new DefaultEnhancedPluginRunner(getMockEnhancedFeignPlugins(), new ArrayList<>(), polarisSDKContextManager.getSDKContext()),
new RpcEnhancementProperties());
// 200
Response response = polarisFeignClient.execute(Request.create(Request.HttpMethod.GET, "http://localhost:8080/test",
@ -162,7 +165,8 @@ public class EnhancedFeignClientTest {
requestTemplate.feignTarget(target);
EnhancedFeignClient polarisFeignClient = new EnhancedFeignClient(delegate,
new DefaultEnhancedPluginRunner(getMockCallAbortedExceptionEnhancedFeignPlugins(null), new ArrayList<>(), polarisSDKContextManager.getSDKContext()));
new DefaultEnhancedPluginRunner(getMockCallAbortedExceptionEnhancedFeignPlugins(null), new ArrayList<>(), polarisSDKContextManager.getSDKContext()),
new RpcEnhancementProperties());
// Exception
try {
@ -177,7 +181,8 @@ public class EnhancedFeignClientTest {
polarisFeignClient = new EnhancedFeignClient(delegate,
new DefaultEnhancedPluginRunner(getMockCallAbortedExceptionEnhancedFeignPlugins(
new CircuitBreakerStatus.FallbackInfo(200, new HashMap<>(), "mock ok")), new ArrayList<>(), polarisSDKContextManager.getSDKContext()));
new CircuitBreakerStatus.FallbackInfo(200, new HashMap<>(), "mock ok")), new ArrayList<>(), polarisSDKContextManager.getSDKContext()),
new RpcEnhancementProperties());
// fallback 200
Response response = polarisFeignClient.execute(Request.create(Request.HttpMethod.GET, "http://localhost:8080/test",

Loading…
Cancel
Save