spring配置类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(KafkaRpcScanRegistrar.class)
public @interface KafkaRpcScan {
String[] value() default {};
Class<? extends KafkaRpcBean> factoryBean() default KafkaRpcBean.class;
}
注解类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MapperScannerRegistrar.class)
public @interface KafkaRpcClient {
String topic();
String replyTopic();
String value();//beanName 对方调用的Controller对应的 类上RequestMap
}
对接口解析加入springbean
public class KafkaRpcScanRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware,ApplicationContextAware {
private ResourceLoader resourceLoader;
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AnnotationAttributes annoAttrs = AnnotationAttributes
.fromMap(importingClassMetadata.getAnnotationAttributes(KafkaRpcScan.class.getName()));
String[] packs = annoAttrs.getStringArray("value");
Class<? extends Object> factoryBean = annoAttrs.getClass("factoryBean");
AnnotatedTypeScanner beanScanner = new AnnotatedTypeScanner(KafkaRpcClient.class);
Set<Class<?>> beanDefinitions = beanScanner.findTypes(packs);
for (Class<?> bd : beanDefinitions) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(bd);
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
definition.getPropertyValues().add("rpcInterface", definition.getBeanClassName());
definition.getPropertyValues().add("context", context);
definition.setBeanClass(KafkaRpcBean.class);
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
String beanName=bd.getSimpleName().substring(0, 1).toLowerCase()+bd.getSimpleName().substring(1);
registry.registerBeanDefinition(beanName, definition);
}
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context=applicationContext;
}
}
接口 方法的动态代理封装 ,接口方法的具体实现
public class KafkaRpcBean<T> implements FactoryBean<T> {
Class<T

本文介绍了一种使用Kafka替代Feign进行RPC调用的方法。通过定义`KafkaRpcScan`和`KafkaRpcClient`注解,扫描并注册带有指定注解的接口,并使用动态代理来实现接口方法的调用。`KafkaRpcBean`作为FactoryBean处理请求和响应,`ReplyingKafkaTemplate`用于发送和接收Kafka消息。接收端通过`@KafkaListener`监听主题,解析请求并调用相应Controller的方法,返回结果。示例展示了如何创建`UserRpcService`接口,以及其实现类`KafkaUserController`。
最低0.47元/天 解锁文章
400

被折叠的 条评论
为什么被折叠?



