开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
序列化和反序列化选择
Java自带反序列化机制
性能差,存在安全问题,不支持跨语言调用,这里不予考虑
Kryo
这里我们使用Kryo作为RPC框架的序列化机制
Socket(套接字)网络通信实战
套接字是IP地址和网络端口的组合(今年计网课给老师叫起来回答过这个问题)
使用netty代替
sendMessage()方法分析:
1.首先初始化了一个Bootstrap
2.通过Bootstrap对象连接服务端
3.通过Channel向服务端发送消息RpcRequest
4.发送成功后,阻塞等待,直到Channel关闭
5.拿到服务端返回的结果RpcResponse
静态代理和动态代理实现
JDK 动态代理类使用步骤
1 定义一个接口及其实现类;
2 自定义 InvocationHandler 并重写invoke方法,在 invoke 方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑;
3 通过 Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 方法创建代理对象;
但是Java自带的动态代理只能代理实现了接口的类
因此我们采用CGLIB实现动态代理
CGLIB 动态代理类使用步骤
1 定义一个类;
2 自定义 MethodInterceptor 并重写 intercept 方法,intercept 用于拦截增强被代理类的方法,和 JDK 动态代理中的 invoke 方法类似;
3 通过 Enhancer 类的 create()创建代理类;
JDK 动态代理和 CGLIB 动态代理对比
1 JDK 动态代理只能只能代理实现了接口的类,而 CGLIB 可以代理未实现任何接口的类。 另外, CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用,因此不能代理声明为 final 类型的类和方法。
2 就二者的效率来说,大部分情况都是 JDK 动态代理更优秀,随着 JDK 版本的升级,这个优势更加明显