# 第三阶段,模块一作业 **Repository Path**: L-ios/stage03_task01_exercise ## Basic Information - **Project Name**: 第三阶段,模块一作业 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-17 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 编程题: 在基于Netty的自定义RPC的案例基础上,进行改造。 案例版本: 序列化方式为String, 并根据自定义的providerName做为通信协议,服务端判断是否以”UserService“开头 完成的案例。 要求完成改造版本: 序列化协议修改为JSON,使用fastjson作为JSON框架,并根据RpcRequest实体作为通信协议,服务端需根据客户端传递过来的RpcRequest对象通过反射,动态代理等技术,最终能够执行目标方法,返回字符串"success"。 ---------------------------------------------------------- 1、提供资料:代码工程、验证及讲解视频。(仓库中只有本次作业内容) 2、讲解内容包含:题目分析、实现思路、代码讲解。 3、效果视频验证 3.1 使用fastjson作为json框架。 3.2 客户端发送给服务端RpcRequest请求,服务端接收后,利用反射、动态代理执行目标方法,返回“success” ---------------------------------------------------------- 要点提示: (1)客户端代理的invoke方法中需封装RpcRequest对象,将其当做参数进行传递。 (2)服务端的UserServiceImpl类上添加@Service注解,在启动项目时,添加到容器中。 (3)服务端要添加@SpringBootApplication注解,main方法中添加。SpringApplication.run(ServerBootstrap.class, args);,进行启动扫描(注意项目启动类位置:扫描路径)。 (4)服务端在收到参数,可以借助反射及动态代理(如需用到ApplicationContext对象,可以借助实现ApplicationContextAware接口获取),来调用UserServiceImpl方法,最终向客户端返回”success“即可。 (5)既然传递的是RpcRequest对象了,那么客户端的编码器与服务端的解码器需重新设置 示例: pipeline.addLast( new RpcDecoder(RpcRequest.class, new JSONSerializer())); **具体协议对象、序列化接口及实现类、编解码器如下** 通信协议对象: public class RpcRequest{ /** * 请求对象的ID */ private String requestId; /** * 类名 */ private String className; /** * 方法名 */ private String methodName; /** * 参数类型 */ private Class[] parameterTypes; /** * 入参 */ private Object[] parameters; /getter/setter方法..... } fastjson依赖: com.alibaba fastjson 1.2.41 序列化接口: public interface Serializer { /** * java对象转换为二进制 * * @param object * @return */ byte[] serialize(Object object) throws IOException; /** * 二进制转换成java对象 * * @param clazz * @param bytes * @param * @return */ T deserialize(Class clazz, byte[] bytes) throws IOException; } ``` 采用JSON的方式,定义JSONSerializer的实现类:(其他序列化方式,可以自行实现序列化接口) public class JSONSerializer implements Serializer{ @Override public byte[] serialize(Object object) { return JSON.toJSONBytes(object); } @Override public T deserialize(Class clazz, byte[] bytes) { return JSON.parseObject(bytes, clazz); } } 编码器实现:(现在传输的是RpcRequest, 需要编码器将请求对象转换为适合于传输的格式) public class RpcEncoder extends MessageToByteEncoder { private Class clazz; private Serializer serializer; public RpcEncoder(Class clazz, Serializer serializer) { this.clazz = clazz; this.serializer = serializer; } @Override protected void encode(ChannelHandlerContext channelHandlerContext, Object msg, ByteBuf byteBuf) throws Exception { if (clazz != null && clazz.isInstance(msg)) { byte[] bytes = serializer.serialize(msg); byteBuf.writeInt(bytes.length); byteBuf.writeBytes(bytes); } } }