笔记5:Netty的自定义RPC(JSON序列化协议)

目标:Netty的自定义RPC,序列化协议为JSON,使用fastjson作为JSON框架,并根据RpcRequest实体作为通信协议,服务端需根据客户端传递过来的RpcRequest对象通过反射,动态代理等技术,最终能够执行目标方法,返回字符串"success"。

  1. 结构
    分为三个模块:rpc-common 通用模块, rpc-consumer 客户端模块, rpc-my-provider客服端模块
    在这里插入图片描述

  2. rpc-common模块
    在这里插入图片描述
    1)接口

    public interface IUserService {
         
         
    
        public RpcResponse sayHello(String msg);
    
    }
    

    2)JSON序列化工具

    public interface Serializer {
         
         
        /**
         * java对象转换为二进制
         */
        byte[] serialize(Object object) throws IOException;
        
        /**
         * 二进制转换成java对象
         */
        <T> T deserialize(Class<T> clazz, byte[] bytes) throws IOException;
    }
    
    public class JSONSerializer implements Serializer {
         
         
    
        @Override
        public byte[] serialize(Object object) {
         
         
            return JSON.toJSONBytes(object);
        }
        
        @Override
        public <T> T deserialize(Class<T> clazz, byte[] bytes) {
         
         
            return JSON.parseObject(bytes, clazz);
        }
    }
    

    3)定义编码和解码

    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);
            }
        }
    }
    
    public class RpcDecoder extends ByteToMessageDecoder {
         
         
    
        private Class<?> clazz;
        private Serializer serializer;
        
        public RpcDecoder(Class<?> clazz, Serializer serializer) {
         
         
            this.clazz = clazz;
            this.serializer = serializer;
        }
    
        @Override
        protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
         
         
            // Check if there are at least 4 bytes readable
            if (byteBuf.readableBytes() >= 4) {
         
         
                int readInt = byteBuf.readInt();
                System.out.println("ByteToIntegerDecoder decode msg is " + readInt);
                byte[] bytes = new byte[readInt];
                byteBuf.readBytes(bytes);
                Object deserialize = serializer.deserialize(clazz, bytes);
                list.add(deserialize);
            }
        }
    }
    

    4)定义Request和Response实体组件

    public class RpcRequest {
         
         
    
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值