Skip to content

Commit

Permalink
fix #1276 after healthcheck double check success, register async (#1290)
Browse files Browse the repository at this point in the history
* fix sofastack/sofa-boot#1276

* fix sofastack/sofa-boot#1276

* fix sofastack/sofa-boot#1276

* fix sofastack/sofa-boot#1276

* 1.RpcActuatorAutoConfiguration autoconf after ReadinessAutoConfiguration
2.update unit tests

* 1.RpcActuatorAutoConfiguration autoconf after ReadinessAutoConfiguration
2.update unit tests

---------

Co-authored-by: 呈铭 <beck.wcm@antgroup.com>
Co-authored-by: 致节 <hzj266771@antgroup.com>
  • Loading branch information
3 people committed Feb 27, 2024
1 parent 0c847d9 commit b4a7642
Show file tree
Hide file tree
Showing 15 changed files with 529 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
*/
package com.alipay.sofa.boot.actuator.autoconfigure.rpc;

import com.alipay.sofa.boot.actuator.autoconfigure.health.ReadinessAutoConfiguration;
import com.alipay.sofa.boot.actuator.health.ReadinessCheckListener;
import com.alipay.sofa.boot.actuator.health.ReadinessEndpoint;
import com.alipay.sofa.boot.actuator.rpc.HealthCheckProviderConfigDelayRegisterChecker;
import com.alipay.sofa.boot.actuator.rpc.RpcAfterHealthCheckCallback;
import com.alipay.sofa.boot.actuator.rpc.SofaRpcEndpoint;
import com.alipay.sofa.boot.autoconfigure.rpc.SofaRpcAutoConfiguration;
Expand All @@ -35,7 +38,7 @@
* @author huzijie
* @version RpcActuatorAutoConfiguration.java, v 0.1 2023年02月08日 4:45 PM huzijie Exp $
*/
@AutoConfiguration(after = SofaRpcAutoConfiguration.class)
@AutoConfiguration(after = { SofaRpcAutoConfiguration.class, ReadinessAutoConfiguration.class })
@ConditionalOnClass(RpcStartApplicationListener.class)
@ConditionalOnBean(RpcStartApplicationListener.class)
public class RpcActuatorAutoConfiguration {
Expand All @@ -53,4 +56,12 @@ public RpcAfterHealthCheckCallback rpcAfterHealthCheckCallback(RpcStartApplicati
public SofaRpcEndpoint sofaRpcEndPoint() {
return new SofaRpcEndpoint();
}

@Bean
@ConditionalOnMissingBean
@ConditionalOnAvailableEndpoint(endpoint = ReadinessEndpoint.class)
@ConditionalOnBean(ReadinessCheckListener.class)
public HealthCheckProviderConfigDelayRegisterChecker healthCheckProviderConfigDelayRegisterChecker(ReadinessCheckListener readinessCheckListener) {
return new HealthCheckProviderConfigDelayRegisterChecker(readinessCheckListener);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
*/
package com.alipay.sofa.boot.actuator.autoconfigure.rpc;

import com.alipay.sofa.boot.actuator.autoconfigure.health.ReadinessAutoConfiguration;
import com.alipay.sofa.boot.actuator.rpc.HealthCheckProviderConfigDelayRegisterChecker;
import com.alipay.sofa.boot.actuator.rpc.RpcAfterHealthCheckCallback;
import com.alipay.sofa.boot.actuator.rpc.SofaRpcEndpoint;
import com.alipay.sofa.rpc.boot.context.RpcStartApplicationListener;
Expand All @@ -41,6 +43,15 @@ public class RpcActuatorAutoConfigurationTests {
.withPropertyValues(
"management.endpoints.web.exposure.include=readiness,rpc");

@Test
void runShouldHaveHealthCheckProviderConfigDelayRegisterChecker() {
this.contextRunner
.withUserConfiguration(ReadinessAutoConfiguration.class)
.withBean(RpcStartApplicationListener.class)
.run((context) -> assertThat(context)
.hasSingleBean(HealthCheckProviderConfigDelayRegisterChecker.class));
}

@Test
void runShouldHaveRpcActuatorBeans() {
this.contextRunner
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* http://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.alipay.sofa.boot.actuator.rpc;

import com.alipay.sofa.boot.actuator.health.ReadinessCheckListener;
import com.alipay.sofa.rpc.boot.container.ProviderConfigDelayRegisterChecker;
import org.springframework.boot.availability.ReadinessState;

/**
* ProviderConfigDelayRegisterChecker的具体实现
*/
public class HealthCheckProviderConfigDelayRegisterChecker implements
ProviderConfigDelayRegisterChecker {

private final ReadinessCheckListener readinessCheckListener;

public HealthCheckProviderConfigDelayRegisterChecker(ReadinessCheckListener readinessCheckListener) {
this.readinessCheckListener = readinessCheckListener;
}

@Override
public boolean allowRegister() {
return ReadinessState.REFUSING_TRAFFIC != readinessCheckListener.getReadinessState();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* http://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.alipay.sofa.boot.actuator.rpc;

import com.alipay.sofa.boot.actuator.health.ReadinessCheckListener;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.availability.ReadinessState;

import static org.assertj.core.api.Assertions.assertThat;

/**
* Test for {@link HealthCheckProviderConfigDelayRegisterChecker}
*/
@ExtendWith(MockitoExtension.class)
public class HealthCheckProviderConfigDelayRegisterCheckerTest {

@InjectMocks
private HealthCheckProviderConfigDelayRegisterChecker healthCheckProviderConfigDelayRegisterChecker;

@Mock
private ReadinessCheckListener readinessCheckListener;

@Test
public void testAllowRegister() {
// Setup
Mockito.doReturn(ReadinessState.ACCEPTING_TRAFFIC).when(readinessCheckListener)
.getReadinessState();
// Run the test
boolean result = healthCheckProviderConfigDelayRegisterChecker.allowRegister();

// Verify the results
assertThat(result).isTrue();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,11 @@ public class SofaBootRpcProperties implements EnvironmentAware {

private List<String> providerRegisterBlackList;

/**
* 是否开启延时注册功能
*/
private boolean enableDelayRegister;

public boolean isEnableAutoPublish() {
return enableAutoPublish;
}
Expand Down Expand Up @@ -941,6 +946,14 @@ public void setProviderRegisterBlackList(List<String> providerRegisterBlackList)
this.providerRegisterBlackList = providerRegisterBlackList;
}

public boolean isEnableDelayRegister() {
return enableDelayRegister;
}

public void setEnableDelayRegister(boolean enableDelayRegister) {
this.enableDelayRegister = enableDelayRegister;
}

@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.alipay.sofa.rpc.boot.config.RegistryConfigureProcessor;
import com.alipay.sofa.rpc.boot.container.ConsumerConfigContainer;
import com.alipay.sofa.rpc.boot.container.ProviderConfigContainer;
import com.alipay.sofa.rpc.boot.container.ProviderConfigDelayRegisterChecker;
import com.alipay.sofa.rpc.boot.container.RegistryConfigContainer;
import com.alipay.sofa.rpc.boot.container.ServerConfigContainer;
import com.alipay.sofa.rpc.boot.context.RpcStartApplicationListener;
Expand Down Expand Up @@ -55,6 +56,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
* {@link EnableAutoConfiguration Auto-configuration} for sofa Rpc.
Expand All @@ -72,12 +74,17 @@ public class SofaRpcAutoConfiguration {

@Bean
@ConditionalOnMissingBean
public ProviderConfigContainer providerConfigContainer(SofaBootRpcProperties sofaBootRpcProperties) {
public ProviderConfigContainer providerConfigContainer(SofaBootRpcProperties sofaBootRpcProperties,
ObjectProvider<ProviderConfigDelayRegisterChecker> providerConfigDelayRegisterCheckers) {
ProviderConfigContainer providerConfigContainer = new ProviderConfigContainer();
providerConfigContainer.setProviderRegisterWhiteList(sofaBootRpcProperties
.getProviderRegisterWhiteList());
providerConfigContainer.setProviderRegisterBlackList(sofaBootRpcProperties
.getProviderRegisterBlackList());
providerConfigContainer.setProviderConfigDelayRegister(providerConfigDelayRegisterCheckers
.stream().collect(Collectors.toList()));
providerConfigContainer.setEnableDelayRegister(sofaBootRpcProperties
.isEnableDelayRegister());
return providerConfigContainer;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.alipay.sofa.rpc.boot.config.FaultToleranceConfigurator;
import com.alipay.sofa.rpc.boot.config.RegistryConfigureProcessor;
import com.alipay.sofa.rpc.boot.container.ProviderConfigContainer;
import com.alipay.sofa.rpc.boot.container.ProviderConfigDelayRegisterChecker;
import com.alipay.sofa.rpc.boot.container.RegistryConfigContainer;
import com.alipay.sofa.rpc.boot.container.ServerConfigContainer;
import com.alipay.sofa.rpc.boot.runtime.adapter.processor.ConsumerMockProcessor;
Expand Down Expand Up @@ -383,6 +384,46 @@ void customProviderConfigContainer() {
});
}

@Test
void customProviderConfigContainerForEnableDelayRegister() {
this.contextRunner.withPropertyValues(
"sofa.boot.rpc.enableDelayRegister=true").
run(context -> {
ProviderConfigContainer providerConfigContainer = context.getBean(ProviderConfigContainer.class);
boolean enableDelayRegister = providerConfigContainer.isEnableDelayRegister();
assertThat(enableDelayRegister).isTrue();
});
}

@Test
void customProviderConfigContainerForProviderConfigDelayRegisterChecker() {
this.contextRunner.withUserConfiguration(ProviderConfigDelayRegisterCheckerConfiguration.class)
.run(context -> {
ProviderConfigContainer providerConfigContainer = context.getBean(ProviderConfigContainer.class);
List<ProviderConfigDelayRegisterChecker> checkers =
providerConfigContainer.getProviderConfigDelayRegisterCheckerList();
assertThat(checkers.size()).isEqualTo(1);
assertThat(checkers.get(0).allowRegister()).isTrue();
});
}

@Configuration(proxyBeanMethods = false)
static class ProviderConfigDelayRegisterCheckerConfiguration {

@Bean
public ProviderConfigDelayRegisterChecker firstChecker() {
return new FirstChecker();
}
}

static class FirstChecker implements ProviderConfigDelayRegisterChecker {

@Override
public boolean allowRegister() {
return true;
}
}

@Configuration(proxyBeanMethods = false)
static class CustomProviderConfigContainerConfiguration {
@Bean
Expand Down
Loading

0 comments on commit b4a7642

Please sign in to comment.