From 8d708cbf20b2bbc037941a3a85d5e258b50b569b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=87=B4=E8=8A=82?= Date: Mon, 21 Aug 2023 12:15:10 +0800 Subject: [PATCH 1/2] init interface class canonical name to avoid multi reflection --- .../sofa/runtime/invoke/DynamicJvmServiceProxyFinder.java | 4 ++-- .../sofa/runtime/service/component/AbstractContract.java | 8 ++++++++ .../com/alipay/sofa/runtime/spi/binding/Contract.java | 8 ++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/invoke/DynamicJvmServiceProxyFinder.java b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/invoke/DynamicJvmServiceProxyFinder.java index db6030f59..524b4d8fd 100644 --- a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/invoke/DynamicJvmServiceProxyFinder.java +++ b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/invoke/DynamicJvmServiceProxyFinder.java @@ -78,7 +78,7 @@ public ServiceComponent findServiceComponent(ClassLoader clientClassloader, Cont } } - String interfaceType = contract.getInterfaceType().getCanonicalName(); + String interfaceType = contract.getInterfaceTypeCanonicalName(); String uniqueId = contract.getUniqueId(); for (SofaRuntimeManager sofaRuntimeManager : SofaFramework.getRuntimeSet()) { if (sofaRuntimeManager.getAppClassLoader().equals(clientClassloader)) { @@ -244,7 +244,7 @@ private ServiceComponent findServiceComponent(String uniqueId, String interfaceT for (ComponentInfo c : components) { ServiceComponent component = (ServiceComponent) c; Contract serviceContract = component.getService(); - if (serviceContract.getInterfaceType().getCanonicalName().equals(interfaceType) + if (serviceContract.getInterfaceTypeCanonicalName().equals(interfaceType) && uniqueId.equals(serviceContract.getUniqueId())) { return component; } diff --git a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/service/component/AbstractContract.java b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/service/component/AbstractContract.java index feeaabb5e..825ff9589 100644 --- a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/service/component/AbstractContract.java +++ b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/service/component/AbstractContract.java @@ -38,6 +38,8 @@ public abstract class AbstractContract implements Contract { protected String uniqueId = ""; /** interface class type */ protected Class interfaceType; + /** interface class type name*/ + protected String interfaceTypeCanonicalName; /** interface mode */ protected InterfaceMode interfaceMode = InterfaceMode.spring; /** properties of contract */ @@ -50,6 +52,7 @@ protected AbstractContract(String uniqueId, Class interfaceType) { this.uniqueId = uniqueId; } this.interfaceType = interfaceType; + this.interfaceTypeCanonicalName = interfaceType.getCanonicalName(); } protected AbstractContract(String uniqueId, Class interfaceType, InterfaceMode interfaceMode) { @@ -114,4 +117,9 @@ public String getProperty(String key) { public Map getProperty() { return property; } + + @Override + public String getInterfaceTypeCanonicalName() { + return interfaceTypeCanonicalName; + } } diff --git a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/spi/binding/Contract.java b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/spi/binding/Contract.java index 3a1dcd2cb..7b907a6d1 100644 --- a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/spi/binding/Contract.java +++ b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/spi/binding/Contract.java @@ -99,4 +99,12 @@ public interface Contract { * @param bindings binding objects */ void addBinding(Set bindings); + + /** + * get interface type class canonical name + * @return get interface type class canonical name + */ + default String getInterfaceTypeCanonicalName() { + return getInterfaceType().getCanonicalName(); + } } From a0fc30072361641aaa704964a77fbb7e271defaa Mon Sep 17 00:00:00 2001 From: HzjNeverStop <441627022@qq.com> Date: Tue, 10 Oct 2023 10:59:25 +0800 Subject: [PATCH 2/2] Support sofa-rpc provider register blacklist/whitelist (#1254) --- .../rpc/SofaRpcAutoConfiguration.java | 9 ++- .../boot/config/SofaBootRpcProperties.java | 21 +++++ .../container/ProviderConfigContainer.java | 69 ++++++++++++++--- .../test/SofaRpcTestAutoConfiguration.java | 10 ++- ...BlackListProviderConfigContainerTests.java | 37 +++++++++ .../ProviderConfigContainerTestBase.java | 76 +++++++++++++++++++ ...WhiteListProviderConfigContainerTests.java | 37 +++++++++ 7 files changed, 246 insertions(+), 13 deletions(-) create mode 100644 sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/BlackListProviderConfigContainerTests.java create mode 100644 sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/ProviderConfigContainerTestBase.java create mode 100644 sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/WhiteListProviderConfigContainerTests.java diff --git a/sofa-boot-project/sofa-boot-autoconfigure/src/main/java/com/alipay/sofa/boot/autoconfigure/rpc/SofaRpcAutoConfiguration.java b/sofa-boot-project/sofa-boot-autoconfigure/src/main/java/com/alipay/sofa/boot/autoconfigure/rpc/SofaRpcAutoConfiguration.java index b32226369..a60ee4b1d 100644 --- a/sofa-boot-project/sofa-boot-autoconfigure/src/main/java/com/alipay/sofa/boot/autoconfigure/rpc/SofaRpcAutoConfiguration.java +++ b/sofa-boot-project/sofa-boot-autoconfigure/src/main/java/com/alipay/sofa/boot/autoconfigure/rpc/SofaRpcAutoConfiguration.java @@ -77,8 +77,13 @@ public class SofaRpcAutoConfiguration { @Bean @ConditionalOnMissingBean - public ProviderConfigContainer providerConfigContainer() { - return new ProviderConfigContainer(); + public ProviderConfigContainer providerConfigContainer(SofaBootRpcProperties sofaBootRpcProperties) { + ProviderConfigContainer providerConfigContainer = new ProviderConfigContainer(); + providerConfigContainer.setProviderRegisterWhiteList(sofaBootRpcProperties + .getProviderRegisterWhiteList()); + providerConfigContainer.setProviderRegisterBlackList(sofaBootRpcProperties + .getProviderRegisterBlackList()); + return providerConfigContainer; } @Bean diff --git a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/main/java/com/alipay/sofa/rpc/boot/config/SofaBootRpcProperties.java b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/main/java/com/alipay/sofa/rpc/boot/config/SofaBootRpcProperties.java index f0d56f4c7..f640cb74b 100644 --- a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/main/java/com/alipay/sofa/rpc/boot/config/SofaBootRpcProperties.java +++ b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/main/java/com/alipay/sofa/rpc/boot/config/SofaBootRpcProperties.java @@ -24,6 +24,7 @@ import org.springframework.util.StringUtils; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -341,6 +342,10 @@ public class SofaBootRpcProperties implements EnvironmentAware { */ private String dynamicConfig; + private List providerRegisterWhiteList; + + private List providerRegisterBlackList; + public String getAftRegulationEffective() { return StringUtils.isEmpty(aftRegulationEffective) ? getDotString(new Object() { }.getClass().getEnclosingMethod().getName()) : aftRegulationEffective; @@ -938,6 +943,22 @@ public void setBoltProcessInIoThread(Boolean boltProcessInIoThread) { this.boltProcessInIoThread = boltProcessInIoThread; } + public List getProviderRegisterWhiteList() { + return providerRegisterWhiteList; + } + + public void setProviderRegisterWhiteList(List providerRegisterWhiteList) { + this.providerRegisterWhiteList = providerRegisterWhiteList; + } + + public List getProviderRegisterBlackList() { + return providerRegisterBlackList; + } + + public void setProviderRegisterBlackList(List providerRegisterBlackList) { + this.providerRegisterBlackList = providerRegisterBlackList; + } + @Override public void setEnvironment(Environment environment) { this.environment = environment; diff --git a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/main/java/com/alipay/sofa/rpc/boot/container/ProviderConfigContainer.java b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/main/java/com/alipay/sofa/rpc/boot/container/ProviderConfigContainer.java index aa47214f5..582ba3fcf 100644 --- a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/main/java/com/alipay/sofa/rpc/boot/container/ProviderConfigContainer.java +++ b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/main/java/com/alipay/sofa/rpc/boot/container/ProviderConfigContainer.java @@ -16,14 +16,6 @@ */ package com.alipay.sofa.rpc.boot.container; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import org.slf4j.Logger; -import org.springframework.util.StringUtils; - import com.alipay.sofa.rpc.boot.config.SofaBootRpcConfigConstants; import com.alipay.sofa.rpc.boot.log.SofaBootRpcLoggerFactory; import com.alipay.sofa.rpc.boot.runtime.binding.RpcBinding; @@ -33,6 +25,14 @@ import com.alipay.sofa.rpc.registry.Registry; import com.alipay.sofa.rpc.registry.RegistryFactory; import com.alipay.sofa.runtime.spi.binding.Contract; +import org.slf4j.Logger; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** * ProviderConfig持有者.维护编程界面级别的RPC组件。 @@ -48,6 +48,10 @@ public class ProviderConfigContainer { */ private boolean allowPublish = false; + private List providerRegisterWhiteList; + + private List providerRegisterBlackList; + /** * ProviderConfig 缓存 */ @@ -73,6 +77,23 @@ public void addProviderConfig(String key, ProviderConfig providerConfig) { } } + private boolean allowProviderRegister(ProviderConfig providerConfig) { + if (CollectionUtils.isEmpty(providerRegisterWhiteList) + && CollectionUtils.isEmpty(providerRegisterBlackList)) { + return true; + } + String uniqueName = createUniqueNameByProvider(providerConfig); + if (!CollectionUtils.isEmpty(providerRegisterBlackList) + && providerRegisterBlackList.contains(uniqueName)) { + return false; + } + if (!CollectionUtils.isEmpty(providerRegisterWhiteList) + && !providerRegisterWhiteList.contains(uniqueName)) { + return false; + } + return true; + } + /** * 获取 ProviderConfig * @@ -110,7 +131,11 @@ public void publishAllProviderConfig() { ServerConfig serverConfig = (ServerConfig) providerConfig.getServer().get(0); if (!serverConfig.getProtocol().equalsIgnoreCase( SofaBootRpcConfigConstants.RPC_PROTOCOL_DUBBO)) { - providerConfig.setRegister(true); + if (allowProviderRegister(providerConfig)) { + providerConfig.setRegister(true); + } else { + LOGGER.info("Provider will not register: [{}]", providerConfig.buildKey()); + } List registrys = providerConfig.getRegistry(); for (RegistryConfig registryConfig : registrys) { @@ -206,4 +231,30 @@ public String createUniqueName(Contract contract, RpcBinding binding) { .append(uniqueId).append(protocol).toString(); } + /** + * Create UniqueName by interfaceId and uniqueId + */ + private String createUniqueNameByProvider(ProviderConfig providerConfig) { + String uniqueId = ""; + if (StringUtils.hasText(providerConfig.getUniqueId())) { + uniqueId = ":" + providerConfig.getUniqueId(); + } + return providerConfig.getInterfaceId() + uniqueId; + } + + public void setProviderRegisterWhiteList(List providerRegisterWhiteList) { + this.providerRegisterWhiteList = providerRegisterWhiteList; + } + + public void setProviderRegisterBlackList(List providerRegisterBlackList) { + this.providerRegisterBlackList = providerRegisterBlackList; + } + + public List getProviderRegisterWhiteList() { + return providerRegisterWhiteList; + } + + public List getProviderRegisterBlackList() { + return providerRegisterBlackList; + } } diff --git a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/SofaRpcTestAutoConfiguration.java b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/SofaRpcTestAutoConfiguration.java index ab3ef6601..d7ebe8a31 100644 --- a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/SofaRpcTestAutoConfiguration.java +++ b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/SofaRpcTestAutoConfiguration.java @@ -72,8 +72,14 @@ @EnableConfigurationProperties(SofaBootRpcProperties.class) public class SofaRpcTestAutoConfiguration { @Bean - public ProviderConfigContainer providerConfigContainer() { - return new ProviderConfigContainer(); + @ConditionalOnMissingBean + public ProviderConfigContainer providerConfigContainer(SofaBootRpcProperties sofaBootRpcProperties) { + ProviderConfigContainer providerConfigContainer = new ProviderConfigContainer(); + providerConfigContainer.setProviderRegisterWhiteList(sofaBootRpcProperties + .getProviderRegisterWhiteList()); + providerConfigContainer.setProviderRegisterBlackList(sofaBootRpcProperties + .getProviderRegisterBlackList()); + return providerConfigContainer; } @Bean diff --git a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/BlackListProviderConfigContainerTests.java b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/BlackListProviderConfigContainerTests.java new file mode 100644 index 000000000..fec3542dd --- /dev/null +++ b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/BlackListProviderConfigContainerTests.java @@ -0,0 +1,37 @@ +/* + * 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.rpc.boot.test.provider; + +import com.alipay.sofa.rpc.core.exception.SofaRouteException; +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.springframework.test.context.TestPropertySource; + +/** + * @author huzijie + * @version BlackListProviderConfigContainerTests.java, v 0.1 2023年09月27日 11:26 AM huzijie Exp $ + */ +@TestPropertySource(properties = "com.alipay.sofa.rpc.providerRegisterBlackList=com.alipay.sofa.rpc.boot.test.bean.SampleFacade:uniqueId") +public class BlackListProviderConfigContainerTests extends ProviderConfigContainerTestBase { + + @Test + public void checkProviderExported() { + Assertions.assertThat(sampleFacadeA.sayHi("Sofa")).isEqualTo("hi Sofa!"); + Assertions.assertThatThrownBy(() -> sampleFacadeB.sayHi("Sofa")).isInstanceOf(SofaRouteException.class). + hasMessageContaining("RPC-020060001"); + } +} diff --git a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/ProviderConfigContainerTestBase.java b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/ProviderConfigContainerTestBase.java new file mode 100644 index 000000000..d22a3c1ba --- /dev/null +++ b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/ProviderConfigContainerTestBase.java @@ -0,0 +1,76 @@ +/* + * 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.rpc.boot.test.provider; + +import com.alipay.sofa.rpc.boot.container.ProviderConfigContainer; +import com.alipay.sofa.rpc.boot.test.bean.SampleFacade; +import com.alipay.sofa.rpc.boot.test.bean.SampleFacadeImpl; +import com.alipay.sofa.runtime.api.annotation.SofaReference; +import com.alipay.sofa.runtime.api.annotation.SofaReferenceBinding; +import com.alipay.sofa.runtime.api.annotation.SofaService; +import com.alipay.sofa.runtime.api.annotation.SofaServiceBinding; +import org.junit.After; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * @author huzijie + * @version ProviderConfigContainerTests.java, v 0.1 2023年09月27日 11:14 AM huzijie Exp $ + */ +@SpringBootApplication +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) +@Import(ProviderConfigContainerTestBase.RpcPublishConfiguration.class) +public class ProviderConfigContainerTestBase { + + @SofaReference(jvmFirst = false, binding = @SofaReferenceBinding(bindingType = "bolt")) + protected SampleFacade sampleFacadeA; + + @SofaReference(jvmFirst = false, binding = @SofaReferenceBinding(bindingType = "bolt"), uniqueId = "uniqueId") + protected SampleFacade sampleFacadeB; + + @Autowired + private ProviderConfigContainer providerConfigContainer; + + @After + public void clearExported() { + providerConfigContainer.unExportAllProviderConfig(); + } + + @Configuration + static class RpcPublishConfiguration { + + @SofaService(bindings = { @SofaServiceBinding(bindingType = "bolt") }) + @Bean + public SampleFacade providerA() { + return new SampleFacadeImpl(); + } + + @SofaService(bindings = { @SofaServiceBinding(bindingType = "bolt") }, uniqueId = "uniqueId") + @Bean + public SampleFacade providerB() { + return new SampleFacadeImpl(); + } + } + +} diff --git a/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/WhiteListProviderConfigContainerTests.java b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/WhiteListProviderConfigContainerTests.java new file mode 100644 index 000000000..dc2e83191 --- /dev/null +++ b/sofa-boot-project/sofa-boot-core/rpc-sofa-boot/src/test/java/com/alipay/sofa/rpc/boot/test/provider/WhiteListProviderConfigContainerTests.java @@ -0,0 +1,37 @@ +/* + * 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.rpc.boot.test.provider; + +import com.alipay.sofa.rpc.core.exception.SofaRouteException; +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.springframework.test.context.TestPropertySource; + +/** + * @author huzijie + * @version WhiteListProviderConfigContainerTests.java, v 0.1 2023年09月27日 11:27 AM huzijie Exp $ + */ +@TestPropertySource(properties = "com.alipay.sofa.rpc.providerRegisterWhiteList=com.alipay.sofa.rpc.boot.test.bean.SampleFacade:uniqueId") +public class WhiteListProviderConfigContainerTests extends ProviderConfigContainerTestBase { + + @Test + public void checkProviderExported() { + Assertions.assertThatThrownBy(() -> sampleFacadeA.sayHi("Sofa")).isInstanceOf(SofaRouteException.class). + hasMessageContaining("RPC-020060001"); + Assertions.assertThat(sampleFacadeB.sayHi("Sofa")).isEqualTo("hi Sofa!"); + } +}