fix: Nacos integration with SpringBootAdmin.(2.2.x) (#3308)
parent
9c83fb8e95
commit
1add62660e
@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright 2013-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* 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.alibaba.cloud.nacos.discovery;
|
||||
|
||||
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
|
||||
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled;
|
||||
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* @author xiaojing
|
||||
* @author echooymxq
|
||||
* @author ruansheng
|
||||
* @author zhangbin
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnDiscoveryEnabled
|
||||
@ConditionalOnBlockingDiscoveryEnabled
|
||||
@ConditionalOnNacosDiscoveryEnabled
|
||||
@AutoConfigureAfter(value = { NacosDiscoveryAutoConfiguration.class }, name = {
|
||||
"org.springframework.cloud.netflix.zuul.ZuulProxyMarkerConfiguration",
|
||||
"de.codecentric.boot.admin.server.cloud.config.AdminServerDiscoveryAutoConfiguration" })
|
||||
public class NacosDiscoveryHeartBeatConfiguration {
|
||||
|
||||
/**
|
||||
* Nacos HeartBeat is no longer enabled by default . publish an event every 30 seconds
|
||||
* see https://github.com/alibaba/spring-cloud-alibaba/issues/2868 see
|
||||
* https://github.com/alibaba/spring-cloud-alibaba/issues/3258
|
||||
* @param nacosDiscoveryProperties nacosDiscoveryProperties配置
|
||||
* @return nacosDiscoveryHeartBeatPublisher
|
||||
*/
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@Conditional(NacosDiscoveryHeartBeatCondition.class)
|
||||
public NacosDiscoveryHeartBeatPublisher nacosDiscoveryHeartBeatPublisher(
|
||||
NacosDiscoveryProperties nacosDiscoveryProperties) {
|
||||
return new NacosDiscoveryHeartBeatPublisher(nacosDiscoveryProperties);
|
||||
}
|
||||
|
||||
private static class NacosDiscoveryHeartBeatCondition extends AnyNestedCondition {
|
||||
|
||||
NacosDiscoveryHeartBeatCondition() {
|
||||
super(ConfigurationPhase.REGISTER_BEAN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Spring Cloud Gateway HeartBeat .
|
||||
*/
|
||||
@ConditionalOnProperty(value = "spring.cloud.gateway.discovery.locator.enabled",
|
||||
matchIfMissing = false)
|
||||
static class GatewayLocatorHeartBeatEnabled {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Nacos HeartBeat .
|
||||
*/
|
||||
@ConditionalOnBean(name = "zuulProxyMarkerBean")
|
||||
static class ZuulGatewayHeartBeatEnabled {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Spring Boot Admin HeartBeat .
|
||||
*/
|
||||
@ConditionalOnBean(
|
||||
type = "de.codecentric.boot.admin.server.cloud.discovery.InstanceDiscoveryListener")
|
||||
static class SpringBootAdminHeartBeatEnabled {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Nacos HeartBeat .
|
||||
*/
|
||||
@ConditionalOnProperty(value = "spring.cloud.nacos.discovery.heart-beat.enabled",
|
||||
matchIfMissing = false)
|
||||
static class NacosDiscoveryHeartBeatEnabled {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
35
spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/GatewayLocatorHeartBeatPublisher.java → spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryHeartBeatPublisher.java
35
spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/GatewayLocatorHeartBeatPublisher.java → spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryHeartBeatPublisher.java
@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright 2013-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* 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.alibaba.cloud.nacos.discovery;
|
||||
|
||||
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.cloud.netflix.zuul.ZuulProxyMarkerConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* @author ruansheng
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnClass(ZuulProxyMarkerConfiguration.class)
|
||||
@AutoConfigureAfter(ZuulProxyMarkerConfiguration.class)
|
||||
public class ZuulGatewayLocatorAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnBean(name = "zuulProxyMarkerBean")
|
||||
public GatewayLocatorHeartBeatPublisher gatewayLocatorHeartBeatPublisher(
|
||||
NacosDiscoveryProperties nacosDiscoveryProperties) {
|
||||
return new GatewayLocatorHeartBeatPublisher(nacosDiscoveryProperties);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright 2013-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* 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.alibaba.cloud.nacos.discovery;
|
||||
|
||||
import com.alibaba.cloud.nacos.NacosServiceAutoConfiguration;
|
||||
import com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration;
|
||||
import com.alibaba.cloud.nacos.util.UtilIPv6AutoConfiguration;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration;
|
||||
import org.springframework.cloud.commons.util.UtilAutoConfiguration;
|
||||
import org.springframework.cloud.netflix.zuul.ZuulProxyMarkerConfiguration;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:echooy.mxq@gmail.com">echooymxq</a>
|
||||
**/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = NacosDiscoveryHeartBeatConfigurationTest.TestConfig.class,
|
||||
webEnvironment = RANDOM_PORT)
|
||||
public class NacosDiscoveryHeartBeatConfigurationTest {
|
||||
|
||||
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(
|
||||
AutoConfigurations.of(AutoServiceRegistrationConfiguration.class,
|
||||
NacosServiceRegistryAutoConfiguration.class,
|
||||
UtilAutoConfiguration.class, UtilIPv6AutoConfiguration.class,
|
||||
NacosServiceAutoConfiguration.class,
|
||||
NacosDiscoveryAutoConfiguration.class,
|
||||
NacosDiscoveryClientConfiguration.class,
|
||||
NacosDiscoveryHeartBeatConfiguration.class, this.getClass()));
|
||||
|
||||
@Test
|
||||
public void testDefaultNacosDiscoveryHeartBeatPublisher() {
|
||||
contextRunner.run(context -> assertThat(context)
|
||||
.doesNotHaveBean(NacosDiscoveryHeartBeatPublisher.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNacosDiscoveryHeartBeatPublisherEnabledForGateway() {
|
||||
contextRunner
|
||||
.withPropertyValues("spring.cloud.gateway.discovery.locator.enabled=true")
|
||||
.run(context -> assertThat(context)
|
||||
.hasSingleBean(NacosDiscoveryHeartBeatPublisher.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNacosDiscoveryHeartBeatPublisherEnabledForProperties() {
|
||||
contextRunner
|
||||
.withPropertyValues(
|
||||
"spring.cloud.nacos.discovery.heart-beat.enabled=true")
|
||||
.run(context -> assertThat(context)
|
||||
.hasSingleBean(NacosDiscoveryHeartBeatPublisher.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZuulGatewayLocatorHeartBeatPublisherEnabled() {
|
||||
contextRunner
|
||||
.withConfiguration(
|
||||
AutoConfigurations.of(ZuulProxyMarkerConfiguration.class))
|
||||
.run(context -> assertThat(context)
|
||||
.hasSingleBean(NacosDiscoveryHeartBeatPublisher.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testZuulAndSpringCloudGatewayLocatorHeartBeatPublisherEnabled() {
|
||||
contextRunner
|
||||
.withPropertyValues("spring.cloud.gateway.discovery.locator.enabled=true")
|
||||
.withConfiguration(
|
||||
AutoConfigurations.of(ZuulProxyMarkerConfiguration.class))
|
||||
.run(context -> assertThat(context)
|
||||
.hasSingleBean(NacosDiscoveryHeartBeatPublisher.class));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableAutoConfiguration
|
||||
@ImportAutoConfiguration({ NacosDiscoveryAutoConfiguration.class,
|
||||
NacosDiscoveryHeartBeatConfiguration.class })
|
||||
public static class TestConfig {
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue