在上一篇文章《手把手教你写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框架就编写完了。此时的项目结构如下:
最后附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...