From 79faf93bd8caef4cd63587ca8bc01c86a60a8d59 Mon Sep 17 00:00:00 2001 From: kimmking Date: Fri, 18 Dec 2020 17:22:56 +0800 Subject: [PATCH] add annotation --- 07rpc/rpc01/rpcfx-core/pom.xml | 6 + .../rpcfx/api}/ServiceProviderDesc.java | 2 +- .../RpcfxClassPathBeanDefinitionScanner.java | 47 +++ .../api/annotation/RpcfxComponentScan.java | 42 +++ .../RpcfxComponentScanRegistrar.java | 60 ++++ .../rpcfx/api/annotation/RpcfxService.java | 65 ++++ .../ServiceAnnotationBeanPostProcessor.java | 4 + .../annotation/ServiceClassPostProcessor.java | 277 ++++++++++++++++++ .../java/io/kimmking/rpcfx/client/Rpcfx.java | 12 +- .../demo/consumer/RpcfxClientApplication.java | 6 +- .../demo/provider/RpcfxServerApplication.java | 23 +- .../rpcfx/demo/provider/UserServiceImpl.java | 2 + 12 files changed, 527 insertions(+), 19 deletions(-) rename 07rpc/rpc01/{rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider => rpcfx-core/src/main/java/io/kimmking/rpcfx/api}/ServiceProviderDesc.java (93%) create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxClassPathBeanDefinitionScanner.java create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScan.java create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScanRegistrar.java create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxService.java create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceAnnotationBeanPostProcessor.java create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceClassPostProcessor.java diff --git a/07rpc/rpc01/rpcfx-core/pom.xml b/07rpc/rpc01/rpcfx-core/pom.xml index 8f11dc5d..31401c31 100644 --- a/07rpc/rpc01/rpcfx-core/pom.xml +++ b/07rpc/rpc01/rpcfx-core/pom.xml @@ -24,6 +24,12 @@ 1.2.70 + + org.projectlombok + lombok + 1.18.16 + + com.squareup.okhttp3 okhttp diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/ServiceProviderDesc.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/ServiceProviderDesc.java similarity index 93% rename from 07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/ServiceProviderDesc.java rename to 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/ServiceProviderDesc.java index 78900eb7..f1d43192 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/ServiceProviderDesc.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/ServiceProviderDesc.java @@ -1,4 +1,4 @@ -package io.kimmking.rpcfx.demo.provider; +package io.kimmking.rpcfx.api; public class ServiceProviderDesc { diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxClassPathBeanDefinitionScanner.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxClassPathBeanDefinitionScanner.java new file mode 100644 index 00000000..2fcc8ae0 --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxClassPathBeanDefinitionScanner.java @@ -0,0 +1,47 @@ +package io.kimmking.rpcfx.api.annotation; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; + +import java.util.Set; + +import static org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors; + +public class RpcfxClassPathBeanDefinitionScanner extends ClassPathBeanDefinitionScanner { + + + public RpcfxClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters, Environment environment, + ResourceLoader resourceLoader) { + + super(registry, useDefaultFilters); + + setEnvironment(environment); + + setResourceLoader(resourceLoader); + + registerAnnotationConfigProcessors(registry); + + } + + public RpcfxClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, Environment environment, + ResourceLoader resourceLoader) { + + this(registry, false, environment, resourceLoader); + + } + + @Override + public Set doScan(String... basePackages) { + return super.doScan(basePackages); + } + + @Override + public boolean checkCandidate(String beanName, BeanDefinition beanDefinition) throws IllegalStateException { + return super.checkCandidate(beanName, beanDefinition); + } + +} \ No newline at end of file diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScan.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScan.java new file mode 100644 index 00000000..357fd2d6 --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScan.java @@ -0,0 +1,42 @@ +package io.kimmking.rpcfx.api.annotation; + +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import(RpcfxComponentScanRegistrar.class) +public @interface RpcfxComponentScan { + + /** + * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation + * declarations e.g.: {@code @DubboComponentScan("org.my.pkg")} instead of + * {@code @DubboComponentScan(basePackages="org.my.pkg")}. + * + * @return the base packages to scan + */ + String[] value() default {}; + + /** + * Base packages to scan for annotated @Service classes. {@link #value()} is an + * alias for (and mutually exclusive with) this attribute. + *

+ * Use {@link #basePackageClasses()} for a type-safe alternative to String-based + * package names. + * + * @return the base packages to scan + */ + String[] basePackages() default {}; + + /** + * Type-safe alternative to {@link #basePackages()} for specifying the packages to + * scan for annotated @Service classes. The package of each class specified will be + * scanned. + * + * @return classes from the base packages to scan + */ + Class[] basePackageClasses() default {}; + +} diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScanRegistrar.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScanRegistrar.java new file mode 100644 index 00000000..6ecd8090 --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxComponentScanRegistrar.java @@ -0,0 +1,60 @@ +package io.kimmking.rpcfx.api.annotation; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.core.type.AnnotationMetadata; +import org.springframework.util.ClassUtils; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition; + +public class RpcfxComponentScanRegistrar implements ImportBeanDefinitionRegistrar { + + @Override + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + + Set packagesToScan = getPackagesToScan(importingClassMetadata); + + registerServiceAnnotationBeanPostProcessor(packagesToScan, registry); + + //registerCommonBeans(registry); + } + + private void registerServiceAnnotationBeanPostProcessor(Set packagesToScan, BeanDefinitionRegistry registry) { + + BeanDefinitionBuilder builder = rootBeanDefinition(ServiceAnnotationBeanPostProcessor.class); + builder.addConstructorArgValue(packagesToScan); + builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + AbstractBeanDefinition beanDefinition = builder.getBeanDefinition(); + BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry); + + } + + private Set getPackagesToScan(AnnotationMetadata metadata) { + AnnotationAttributes attributes = AnnotationAttributes.fromMap( + metadata.getAnnotationAttributes(RpcfxComponentScan.class.getName())); + String[] basePackages = attributes.getStringArray("basePackages"); + Class[] basePackageClasses = attributes.getClassArray("basePackageClasses"); + String[] value = attributes.getStringArray("value"); + // Appends value array attributes + Set packagesToScan = new LinkedHashSet(Arrays.asList(value)); + packagesToScan.addAll(Arrays.asList(basePackages)); + for (Class basePackageClass : basePackageClasses) { + packagesToScan.add(ClassUtils.getPackageName(basePackageClass)); + } + if (packagesToScan.isEmpty()) { + return Collections.singleton(ClassUtils.getPackageName(metadata.getClassName())); + } + return packagesToScan; + } + +} \ No newline at end of file diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxService.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxService.java new file mode 100644 index 00000000..54a2964d --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/RpcfxService.java @@ -0,0 +1,65 @@ +package io.kimmking.rpcfx.api.annotation; + +import io.kimmking.rpcfx.api.Filter; + +import java.lang.annotation.*; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +@Inherited +public @interface RpcfxService { + + /** + * Interface class name, default value is empty string + */ + String interfaceName() default ""; + + /** + * Service version, default value is empty string + */ + String version() default ""; + + /** + * Service group, default value is empty string + */ + String group() default ""; + + /** + * Service mock name, use interface name + Mock if not set + */ + String mock() default ""; + + /** + * Timeout value for service invocation, default value is 0 + */ + + int timeout() default 0; + + /** + * Filters for service invocation + * + * @see Filter + */ + String[] filter() default {}; + + /** + * Service owner name + */ + String owner() default ""; + + /** + * Application spring bean name + */ + String application() default ""; + + /** + * Module spring bean name + */ + String module() default ""; + + /** + * Service tag name + */ + String tag() default ""; +} diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceAnnotationBeanPostProcessor.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceAnnotationBeanPostProcessor.java new file mode 100644 index 00000000..d262ed06 --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceAnnotationBeanPostProcessor.java @@ -0,0 +1,4 @@ +package io.kimmking.rpcfx.api.annotation; + +public class ServiceAnnotationBeanPostProcessor { +} diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceClassPostProcessor.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceClassPostProcessor.java new file mode 100644 index 00000000..54a52449 --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/annotation/ServiceClassPostProcessor.java @@ -0,0 +1,277 @@ +package io.kimmking.rpcfx.api.annotation; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.beans.factory.config.*; +import org.springframework.beans.factory.support.*; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.context.annotation.AnnotationBeanNameGenerator; +import org.springframework.context.annotation.AnnotationConfigUtils; +import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; +import org.springframework.context.annotation.ConfigurationClassPostProcessor; +import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.core.env.Environment; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.lang.Nullable; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; + +import java.lang.annotation.Annotation; +import java.util.*; + +import static java.util.Arrays.asList; +import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition; +import static org.springframework.context.annotation.AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR; +import static org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation; +import static org.springframework.core.annotation.AnnotationUtils.getAnnotationAttributes; +import static org.springframework.util.ClassUtils.resolveClassName; + +@Slf4j +public class ServiceClassPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware, + ResourceLoaderAware, BeanClassLoaderAware { + + private final static List> serviceAnnotationTypes = asList( + RpcfxService.class + ); + + protected final Set packagesToScan; + private Environment environment; + private ResourceLoader resourceLoader; + private ClassLoader classLoader; + + public ServiceClassPostProcessor(String... packagesToScan) { + this(asList(packagesToScan)); + } + + public ServiceClassPostProcessor(Collection packagesToScan) { + this(new LinkedHashSet<>(packagesToScan)); + } + + public ServiceClassPostProcessor(Set packagesToScan) { + this.packagesToScan = packagesToScan; + } + + @Override + public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { +// registerInfrastructureBean(registry, DubboBootstrapApplicationListener.BEAN_NAME, DubboBootstrapApplicationListener.class); + Set resolvedPackagesToScan = resolvePackagesToScan(packagesToScan); + if (!CollectionUtils.isEmpty(resolvedPackagesToScan)) { + registerServiceBeans(resolvedPackagesToScan, registry); + } else { + if (log.isWarnEnabled()) { + log.warn("packagesToScan is empty , ServiceBean registry will be ignored!"); + } + } + } + + private void registerServiceBeans(Set packagesToScan, BeanDefinitionRegistry registry) { + RpcfxClassPathBeanDefinitionScanner scanner = + new RpcfxClassPathBeanDefinitionScanner(registry, environment, resourceLoader); + BeanNameGenerator beanNameGenerator = resolveBeanNameGenerator(registry); + scanner.setBeanNameGenerator(beanNameGenerator); + serviceAnnotationTypes.forEach(annotationType -> { + scanner.addIncludeFilter(new AnnotationTypeFilter(annotationType)); + }); + for (String packageToScan : packagesToScan) { + // Registers @Service Bean first + scanner.scan(packageToScan); + // Finds all BeanDefinitionHolders of @Service whether @ComponentScan scans or not. + Set beanDefinitionHolders = + findServiceBeanDefinitionHolders(scanner, packageToScan, registry, beanNameGenerator); + if (!CollectionUtils.isEmpty(beanDefinitionHolders)) { + for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) { + registerServiceBean(beanDefinitionHolder, registry, scanner); + } + if (log.isInfoEnabled()) { + log.info(beanDefinitionHolders.size() + " annotated Dubbo's @Service Components { " + + beanDefinitionHolders + + " } were scanned under package[" + packageToScan + "]"); + } + } else { + if (log.isWarnEnabled()) { + log.warn("No Spring Bean annotating Dubbo's @Service was found under package[" + + packageToScan + "]"); + } + } + } + } + + private BeanNameGenerator resolveBeanNameGenerator(BeanDefinitionRegistry registry) { + BeanNameGenerator beanNameGenerator = null; + if (registry instanceof SingletonBeanRegistry) { + SingletonBeanRegistry singletonBeanRegistry = SingletonBeanRegistry.class.cast(registry); + beanNameGenerator = (BeanNameGenerator) singletonBeanRegistry.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR); + } + if (beanNameGenerator == null) { + if (log.isInfoEnabled()) { + log.info("BeanNameGenerator bean can't be found in BeanFactory with name [" + + CONFIGURATION_BEAN_NAME_GENERATOR + "]"); + log.info("BeanNameGenerator will be a instance of " + + AnnotationBeanNameGenerator.class.getName() + + " , it maybe a potential problem on bean name generation."); + } + beanNameGenerator = new AnnotationBeanNameGenerator(); + } + return beanNameGenerator; + } + + private Set findServiceBeanDefinitionHolders( + ClassPathBeanDefinitionScanner scanner, String packageToScan, BeanDefinitionRegistry registry, + BeanNameGenerator beanNameGenerator) { + Set beanDefinitions = scanner.findCandidateComponents(packageToScan); + Set beanDefinitionHolders = new LinkedHashSet<>(beanDefinitions.size()); + for (BeanDefinition beanDefinition : beanDefinitions) { + String beanName = beanNameGenerator.generateBeanName(beanDefinition, registry); + BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(beanDefinition, beanName); + beanDefinitionHolders.add(beanDefinitionHolder); + } + return beanDefinitionHolders; + } + + private void registerServiceBean(BeanDefinitionHolder beanDefinitionHolder, BeanDefinitionRegistry registry, + RpcfxClassPathBeanDefinitionScanner scanner) { + Class beanClass = resolveClass(beanDefinitionHolder); + Annotation service = findServiceAnnotation(beanClass); + AnnotationAttributes serviceAnnotationAttributes = getAnnotationAttributes(service, false, false); + Class interfaceClass = serviceAnnotationAttributes.getClass("interfaceName"); //resolveServiceInterfaceClass(serviceAnnotationAttributes, beanClass); + String annotatedServiceBeanName = beanDefinitionHolder.getBeanName(); + AbstractBeanDefinition serviceBeanDefinition = + buildServiceBeanDefinition(service, serviceAnnotationAttributes, interfaceClass, annotatedServiceBeanName); + + // ServiceBean Bean name + String beanName = interfaceClass.getName(); //generateServiceBeanName(serviceAnnotationAttributes, interfaceClass); + if (scanner.checkCandidate(beanName, serviceBeanDefinition)) { // check duplicated candidate bean + registry.registerBeanDefinition(beanName, serviceBeanDefinition); + if (log.isInfoEnabled()) { + log.info("The BeanDefinition[" + serviceBeanDefinition + + "] of ServiceBean has been registered with name : " + beanName); + } + } else { + if (log.isWarnEnabled()) { + log.warn("The Duplicated BeanDefinition[" + serviceBeanDefinition + + "] of ServiceBean[ bean name : " + beanName + + "] was be found , Did @DubboComponentScan scan to same package in many times?"); + } + } + } + + private Annotation findServiceAnnotation(Class beanClass) { + return serviceAnnotationTypes + .stream() + .map(annotationType -> findMergedAnnotation(beanClass, annotationType)) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + } + +// private String generateServiceBeanName(AnnotationAttributes serviceAnnotationAttributes, Class interfaceClass) { +//// ServiceBeanNameBuilder builder = create(interfaceClass, environment) +//// .group(serviceAnnotationAttributes.getString("group")) +//// .version(serviceAnnotationAttributes.getString("version")); +//// return builder.build(); +// return interfaceClass.getName(); +// } + + private Class resolveClass(BeanDefinitionHolder beanDefinitionHolder) { + BeanDefinition beanDefinition = beanDefinitionHolder.getBeanDefinition(); + return resolveClass(beanDefinition); + } + + private Class resolveClass(BeanDefinition beanDefinition) { + String beanClassName = beanDefinition.getBeanClassName(); + return resolveClassName(beanClassName, classLoader); + } + + private Set resolvePackagesToScan(Set packagesToScan) { + Set resolvedPackagesToScan = new LinkedHashSet(packagesToScan.size()); + for (String packageToScan : packagesToScan) { + if (StringUtils.hasText(packageToScan)) { + String resolvedPackageToScan = environment.resolvePlaceholders(packageToScan.trim()); + resolvedPackagesToScan.add(resolvedPackageToScan); + } + } + return resolvedPackagesToScan; + } + + private AbstractBeanDefinition buildServiceBeanDefinition(Annotation serviceAnnotation, + AnnotationAttributes serviceAnnotationAttributes, + Class interfaceClass, + String annotatedServiceBeanName) { + BeanDefinitionBuilder builder = rootBeanDefinition(ServiceBean.class); + AbstractBeanDefinition beanDefinition = builder.getBeanDefinition(); + MutablePropertyValues propertyValues = beanDefinition.getPropertyValues(); + String[] ignoreAttributeNames = of("interfaceName"); + propertyValues.addPropertyValues(new AnnotationPropertyValuesAdapter(serviceAnnotation, environment, ignoreAttributeNames)); + // Set interface + builder.addPropertyValue("interface", interfaceClass.getName()); + +// String moduleConfigBeanName = serviceAnnotationAttributes.getString("module"); +// if (StringUtils.hasText(moduleConfigBeanName)) { +// addPropertyReference(builder, "module", moduleConfigBeanName); +// } +// +// String[] registryConfigBeanNames = serviceAnnotationAttributes.getStringArray("registry"); +// List registryRuntimeBeanReferences = toRuntimeBeanReferences(registryConfigBeanNames); +// if (!registryRuntimeBeanReferences.isEmpty()) { +// builder.addPropertyValue("registries", registryRuntimeBeanReferences); +// } + return builder.getBeanDefinition(); + } + +// private ManagedList toRuntimeBeanReferences(String... beanNames) { +// ManagedList runtimeBeanReferences = new ManagedList<>(); +// if (!ObjectUtils.isEmpty(beanNames)) { +// for (String beanName : beanNames) { +// String resolvedBeanName = environment.resolvePlaceholders(beanName); +// runtimeBeanReferences.add(new RuntimeBeanReference(resolvedBeanName)); +// } +// } +// return runtimeBeanReferences; +// } +// private void addPropertyReference(BeanDefinitionBuilder builder, String propertyName, String beanName) { +// String resolvedBeanName = environment.resolvePlaceholders(beanName); +// builder.addPropertyReference(propertyName, resolvedBeanName); +// } + + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + + } + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + @Override + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + @Override + public void setBeanClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + public static Class resolveClassName(String className, @Nullable ClassLoader classLoader) throws IllegalArgumentException { + try { + return Class.forName(className, false, classLoader); + } catch (IllegalAccessError var3) { + throw new IllegalStateException("Readability mismatch in inheritance hierarchy of class [" + className + "]: " + var3.getMessage(), var3); + } catch (LinkageError var4) { + throw new IllegalArgumentException("Unresolvable class definition for class [" + className + "]", var4); + } catch (ClassNotFoundException var5) { + throw new IllegalArgumentException("Could not find class [" + className + "]", var5); + } + } + + public static T[] of(T... values) { + return values; + } +} \ No newline at end of file diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java index 82575a42..02239cc4 100644 --- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/client/Rpcfx.java @@ -37,10 +37,10 @@ public static T createFromRegistry(final Class serviceClass, fin } - public static T create(final Class serviceClass, final String url, Filter filter) { + public static T create(final Class serviceClass, final String url, Filter... filters) { // 0. 替换动态代理 -> AOP - return (T) Proxy.newProxyInstance(Rpcfx.class.getClassLoader(), new Class[]{serviceClass}, new RpcfxInvocationHandler(serviceClass, url, filter)); + return (T) Proxy.newProxyInstance(Rpcfx.class.getClassLoader(), new Class[]{serviceClass}, new RpcfxInvocationHandler(serviceClass, url, filters)); } @@ -73,9 +73,11 @@ public Object invoke(Object proxy, Method method, Object[] params) throws Throwa request.setMethod(method.getName()); request.setParams(params); - for (Filter filter : filters) { - if(!filter.filter(request)) { - return null; + if(null != filters) { + for (Filter filter : filters) { + if (!filter.filter(request)) { + throw new RuntimeException(String.format("filter {} return false.", filter.toString())); + } } } diff --git a/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java b/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java index 3c3ce1d4..8ae7be3c 100644 --- a/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java +++ b/07rpc/rpc01/rpcfx-demo-consumer/src/main/java/io/kimmking/rpcfx/demo/consumer/RpcfxClientApplication.java @@ -27,13 +27,17 @@ public static void main(String[] args) { System.out.println("find user id=1 from server: " + user.getName()); OrderService orderService = Rpcfx.create(OrderService.class, "http://localhost:8080/"); - Order order = orderService.findOrderById(1992129); + Order order = orderService.findOrderById(1992129);¡ System.out.println(String.format("find order name=%s, amount=%f",order.getName(),order.getAmount())); // UserService userService2 = Rpcfx.createFromRegistry(UserService.class, "localhost:2181", new TagRouter(), new RandomLoadBalancer(), new CuicuiFilter()); // SpringApplication.run(RpcfxClientApplication.class, args); + + + + } } diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java index e6b58b0e..d0dcc5a5 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java +++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/RpcfxServerApplication.java @@ -3,6 +3,7 @@ import io.kimmking.rpcfx.api.RpcfxRequest; import io.kimmking.rpcfx.api.RpcfxResolver; import io.kimmking.rpcfx.api.RpcfxResponse; +import io.kimmking.rpcfx.api.ServiceProviderDesc; import io.kimmking.rpcfx.demo.api.OrderService; import io.kimmking.rpcfx.demo.api.UserService; import io.kimmking.rpcfx.server.RpcfxInvoker; @@ -15,8 +16,6 @@ import org.springframework.web.bind.annotation.RestController; import java.net.InetAddress; -import java.net.InterfaceAddress; -import java.net.UnknownHostException; @SpringBootApplication @RestController @@ -59,15 +58,15 @@ public RpcfxResolver createResolver(){ // annotation - - @Bean(name = "io.kimmking.rpcfx.demo.api.UserService") - public UserService createUserService(){ - return new UserServiceImpl(); - } - - @Bean(name = "io.kimmking.rpcfx.demo.api.OrderService") - public OrderService createOrderService(){ - return new OrderServiceImpl(); - } +// +// @Bean(name = "io.kimmking.rpcfx.demo.api.UserService") +// public UserService createUserService(){ +// return new UserServiceImpl(); +// } +// +// @Bean(name = "io.kimmking.rpcfx.demo.api.OrderService") +// public OrderService createOrderService(){ +// return new OrderServiceImpl(); +// } } diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/UserServiceImpl.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/UserServiceImpl.java index 5c37d60a..12419b35 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/UserServiceImpl.java +++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/UserServiceImpl.java @@ -2,7 +2,9 @@ import io.kimmking.rpcfx.demo.api.User; import io.kimmking.rpcfx.demo.api.UserService; +import io.kimmking.rpcfx.api.annotation.RpcfxService; +@RpcfxService(interfaceName = "io.kimmking.rpcfx.demo.api.UserService") public class UserServiceImpl implements UserService { @Override