失效链接处理 |
high_performance_rpc_with_netty PDF 下载
本站整理下载:
相关截图:
主要内容:
什么是Netty? 能做什么? Netty是⼀个致⼒于创建⾼性能⽹络应⽤程序的成熟的IO框架 相⽐较与直接使⽤底层的Java IO API, 你不需要先成为⽹络专家就可以基于Netty去构建复杂的⽹络 应⽤业界常⻅的涉及到⽹络通信的相关中间件⼤部分基于Netty实现⽹络层 设计⼀个分布式服务框架 Architecture 2 |
远程调⽤的流程 启动服务端(服务提供者)并发布服务到注册中⼼ 启动客户端(服务消费者)并去注册中⼼订阅感兴趣的服务 客户端收到注册中⼼推送的服务地址列表 调⽤者发起调⽤, Proxy从服务地址列表中选择⼀个地址并将请求信息<group, providerName, version>, methodName, args[]等信息序列化为字节数组并通过⽹络发送到该地址上 服务端收到收到并反序列化请求信息, 根据<group, providerName, version>从本地服务字典⾥ 查找到对应providerObject, 再根据<methodName, args[]>通过反射调⽤指定⽅法, 并将⽅法 返回值序列化为字节数组返回给客户端 客户端收到响应信息再反序列化为Java对象后由Proxy返回给⽅法调⽤者 以上流程对⽅法调⽤者是透明的, ⼀切看起来就像本地调⽤⼀样 重要概念: RPC三元组 <ID, Request, Response> 远程调⽤客户端图解 3 |
若是netty4.x的线程模型, IO Thread(worker) —> Map<InvokeId, Future>代替全局Map能更好的 避免线程竞争 远程调⽤服务端图解 重要概念: RPC三元组 <ID, Request, Response> 远程调⽤传输层图解 4 |
左图为客户端, 右图为服务端 设计传输层协议栈 协议头 协议体 metadata: <group, providerName, version> methodName parameterTypes[] 真的需要? 有什么问题? a. 反序列化时ClassLoader.loadClass()潜在锁竞争 5 |
b. 协议体码流⼤⼩ c. 泛化调⽤多了参数类型 能解决吗? Java⽅法静态分派规则参考JLS <Java语⾔规范> $15.12.2.5 Choosing the Most Specific Method 章节 args[] 其他: traceId, appName… ⼀些Features&好的实践&压榨性能 创建客户端代理对象 Proxy做什么? 集群容错 —> 负载均衡 —> ⽹络 有哪些创建Proxy的⽅式? jdk proxy/javassist/cglib/asm/bytebuddy 要注意的: 注意拦截toString, equals, hashCode等⽅法避免远程调⽤
|