diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/pom.xml index 7c3b02c4..0bbd4cb6 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/pom.xml @@ -103,6 +103,11 @@ true + + com.alibaba.cloud + spring-cloud-circuitbreaker-sentinel + + com.alibaba.csp sentinel-apache-dubbo-adapter diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java index abc2c1d3..d4397b22 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelProperties.java @@ -102,6 +102,20 @@ public class SentinelProperties { */ private Boolean httpMethodSpecify = false; + /** + * Specify whether unify web context(i.e. use the default context name), and is true + * by default. + */ + private Boolean webContextUnify = true; + + public Boolean getWebContextUnify() { + return webContextUnify; + } + + public void setWebContextUnify(Boolean webContextUnify) { + this.webContextUnify = webContextUnify; + } + public boolean isEager() { return eager; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java index e4a857b3..8f55d3fd 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/SentinelWebAutoConfiguration.java @@ -94,6 +94,7 @@ public class SentinelWebAutoConfiguration implements WebMvcConfigurer { public SentinelWebMvcConfig sentinelWebMvcConfig() { SentinelWebMvcConfig sentinelWebMvcConfig = new SentinelWebMvcConfig(); sentinelWebMvcConfig.setHttpMethodSpecify(properties.getHttpMethodSpecify()); + sentinelWebMvcConfig.setWebContextUnify(properties.getWebContextUnify()); if (blockExceptionHandlerOptional.isPresent()) { blockExceptionHandlerOptional diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java index 8dc08a0a..d99debf9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java @@ -79,9 +79,9 @@ public class SentinelAutoConfiguration { System.setProperty(LogBase.LOG_NAME_USE_PID, String.valueOf(properties.getLog().isSwitchPid())); } - if (StringUtils.isEmpty(System.getProperty(AppNameUtil.APP_NAME)) + if (StringUtils.isEmpty(System.getProperty(SentinelConfig.APP_NAME_PROP_KEY)) && StringUtils.hasText(projectName)) { - System.setProperty(AppNameUtil.APP_NAME, projectName); + System.setProperty(SentinelConfig.APP_NAME_PROP_KEY, projectName); } if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT)) && StringUtils.hasText(properties.getTransport().getPort())) { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpoint.java index c1f38a85..b10844b4 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpoint.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpoint.java @@ -61,7 +61,7 @@ public class SentinelEndpoint { result.put("metricsFileSize", SentinelConfig.singleMetricFileSize()); result.put("metricsFileCharset", SentinelConfig.charset()); result.put("totalMetricsFileCount", SentinelConfig.totalMetricFileCount()); - result.put("consoleServer", TransportConfig.getConsoleServer()); + result.put("consoleServer", TransportConfig.getConsoleServerList()); result.put("clientIp", TransportConfig.getHeartbeatClientIp()); result.put("heartbeatIntervalMs", TransportConfig.getHeartbeatIntervalMs()); result.put("clientPort", TransportConfig.getPort()); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java index fc60613d..bcfb88cb 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java @@ -17,6 +17,7 @@ package com.alibaba.cloud.sentinel.endpoint; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.alibaba.cloud.sentinel.SentinelProperties; @@ -24,13 +25,14 @@ import com.alibaba.csp.sentinel.datasource.AbstractDataSource; import com.alibaba.csp.sentinel.heartbeat.HeartbeatSenderProvider; import com.alibaba.csp.sentinel.transport.HeartbeatSender; import com.alibaba.csp.sentinel.transport.config.TransportConfig; +import com.alibaba.csp.sentinel.util.function.Tuple2; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.health.Status; -import org.springframework.util.StringUtils; +import org.springframework.util.CollectionUtils; /** * A {@link HealthIndicator} for Sentinel, which checks the status of Sentinel Dashboard @@ -74,7 +76,7 @@ public class SentinelHealthIndicator extends AbstractHealthIndicator { // detail if (!sentinelProperties.isEnabled()) { detailMap.put("enabled", false); - withDetails(builder.up(), detailMap); + builder.up().withDetails(detailMap); return; } @@ -82,8 +84,9 @@ public class SentinelHealthIndicator extends AbstractHealthIndicator { // Check health of Dashboard boolean dashboardUp = true; - String consoleServer = TransportConfig.getConsoleServer(); - if (StringUtils.isEmpty(consoleServer)) { + List> consoleServerList = TransportConfig + .getConsoleServerList(); + if (CollectionUtils.isEmpty(consoleServerList)) { // If Dashboard isn't configured, it's OK and mark the status of Dashboard // with UNKNOWN. detailMap.put("dashboard", @@ -101,8 +104,10 @@ public class SentinelHealthIndicator extends AbstractHealthIndicator { else { // If failed to send heartbeat message, means that the Dashboard is DOWN dashboardUp = false; - detailMap.put("dashboard", new Status(Status.DOWN.getCode(), - consoleServer + " can't be connected")); + detailMap.put("dashboard", + new Status(Status.UNKNOWN.getCode(), String.format( + "the dashboard servers [%s] one of them can't be connected", + consoleServerList))); } } @@ -133,22 +138,16 @@ public class SentinelHealthIndicator extends AbstractHealthIndicator { // DOWN dataSourceUp = false; dataSourceDetailMap.put(dataSourceBeanName, - new Status(Status.DOWN.getCode(), e.getMessage())); + new Status(Status.UNKNOWN.getCode(), e.getMessage())); } } // If Dashboard and DataSource are both OK, the health status is UP if (dashboardUp && dataSourceUp) { - withDetails(builder.up(), detailMap); + builder.up().withDetails(detailMap); } else { - withDetails(builder.down(), detailMap); - } - } - - private void withDetails(Health.Builder builder, Map detailMap) { - for (String key : detailMap.keySet()) { - builder.withDetail(key, detailMap.get(key)); + builder.unknown().withDetails(detailMap); } } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 93acd7e5..49b06b0d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -19,7 +19,12 @@ "description": "earlier initialize heart-beat when the spring container starts when the transport dependency is on classpath, the configuration is effective." }, { - "name": "spring.cloud.sentinel.transport.port", + "name": "spring.cloud.sentinel.web-context-unify", + "type": "java.lang.Boolean", + "defaultValue": true, + "description": "Specify whether unify web context(i.e. use the default context name), and is true by default." + }, + { "name": "spring.cloud.sentinel.transport.port", "type": "java.lang.String", "defaultValue": "8719", "description": "sentinel api port." diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java index 51f486b5..ad6c1122 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java @@ -74,7 +74,7 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen "spring.cloud.sentinel.flow.coldFactor=3", "spring.cloud.sentinel.eager=true", "spring.cloud.sentinel.log.switchPid=true", - "spring.cloud.sentinel.transport.dashboard=http://localhost:8080", + "spring.cloud.sentinel.transport.dashboard=http://localhost:8080,http://localhost:8081", "spring.cloud.sentinel.transport.port=9999", "spring.cloud.sentinel.transport.clientIp=1.1.1.1", "spring.cloud.sentinel.transport.heartbeatIntervalMs=20000" }, webEnvironment = RANDOM_PORT) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelBeanAutowiredTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelBeanAutowiredTests.java index 05f3ad57..20912d84 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelBeanAutowiredTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelBeanAutowiredTests.java @@ -41,8 +41,8 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Jim */ @RunWith(SpringRunner.class) -@SpringBootTest(classes = { SentinelBeanAutowiredTests.TestConfig.class }, properties = { - "spring.cloud.sentinel.filter.order=111" }) +@SpringBootTest(classes = { SentinelBeanAutowiredTests.TestConfig.class }, + properties = { "spring.cloud.sentinel.filter.order=111" }) public class SentinelBeanAutowiredTests { @Autowired @@ -118,4 +118,4 @@ public class SentinelBeanAutowiredTests { } -} +} \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java index b8d68d52..71ddb799 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java @@ -109,9 +109,9 @@ public class SentinelHealthIndicatorTests { Health health = sentinelHealthIndicator.health(); - assertThat(health.getStatus()).isEqualTo(Status.DOWN); - assertThat(health.getDetails().get("dashboard")).isEqualTo( - new Status(Status.DOWN.getCode(), "localhost:8080 can't be connected")); + assertThat(health.getStatus()).isEqualTo(Status.UNKNOWN); + assertThat(health.getDetails().get("dashboard")).isEqualTo(new Status( + Status.UNKNOWN.getCode(), "localhost:8080 can't be connected")); } @Test @@ -163,13 +163,13 @@ public class SentinelHealthIndicatorTests { Health health = sentinelHealthIndicator.health(); - assertThat(health.getStatus()).isEqualTo(Status.DOWN); + assertThat(health.getStatus()).isEqualTo(Status.UNKNOWN); Map dataSourceDetailMap = (Map) health .getDetails().get("dataSource"); assertThat(dataSourceDetailMap.get("ds1-sentinel-file-datasource")) .isEqualTo(Status.UP); assertThat(dataSourceDetailMap.get("ds2-sentinel-file-datasource")) - .isEqualTo(new Status(Status.DOWN.getCode(), "fileDataSource2 error")); + .isEqualTo(new Status(Status.UNKNOWN.getCode(), "fileDataSource2 error")); } }