rebuild optimize feign & rest-template circuit-breaker logic .

pull/424/head
misselvexu 3 years ago
parent 270adda0e3
commit e843ab116c

@ -18,6 +18,7 @@
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-tencent-polaris-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-tencent-rpc-enhancement</artifactId>

@ -25,7 +25,6 @@ import com.tencent.polaris.factory.config.ConfigurationImpl;
import com.tencent.polaris.plugins.router.healthy.RecoverRouterConfig;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -37,7 +36,6 @@ import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@ConditionalOnPolarisEnabled
@ConditionalOnProperty(value = "spring.cloud.polaris.circuitbreaker.enabled", havingValue = "true", matchIfMissing = true)
@EnableConfigurationProperties(PolarisCircuitBreakerProperties.class)
public class PolarisCircuitBreakerAutoConfiguration {
@Bean

@ -11,3 +11,9 @@ spring:
stat:
enabled: true
port: 28083
# tencent:
# rpc-enhancement:
# enabled: true
# ignore-internal-server-error: true
# series: server_error
# statuses: gateway_timeout, bad_gateway, service_unavailable

@ -15,12 +15,12 @@
* specific language governing permissions and limitations under the License.
*/
package com.tencent.cloud.polaris.circuitbreaker;
package com.tencent.cloud.rpc.enhancement;
import java.util.List;
import java.util.Objects;
import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -30,22 +30,22 @@ import org.springframework.lang.Nullable;
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
/**
* Abstract Polaris Circuit-Break Adapter .
* Abstract Polaris Reporter Adapter .
*
* @author <a href="mailto:iskp.me@gmail.com">Elve.Xu</a> 2022-07-11
*/
public abstract class AbstractPolarisCircuitBreakAdapter {
public abstract class AbstractPolarisReporterAdapter {
private static final Logger LOG = LoggerFactory.getLogger(AbstractPolarisCircuitBreakAdapter.class);
private static final Logger LOG = LoggerFactory.getLogger(AbstractPolarisReporterAdapter.class);
protected final PolarisCircuitBreakerProperties properties;
protected final RpcEnhancementProperties properties;
/**
* Constructor With {@link PolarisCircuitBreakerProperties} .
* Constructor With {@link RpcEnhancementProperties} .
*
* @param properties instance of {@link PolarisCircuitBreakerProperties}.
* @param properties instance of {@link RpcEnhancementProperties}.
*/
protected AbstractPolarisCircuitBreakAdapter(PolarisCircuitBreakerProperties properties) {
protected AbstractPolarisReporterAdapter(RpcEnhancementProperties properties) {
this.properties = properties;
}
@ -66,7 +66,7 @@ public abstract class AbstractPolarisCircuitBreakAdapter {
if (status.isEmpty()) {
List<HttpStatus.Series> series = properties.getSeries();
// Check INTERNAL_SERVER_ERROR (500) status.
if (properties.getIgnoreInternalServerError() && Objects.equals(httpStatus, INTERNAL_SERVER_ERROR)) {
if (properties.isIgnoreInternalServerError() && Objects.equals(httpStatus, INTERNAL_SERVER_ERROR)) {
return false;
}
if (series.isEmpty()) {

@ -33,6 +33,7 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
@ -48,6 +49,7 @@ import static org.springframework.core.Ordered.HIGHEST_PRECEDENCE;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "spring.cloud.tencent.rpc-enhancement.enabled", havingValue = "true", matchIfMissing = true)
@EnableConfigurationProperties(RpcEnhancementProperties.class)
@AutoConfigureAfter(PolarisContextAutoConfiguration.class)
public class RpcEnhancementAutoConfiguration {
@ -73,8 +75,8 @@ public class RpcEnhancementAutoConfiguration {
static class PolarisReporterConfig {
@Bean
public SuccessPolarisReporter successPolarisReporter() {
return new SuccessPolarisReporter();
public SuccessPolarisReporter successPolarisReporter(RpcEnhancementProperties properties) {
return new SuccessPolarisReporter(properties);
}
@Bean
@ -96,8 +98,9 @@ public class RpcEnhancementAutoConfiguration {
@Bean
public EnhancedRestTemplateReporter polarisRestTemplateResponseErrorHandler(
RpcEnhancementProperties properties,
ConsumerAPI consumerAPI) {
return new EnhancedRestTemplateReporter(consumerAPI);
return new EnhancedRestTemplateReporter(properties, consumerAPI);
}
@Bean

@ -15,7 +15,7 @@
* specific language governing permissions and limitations under the License.
*/
package com.tencent.cloud.polaris.circuitbreaker.config;
package com.tencent.cloud.rpc.enhancement.config;
import java.util.ArrayList;
import java.util.Arrays;
@ -41,13 +41,13 @@ import static org.springframework.http.HttpStatus.VARIANT_ALSO_NEGOTIATES;
*
* @author <a href="mailto:iskp.me@gmail.com">Elve.Xu</a> 2022-07-08
*/
@ConfigurationProperties("spring.cloud.polaris.circuitbreaker")
public class PolarisCircuitBreakerProperties {
@ConfigurationProperties("spring.cloud.tencent.rpc-enhancement")
public class RpcEnhancementProperties {
/**
* If circuit-breaker enabled.
*/
private Boolean enabled = true;
private boolean enabled = true;
/**
* Specify the Http status code(s) that needs to be fused.
@ -63,9 +63,9 @@ public class PolarisCircuitBreakerProperties {
/**
* Ignore Internal Server Error Http Status Code,
* Only takes effect if the attribute {@link PolarisCircuitBreakerProperties#series} is not empty.
* Only takes effect if the attribute {@link RpcEnhancementProperties#series} is not empty.
*/
private Boolean ignoreInternalServerError = true;
private boolean ignoreInternalServerError = true;
/**
* Convert items to List.
@ -79,13 +79,6 @@ public class PolarisCircuitBreakerProperties {
return new ArrayList<>(Arrays.asList(items));
}
public Boolean getEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public List<HttpStatus> getStatuses() {
return statuses;
@ -103,11 +96,19 @@ public class PolarisCircuitBreakerProperties {
this.series = series;
}
public Boolean getIgnoreInternalServerError() {
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public boolean isIgnoreInternalServerError() {
return ignoreInternalServerError;
}
public void setIgnoreInternalServerError(Boolean ignoreInternalServerError) {
public void setIgnoreInternalServerError(boolean ignoreInternalServerError) {
this.ignoreInternalServerError = ignoreInternalServerError;
}
}

@ -17,6 +17,8 @@
package com.tencent.cloud.rpc.enhancement.feign.plugin.reporter;
import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignContext;
import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignPlugin;
import com.tencent.cloud.rpc.enhancement.feign.plugin.EnhancedFeignPluginType;
@ -30,16 +32,21 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
/**
* Polaris reporter when feign call is successful.
*
* @author Haotian Zhang
*/
public class SuccessPolarisReporter implements EnhancedFeignPlugin {
public class SuccessPolarisReporter extends AbstractPolarisReporterAdapter implements EnhancedFeignPlugin {
private static final Logger LOG = LoggerFactory.getLogger(SuccessPolarisReporter.class);
public SuccessPolarisReporter(RpcEnhancementProperties properties) {
super(properties);
}
@Autowired(required = false)
private ConsumerAPI consumerAPI;
@ -59,7 +66,7 @@ public class SuccessPolarisReporter implements EnhancedFeignPlugin {
Request request = context.getRequest();
Response response = context.getResponse();
RetStatus retStatus = RetStatus.RetSuccess;
if (response.status() > 500) {
if (apply(HttpStatus.resolve(response.status()))) {
retStatus = RetStatus.RetFail;
}
LOG.debug("Will report result of {}. Request=[{}]. Response=[{}].", retStatus.name(), request, response);

@ -24,6 +24,8 @@ import java.net.URL;
import com.tencent.cloud.common.metadata.MetadataContext;
import com.tencent.cloud.common.util.ReflectionUtils;
import com.tencent.cloud.rpc.enhancement.AbstractPolarisReporterAdapter;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.api.pojo.RetStatus;
import com.tencent.polaris.api.pojo.ServiceKey;
@ -42,7 +44,7 @@ import org.springframework.web.client.ResponseErrorHandler;
*
* @author wh 2022/6/21
*/
public class EnhancedRestTemplateReporter implements ResponseErrorHandler {
public class EnhancedRestTemplateReporter extends AbstractPolarisReporterAdapter implements ResponseErrorHandler {
private static final Logger LOG = LoggerFactory.getLogger(EnhancedRestTemplateReporter.class);
@ -50,7 +52,8 @@ public class EnhancedRestTemplateReporter implements ResponseErrorHandler {
private final ConsumerAPI consumerAPI;
public EnhancedRestTemplateReporter(ConsumerAPI consumerAPI) {
public EnhancedRestTemplateReporter(RpcEnhancementProperties properties, ConsumerAPI consumerAPI) {
super(properties);
this.consumerAPI = consumerAPI;
}
@ -61,7 +64,6 @@ public class EnhancedRestTemplateReporter implements ResponseErrorHandler {
@Override
public void handleError(@NonNull ClientHttpResponse response) {
}
@Override
@ -76,7 +78,7 @@ public class EnhancedRestTemplateReporter implements ResponseErrorHandler {
resultRequest.setPort(realURL.getPort());
}
if (response.getStatusCode().value() > 500) {
if (apply(response.getStatusCode())) {
resultRequest.setRetStatus(RetStatus.RetFail);
}
}

@ -15,27 +15,26 @@
* specific language governing permissions and limitations under the License.
*/
package com.tencent.cloud.polaris.circuitbreaker;
package com.tencent.cloud.rpc.enhancement;
import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.springframework.http.HttpStatus;
/**
* Test For {@link AbstractPolarisCircuitBreakAdapter}.
* Test For {@link AbstractPolarisReporterAdapter}.
*
* @author <a href="mailto:iskp.me@gmail.com">Elve.Xu</a>
* @version ${project.version} - 2022/7/11
* @author <a href="mailto:iskp.me@gmail.com">Elve.Xu</a> 2022/7/11
*/
public class AbstractPolarisCircuitBreakAdapterTest {
public class AbstractPolarisReporterAdapterTest {
@Test
public void testApplyWithDefaultConfig() {
PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties();
RpcEnhancementProperties properties = new RpcEnhancementProperties();
// Mock Condition
SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties);
SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties);
// Assert
Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false);
@ -45,12 +44,12 @@ public class AbstractPolarisCircuitBreakAdapterTest {
@Test
public void testApplyWithoutIgnoreInternalServerError() {
PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties();
RpcEnhancementProperties properties = new RpcEnhancementProperties();
// Mock Condition
properties.getStatuses().clear();
properties.setIgnoreInternalServerError(false);
SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties);
SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties);
// Assert
Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false);
@ -60,12 +59,12 @@ public class AbstractPolarisCircuitBreakAdapterTest {
@Test
public void testApplyWithIgnoreInternalServerError() {
PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties();
RpcEnhancementProperties properties = new RpcEnhancementProperties();
// Mock Condition
properties.getStatuses().clear();
properties.setIgnoreInternalServerError(true);
SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties);
SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties);
// Assert
Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false);
@ -75,12 +74,12 @@ public class AbstractPolarisCircuitBreakAdapterTest {
@Test
public void testApplyWithoutSeries() {
PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties();
RpcEnhancementProperties properties = new RpcEnhancementProperties();
// Mock Condition
properties.getStatuses().clear();
properties.getSeries().clear();
SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties);
SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties);
// Assert
Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false);
@ -90,13 +89,13 @@ public class AbstractPolarisCircuitBreakAdapterTest {
@Test
public void testApplyWithSeries() {
PolarisCircuitBreakerProperties properties = new PolarisCircuitBreakerProperties();
RpcEnhancementProperties properties = new RpcEnhancementProperties();
// Mock Condition
properties.getStatuses().clear();
properties.getSeries().clear();
properties.getSeries().add(HttpStatus.Series.CLIENT_ERROR);
SimplePolarisCircuitBreakAdapter adapter = new SimplePolarisCircuitBreakAdapter(properties);
SimplePolarisReporterAdapter adapter = new SimplePolarisReporterAdapter(properties);
// Assert
Assertions.assertThat(adapter.apply(HttpStatus.OK)).isEqualTo(false);
@ -108,9 +107,9 @@ public class AbstractPolarisCircuitBreakAdapterTest {
/**
* Simple Polaris CircuitBreak Adapter Implements .
*/
public static class SimplePolarisCircuitBreakAdapter extends AbstractPolarisCircuitBreakAdapter {
public static class SimplePolarisReporterAdapter extends AbstractPolarisReporterAdapter {
public SimplePolarisCircuitBreakAdapter(PolarisCircuitBreakerProperties properties) {
public SimplePolarisReporterAdapter(RpcEnhancementProperties properties) {
super(properties);
}
}

@ -43,7 +43,7 @@ import static org.mockito.Mockito.mock;
*
* @author Haotian Zhang
*/
@RunWith(MockitoJUnitRunner.class)
@RunWith(MockitoJUnitRunner.Silent.class)
public class SuccessPolarisReporterTest {
private static MockedStatic<ReporterUtils> mockedReporterUtils;

@ -22,6 +22,7 @@ import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementProperties;
import com.tencent.polaris.api.core.ConsumerAPI;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -47,7 +48,8 @@ public class EnhancedRestTemplateReporterTest {
@Test
public void handleError() throws Exception {
ConsumerAPI consumerAPI = mock(ConsumerAPI.class);
EnhancedRestTemplateReporter enhancedRestTemplateReporter = new EnhancedRestTemplateReporter(consumerAPI);
EnhancedRestTemplateReporter enhancedRestTemplateReporter =
new EnhancedRestTemplateReporter(mock(RpcEnhancementProperties.class), consumerAPI);
URI uri = mock(URI.class);
when(uri.getPath()).thenReturn("/test");
when(uri.getHost()).thenReturn("host");

Loading…
Cancel
Save