一、rpc生产端
自定义注解为
/**
* @author :hzz
* @description:rpc服务端提供的注解
* @date :2022/1/2 10:47
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface RpcService {
/**
* 注册的生产者发布名
* @return
*/
String ServerName() default "" ;
}
1、核心思路是实现 BeanPostProcessor,并自定义注解,注解用于定义实现类
/**
* @author :hzz
* @description:TODO
* @date :2022/1/2 11:42
*/
public class RpcServerRegistrarBeanPostProcesser implements BeanPostProcessor {
private RpcServerContext rpcServerContext;
public RpcServerRegistrarBeanPostProcesser(RpcServerContext rpcServerContext) {
this.rpcServerContext = rpcServerContext;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
RpcService annotation = bean.getClass().getAnnotation(RpcService.class);
if(annotation!=null) {
String serverName = annotation.ServerName();
if (serverName == null || "".equalsIgnoreCase(serverName.trim())) {
serverName = bean.getClass().getInterfaces()[0].getName();
}
rpcServerContext.addRpcServer(serverName, beanName);
}
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
2、注册中心直接使用redis,将扫描到的带有自定义rpc服务生产者的类对应的netty的ip+端口号注册到redis,并在服务本地缓存一份
3、启动netty服务端监听对应端口
4、使用方式
/**
* @author :hzz
* @description:TODO
* @date :2022/1/2 10:56
*/
@RpcService
public class MyServiceServerImpl implements MyServiceServer {
@Override
public String hello() {
return "hello";
}
}
二、消费端
自定义注解为
/**
* @author :hzz
* @description:rpc服务端的注入
* @date :2022/1/2 10:47
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RpcAutowired {
/**
* 注册的生产者发布名
* @return
*/
String ServerName() default "" ;
}
1、核心思路是实现InstantiationAwareBeanPostProcessor接口,并实现
postProcessProperties方法,这个方法是在spring生命周期中填充属性的时候执行的回调,这个时候可以对这