netty连接nbiot_RPC 实战与原理 精简版

什么是 RPC?

Remote Procedure Call,远程过程调用。

RPC 有什么作用?屏蔽远程调用、本地调用的区别

隐藏底层网络通信的复杂性,让我们更专注于业务

RPC 步骤

netty连接nbiot_RPC 实战与原理 精简版_第1张图片

为什么需要序列化?网络传输必须是「二进制」,调用方的参数都是对象

请求↔二进制消息体

零拷贝

什么是零拷贝?

netty连接nbiot_RPC 实战与原理 精简版_第2张图片

为什么需要零拷贝?

网卡等操作,只能通过内核操作,应用程序要发送网络数据,需要将数据复制到内核。

如何实现零拷贝?

虚拟内存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 感知刷新本地的「服务节点列表」

netty连接nbiot_RPC 实战与原理 精简版_第3张图片

实现:注册中心 API

服务健康状态监测:ZooKeeper 的会话超时控制机制

服务状态变更通知:ZooKeeper 的 Watcher 机制

如何实现 RPC 远程调用?客户端、服务端如何建立网络连接:HTTP、Socket

服务端如何处理请求:NIO(使用 Netty)

数据传输采用什么协议

数据如何序列化、反序列化:JSON,PB,Thrift

如何追踪微服务?

核心理念:调用链,全局唯一的 ID 将同一请求串联起来,从而还原调用关系,统计系统指标。

netty连接nbiot_RPC 实战与原理 精简版_第4张图片

注册中心选型高可用集群部署:多个实例

多机房部署:一个机房断电等不可抗因素

数据一致性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 微服务架构

netty连接nbiot_RPC 实战与原理 精简版_第5张图片

代码、思维导图笔记链接

代码和思维导图在 GitHub 项目中,欢迎大家 star!

coding 笔记、点滴记录,以后的文章也会同步到公众号(Coding Insight)中,希望大家关注_

netty连接nbiot_RPC 实战与原理 精简版_第6张图片

你可能感兴趣的:(netty连接nbiot)