项目模块
三个model
-
服务提供方
-
消费者
-
封装公用的类
大致思路
-
扫描需要远程请求的接口类,采用代理注入到spring中。
-
代理类需要做的就是封装远程请求所需要的信息。
-
netty编写客户端将请求信息发送到服务器端。
公用类部分代码
封装远程请求信息
public class RPCRequest {
/**
* 请求的消息id
*/
private String id;
/**
* 类全路径名
*/
private String className;
/**
* 方法名
*/
private String methodName;
/**
* 方法参数
*/
private Object[] parameters;
/**
* 参数类型
*/
private Class[] parameterTypes;
}
测试实体类
public class WxUser {
private String openid;
private String nickName;
private int sex;
}
测试接口
public interface UserService {
WxUser getByOpenid(String openid);
}
消费者部分代码
//利用cjlab代理 jdk也行
public class ProxyService implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
RPCRequest request = new RPCRequest();
request.setClassName(method.getDeclaringClass().getName());
//todo 改良id获取方式
request.setId(UUID.randomUUID().toString());
request.setMethodName(method.getName());
request.setParameters(objects);
request.setParameterTypes(method.getParameterTypes());
String toJSONString = JSONObject.toJSONString(request);
//todo 添加netty
System.out.println("通过netty像服务端发请求获取:"+toJSONString);
return null;
}
}
定义bean获取方式
public class ProxyServiceFactoryBean<T> implements FactoryBean<T> {
private Class<T> interfaceType;
public ProxyServiceFactoryBean(Class<T> interfaceType) {
this.interfaceType = interfaceType;
}
@Override
public T getObject() throws Exception {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(interfaceType);
enhancer.setCallback(new ProxyService());
return (T)enhancer.create();
}
@Override
public Class<?> getObjectType() {
return interfaceType;
}
@Override
public boolean isSingleton() {
return true;
}
}
注册Bean到容器
@Component
public class RpcBeanDefinitionRegistry implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
//todo 改为包扫描的方式注入
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(UserService.class);
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
definition.getConstructorArgumentValues().addGenericArgumentValue(UserService.class);
definition.setBeanClass(ProxyServiceFactoryBean.class);
//按类型注入
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
registry.registerBeanDefinition("userService", definition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
}