概述
什么是 RPC?
Remote Procedure Call,远程过程调用。
RPC 有什么作用?屏蔽远程调用、本地调用的区别
隐藏底层网络通信的复杂性,让我们更专注于业务
RPC 步骤
为什么需要序列化?网络传输必须是「二进制」,调用方的参数都是对象
请求↔二进制消息体
零拷贝
什么是零拷贝?
为什么需要零拷贝?
网卡等操作,只能通过内核操作,应用程序要发送网络数据,需要将数据复制到内核。
如何实现零拷贝?
虚拟内存mmap + write
sendfile
Netty 的零拷贝有何不同?一个请求,可能拆分成多个数据包
数据包的组合在用户空间,解决用户空间内存的拷贝处理问题,CompositeByteBuf
也包括用户空间、内核空间的数据拷贝:Direct Buffers
动态代理实现JDK:只能代理接口
Javassist:操作底层字节码,不需要反射,性能好
Byte Buddy:更容易的 API,速度比 Javassist 快,Spring、Jackson 使用
HTTP/2 特性多路复用,同一链路双向发送stream数据
Header 压缩
为什么需要服务发现?
公共的“通讯录”
为什么不用 DNS?DNS多级缓存,且缓存时间长
需要搭建负载均衡,额外成本
定时任务 & 时间轮
定时任务的问题?future 启动线程进行异步编程,sleep
如果5秒超时,高并发的
让CPU额外轮询遍历,浪费CPU
时间轮的应用延迟消息
订单过期(10分钟未付款,取消订单)
时钟轮本质
减少额外的扫描操作
时间轮在 RPC 的应用
调用端请求的超时处理,节省CPU
时间轮实现
Netty的 TimeWheel
如何注册和发现服务?RPC Server 提供服务,向 Registry 注册自身
RPC Client 调用服务,从 Registry 拉取服务列表
Server 节点变更时,同步变更,Client 感知刷新本地的「服务节点列表」
实现:注册中心 API
服务健康状态监测:ZooKeeper 的会话超时控制机制
服务状态变更通知:ZooKeeper 的 Watcher 机制
如何实现 RPC 远程调用?客户端、服务端如何建立网络连接:HTTP、Socket
服务端如何处理请求:NIO(使用 Netty)
数据传输采用什么协议
数据如何序列化、反序列化:JSON,PB,Thrift
如何追踪微服务?
核心理念:调用链,全局唯一的 ID 将同一请求串联起来,从而还原调用关系,统计系统指标。
注册中心选型高可用集群部署:多个实例
多机房部署:一个机房断电等不可抗因素
数据一致性CP 型:ZooKeeper(Redis),强一致性,机房间断网,注册中心不可用
AP 型:牺牲一致性,保证可用性。Eureka
开源 RPC 框架
限定语言Dubbo:Java,阿里
Motan:Java,微博
Tars:C++,腾讯(已支持多语言)
Spring Cloud:Java网关 Zuul
注册中心 Eureka
服务超时熔断 Hystrix
调用链监控 Sleuth
日志分析 ELK
跨语言 RPC 框架gRPC:HTTP/2
Thrift:TCP
Spring Cloud 微服务架构
代码、思维导图笔记链接
代码和思维导图在 GitHub 项目中,欢迎大家 star!
coding 笔记、点滴记录,以后的文章也会同步到公众号(Coding Insight)中,希望大家关注_
最后
以上就是冷傲万宝路为你收集整理的netty连接nbiot_RPC 实战与原理 精简版的全部内容,希望文章能够帮你解决netty连接nbiot_RPC 实战与原理 精简版所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复