当前位置: 首页 > article >正文

Netty 实战篇:手写一个轻量级 RPC 框架原型

本文将基于前文实现的编解码与心跳机制,构建一个简单的 RPC 框架,包括请求封装、响应解析、动态代理调用。为打造微服务通信基础打下基础。


一、什么是 RPC?

RPC(Remote Procedure Call,远程过程调用)允许你像调用本地方法一样调用远程服务。

RPC 框架的核心包括:

  • 通信协议(我们用 Netty 实现)

  • 服务注册与发现(此处简化为直连)

  • 编码/解码机制(TLV、自定义协议)

  • 动态代理与调用(Java 反射)


二、定义协议数据结构

请求对象

public class RpcRequest {private String className;private String methodName;private Class<?>[] paramTypes;private Object[] args;
}

响应对象

public class RpcResponse {private Object result;private Throwable error;
}

三、编码器和解码器(简化版)

此处建议使用 Java 内置序列化或 JSON,避免自行实现复杂字节协议

public class RpcEncoder<T> extends MessageToByteEncoder<T> {@Overrideprotected void encode(ChannelHandlerContext ctx, T msg, ByteBuf out) throws Exception {byte[] data = SerializationUtil.serialize(msg); // 自定义序列化工具out.writeInt(data.length);out.writeBytes(data);}
}
public class RpcDecoder<T> extends ByteToMessageDecoder {private final Class<T> clazz;public RpcDecoder(Class<T> clazz) { this.clazz = clazz; }@Overrideprotected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {if (in.readableBytes() < 4) return;in.markReaderIndex();int length = in.readInt();if (in.readableBytes() < length) {in.resetReaderIndex();return;}byte[] bytes = new byte[length];in.readBytes(bytes);out.add(SerializationUtil.deserialize(bytes, clazz));}
}

四、客户端动态代理

public class RpcClientProxy {private final String host;private final int port;public RpcClientProxy(String host, int port) {this.host = host;this.port = port;}@SuppressWarnings("unchecked")public <T> T getProxy(Class<T> serviceClass) {return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(),new Class<?>[]{serviceClass},(proxy, method, args) -> {RpcRequest request = new RpcRequest();request.setClassName(serviceClass.getName());request.setMethodName(method.getName());request.setParamTypes(method.getParameterTypes());request.setArgs(args);// Netty 同步发送请求,获取响应(略)RpcResponse response = NettyClient.send(request, host, port);return response.getResult();});}
}

五、服务端调用分发

public class RpcServerHandler extends SimpleChannelInboundHandler<RpcRequest> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) {RpcResponse response = new RpcResponse();try {Class<?> clazz = Class.forName(request.getClassName());Method method = clazz.getMethod(request.getMethodName(), request.getParamTypes());Object result = method.invoke(clazz.getDeclaredConstructor().newInstance(), request.getArgs());response.setResult(result);} catch (Exception e) {response.setError(e);}ctx.writeAndFlush(response);}
}

六、服务端注册

ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boss, worker).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {protected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new RpcDecoder(RpcRequest.class));pipeline.addLast(new RpcEncoder<>(RpcResponse.class));pipeline.addLast(new RpcServerHandler());}});
bootstrap.bind(8080).sync();

七、调用示例

// 定义服务接口
public interface HelloService {String hello(String name);
}// 服务实现类
public class HelloServiceImpl implements HelloService {public String hello(String name) {return "Hello, " + name;}
}// 客户端调用
RpcClientProxy proxy = new RpcClientProxy("localhost", 8080);
HelloService service = proxy.getProxy(HelloService.class);
System.out.println(service.hello("Netty"));

八、总结

通过本篇,你已经实现了:

  • 基于 Netty 的 RPC 协议通信

  • 编解码框架构建

  • 动态代理与服务远程调用

  • 基础版 Netty RPC 框架原型

虽然还不完善(无注册中心、无连接池、无异步支持),但已具备通信能力,是 Netty 技术栈走向分布式架构的重要一步。

http://www.lryc.cn/news/2393287.html

相关文章:

  • 什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程
  • 亚远景-ISO 21434标准:汽车网络安全实践的落地指南
  • 【动手学深度学习】2.4. 微积分
  • 流程自动化引擎:让业务自己奔跑
  • AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力
  • 用 Python 模拟雪花飘落效果
  • 基于定制开发开源AI智能名片S2B2C商城小程序的大零售渗透策略研究
  • 重拾Scrapy框架
  • Day 40
  • XPlifeapp:高效打印,便捷生活
  • 等保测评-Mysql数据库测评篇
  • CSS篇-2
  • 02.K8S核心概念
  • 一套qt c++的串口通信
  • 【高频面试题】数组中的第K个最大元素(堆、快排进阶)
  • Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索
  • 基于Python的单斜式ADC建模与仿真分析
  • 笔记本电脑右下角wifi不显示,连不上网怎么办?
  • 一篇文章玩转CAP原理
  • Vue-收集表单信息
  • 私服 nexus 之间迁移 npm 仓库
  • 微服务及容器化设计--可扩展的架构设计
  • vscode开发stm32,main.c文件中出现很多报错影响开发解决日志
  • 嵌入式鸿蒙系统中水平和垂直以及图片调用方法
  • 【海康USB相机被HALCON助手连接过后,MVS显示无法连接故障。】
  • 面试大厂Java:从Spring Boot到微服务架构
  • 2025年电气工程与轨道交通国际会议:绿色能源与智能交通的创新之路
  • macOS 安装 Grafana + Prometheus + Node Exporter
  • WPF log4net用法
  • 数字孪生数据监控如何提升汽车零部件工厂产品质量