关于netty入门:使用Netty手写实现RPC的功能
概要RPC(Remote Procedure Call)是指近程过程调用,也就是说两台服务器A,B,一个利用部署在A服务器上,想要调用B服务器上利用提供的函数/办法。在分布式系统中的零碎环境建设和利用程序设计中有着宽泛的利用。 常见的RPC框架有 Apache DubboGoogle gRPCApache ThriftSpring Cloud的Http实现优良的开源框架有高性能,能够像调用本地办法一样调用近程服务,本文着重探讨以下流程的实现 低侵入利用Netty自定义网络协议实现近程调用本文的代码可在github上自取,链接:https://github.com/tangbu/myrpc RPC的流程以上,咱们能够看到在实现RPC的过程中,咱们须要着重解决一下几点 低侵入(咱们应用动静代理来实现办法级别间接调用)实现RpcRequest和RpcResponse的序列化和反序列化基于TCP自定义报文,承载RpcRequest和RpcResponse解决网络连接,网络传输代码实现动静代理实现低侵入(咱们应用jdk动静代理)假如应用层存在这样一个接口 public interface HelloWorldService { String helloWorld(String name);}咱们在调用HelloWorldService#helloWorld的时候,心愿自定义外面的逻辑,应用RPC来调用,为此咱们就应用动静代理来实现 public class DynamicProxy implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws ExecutionException, InterruptedException, JsonProcessingException { System.out.println("在调用办法时走到了动静代理外面"); return null; }}在真正调用helloWorld办法的时候应用如下代码 Class<?> helloWorldServiceClass = HelloWorldService.class; //创立代理类对象 HelloWorldService so = (HelloWorldService) Proxy.newProxyInstance(helloWorldServiceClass.getClassLoader(), new Class[]{HelloWorldService.class}, new DynamicProxy()); String result1 = so.helloWorld("zhangsan");此时,原有接口的逻辑就调到了动静代理办法外面。之后,咱们会将RPC的实现封装在DynamicProxy这个办法里的实现中。 封装RpcRequest对象和RpcResponse对象在执行近程调用的时候,必须通知近程服务,我须要调用那个类,那个办法,办法参数是哪些,入参是什么才能够让他返回后果给我,所以须要封装一下RpcRequest对象和RpcResponse对象 public class RpcRequest { private String requestId; private String className; private String methodName; private Class<?>[] parameterTypes; private Object[] parameters; private int version;// getter setter...}public class RpcResponse { private String requestId; private boolean success; private String message; private Object result;// getter setter...}定义网络协议,将RpcRequest和RpcResponse写成字节放在网络报文中传输自定义报文构造0----7----15---23---31| 1 | 2 | ---------------------| 2 | 3 | 4 |..... 4前面的是音讯体 ---------------------......5.......--------------------- 序号1 0-7 version 1byte序号2 7-39 总报文长度 4byte序号3 39-47 type音讯类型 1byte序号4 47-77 priority音讯优先级 1byte序号5 依据报文总长度减掉1-4的长度就是5的长度相应的依据这个报文构造,能够形象出咱们的TCP的报文Java类 ...