在上一篇文章《手把手教你写rpc框架系列(十六)实现客户端的代理(编组,请求,响应,解组)》,我们实现了代理的编写。现在就要进入应用环节了,应用的时候,其实我们更希望使用一个注解就自动帮我们完成了这些调用环节,这样子更简单一些。那么这个时候怎么实现呢?
首先我们定义一个RPCClient的注解,代码示例如下:
package org.wz.rpc.framework.anotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 该注解用于注入远程服务,这个直接的话应用于consumer,主要应用于调用远程服务的时候注入,替代@Autowired * */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RPCClient { }
定义了注解之后,我们就要来实现他,所以在前面编写的DefaultRpcProcessor里面,我们来开启ClientProxyFactory代理,代码示例如下:
@Resource
private ClientProxyFactory clientProxyFactory;
private void startRPCClient(ApplicationContext context) {
String[] names = context.getBeanDefinitionNames();
for (String name : names) {
Class<?> clazz = context.getType(name);
if (Objects.isNull(clazz)) continue;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
RPCClient injectLeisure = field.getAnnotation(RPCClient.class);
if (Objects.isNull(injectLeisure)) continue;
Class<?> fieldClass = field.getType();
Object object = context.getBean(name);
field.setAccessible(true);
try {
field.set(object, clientProxyFactory.getProxy(fieldClass));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}定义好了之后,在程序启动的时候就把客户端给启动起来,所以需要在onApplicationEvent方法内启动这个client
当然还有比较重要的一点就是,需要自爱configuration里面注入下ClientProxyFactory,因此需要在AutoConfiguration类里面注入下这个ClientProxyFactory,代码示例如下:
@Bean
public ClientProxyFactory clientProxyFactory(@Autowired RpcRegisterProperty leisureRpcProperty) {
ClientProxyFactory clientProxyFactory = new ClientProxyFactory();
// 设置服务发现者
clientProxyFactory.setSid(new ZookeeperServiceDiscoverer(leisureRpcProperty.getRegisterAddress()));
// 设置支持的协议
Map<String, MessageProtocol> supportMessageProtocols = new HashMap<>();
supportMessageProtocols.put(leisureRpcProperty.getProtocol(), new JavaSerializeMessageProtocol());
clientProxyFactory.setSupportMessageProtocols(supportMessageProtocols);
// 设置网络层实现
clientProxyFactory.setNetClient(new NettyNetClient());
return clientProxyFactory;
}到此为止,我们整个rpc框架就编写完了。此时的项目结构如下:
最后附上本案例的源码,登录后即可下载。



还没有评论,来说两句吧...