基于Netty的RPC简易实现

本文介绍了如何基于Netty实现一个简单的RPC框架。通过详细讲解项目结构、关键类的功能,如MsgPackDecoder、MsgPackEncoder、ObjectCodec等,阐述了客户端和服务端的交互过程。在客户端,使用动态代理和反射技术实现RPC调用;在服务端,通过反射执行相应方法并将结果返回。文章提供了代码地址供读者参考学习。
摘要由CSDN通过智能技术生成

代码地址如下:
http://www.demodashi.com/demo/13448.html

可以给你提供思路

也可以让你学到Netty相关的知识

当然,这只是一种实现方式

需求

看下图,其实这个项目就是为了做这样一件事。

有一个公共服务***ServerA***,它提供了一个名为***getUserName***的服务。

现在有多个类似ServerB的Web应用服务器。

当客户想通过ServerB要请求**getUserName服务时,由于ServerB服务中因为没有***UserService***的实现类,导致不能正常提供服务的问题。

rpc原理

预期结果

可以看到,在Client项目中,UserService没有实现类,但是返回了正常的结果。

运行结果

项目结构

整个项目分为三个部分,Server端、Client端以及一个公共jar。

下图正是整个项目的目录结构图。

目录结构

公共部分

公共部分的存在是因为我将服务器端和客户端写在了一个项目中,为了不让代码重复警告,所以提出来的一个公共模块。主要是几个实体类和一些序列化工具类。

  • MsgPackDecoder

    • 该类是一个MsgPack编码器,主要作用将Object对象序列化成byte数组。
  • MsgPackEncoder

    • 该类是一个MsgPack解码器,主要作用将byte数组反序列化成Object对象。
  • ObjectCodec

    • 该类是继承了MessageToMessageCodec<ByteBuf, Object>。是自定义序列化类主要有两个方法,encode和decode

      @Override
          protected void encode(ChannelHandlerContext ctx, Object msg, List<Object> out) {
              
              // 调用工具类的序列化方法
              byte[] data = ObjectSerializerUtils.serilizer(msg);
              ByteBuf buf = Unpooled.buffer();
              buf.writeBytes(data);
              out.add(buf);
          }
      
          @Override
          protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) {
              
              // 调用工具类的反序列化方法
              byte[] bytes = new byte[msg.readableBytes()];
              msg.readBytes(bytes);
              Object deSerilizer = ObjectSerializerUtils.deSerilizer(bytes);
              out.add(deSerilizer);
          }
      
  • ObjectSerializerUtils

    • 序列化工具类。序列化方法可以自己实现
  • MethodInvokeMeta

    • 重点类。这个类是一个实体类。用于在网络中传输的类。主要有5个字段分别记录了一个接口的类对象,调用接口的方法名,方法的参数列表(包含参数类型,和参数列表),方法的返回值类型。
    • 在客户端中,这个类将调用方所要调用的方法封装。
    • 在服务端中,这个类主要用于服务器反射调用方法。
    • 当然,也可以用String来记录这些元信息。
  • NullWritable

    • 这个类主要用于在网络中传输null。当返回值为null时,服务端会返回NullWritable对象。客户端接收到NullWritabl
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值