1、RPC的做用算法
2、完整的RPC涉及到的核心点 后端
编解码、序列化和反序列、请求协议、桩生成(动态代理、反射执行)。缓存
3、RPC使用过程须要注意什么问题安全
4、RPC协议微信
在传输过程当中,RPC并不会把请求参数的全部二进制数据总体一会儿发送到对端机器上,中间可能会拆分红多个数据包,也有可能合并成其余请求的数据包。RPC协议就是为了"正确进行装包和拆包"而生的,好比使用长度限制或者标识设定边界。网络
其中,协议包括固定部分、协议头内容和协议体内容,固定部分常包括协议长度、协议标识、序列化方式、业务消息ID、消息类型,协议头内容用来进行扩展的,保证协议可平滑升级,协议体一般包括请求接口方法、请求的业务参数值和业务扩展属性。其中,协议头内容单独定义出来,是为了不将其信息放到协议体中,致使协议体负载过重。架构
5、序列化和反序列化须要注意什么负载均衡
编解码组件应该考虑安全性、版本升级的兼容性、跨语言支持性、存储空间占用、网络传输效率、可读性。框架
复杂的接口定义可能会致使序列化异常,为了减小发生的几率,应该尽可能使用原生类型,还有不要使用过深的继承关系或者依赖关系,最后是避免序列化对象过大。运维
6、动态代理
RPC自动给接口生成一个代理类,咱们在项目中注入接口后,运行时实际绑定的是这个代理类。
JDK默认的代理功能是有必定的局限性的,它要求被代理的类只能是接口。由于生成的代理类会继承Proxy类,但Java是不支持多重继承的。
7、如何设计灵活的RPC框架
将变化部分封装在插件里面,才能达到快速灵活扩展的目的,本质就是微内核架构,好比规则引擎架构。
微内核的核心技术点有插件管理、插件链接、插件通讯。插件管理也称为插件注册表,用来述插件模块信息、如何加载、加载时机等等;插件链接是指插件按照核心系统的规范实现后如何链接到系统上,好比使用依赖注入;插件通讯则是用来协调没有关联关系的插件,好比请求上下文Pipline。
8、服务注册选型
9、如何识别服务节点存活状况
服务方的状态一般有三种,分别为健康状态、亚健康状态、死亡状态,其中,亚健康状态下链接是成功的可是心跳请求连续失败。不过,心跳探测一般还会结合业务可用率来判断状态,这样能够及时发现心跳探测间歇性失败的问题。
具体的健康检查分类有静态方法和动态方法。
静态方法:基于服务消费者自己调用来判断服务节点是否可用,更加实时更加准确,并且当注册中心或者网络出现问题时,基本不受影响。这种方式使用更加广泛。
动态方法:服务提供者向注册中心上报心跳信息,而后更新注册列表并同步到服务消费者,同时结合心跳开关保护和服务节点摘取保护机制(好比控制比例)进行存活判断优化。
10、路由策略
路由策略就是服务提供者集群列表筛选规则,好比根据来源IP或者请求参数控制请求,经常使用于灰度发布的风险控制,还可用于同机房调用优先调度、读写分离、黑白名单控制。
11、异常重试
当业务具备幂等性保证时才能让RPC框架帮助咱们进行重试,一般借助路由策略实现,当链接异常或者业务白名单异常时就进行重试,从新选择一个新的服务节点进行调用,直到重试最大次数门槛,或者已经达到超时时间设定。
12、优雅关闭
服务对象在关闭过程当中,会拒绝新的请求,同时根据引用计数器等待正在处理的请求所有结束以后才会真正关闭。另外,为了不一直等待形成应用没法正常退出,还须要在整个ShutdownHook里面加上超时控制。
十3、优雅启动
优雅启动是指不要让应用刚启动成功就接收正常量级的请求,此时数据可能还未彻底准备好,容易形成请求超时。
常见的作法有启动预热和延迟暴露。启动预热的意思就是借助路由策略根据实例注册时间动态调整权重,刚启动的应用缓慢放大流量接收的占比。而延迟暴露则是应用启动完成后,先经过Hook钩子机制执行预热逻辑后再执行注册上报。
十4、服务依赖检查
启动时对引用的服务提供者进行存活检查,若是不存活快速失败,避免上线后才暴露问题。
十5、逻辑分组
稳定性保障中很重要的一点就是自适应保护,好比经过隔离失败保证提供给核心服务的接口可用,更具体的落地方案有路由分组,不一样级别的系统调用不一样的分组,从而达到隔离的目的。不过对于服务使用者来讲,可调用的列表减小了,这种状况下RPC框架最好提供主、备分组的逻辑,当主分组所有不可用后,再使用备分组。
十6、动态分组
使用逻辑分组进行流量隔离时,若是某些分组的服务使用方流量突增,提供方紧急扩容不现实,一来及时性差二来麻烦。针对这种状况,咱们能够经过注册中心的控制台动态修改已有分组配置,进行替换或者追加,曲线求国地增长了服务使用方的可以使用实例列表。
十7、异步调用
客户端调用服务端后直接返回的再也不是结果,而是CompletableFuture对象。当客户端收到服务端发送过来的响应以后,RPC框架自动地调用先前的CompletableFuture对象的complete方法,也就是将返回值注入到异步模型中,从而完成异步通知。
十8、RPC安全体系
RPC通讯通常为内网服务间通讯,因此它的安全问题能够简化为认证受权问题、伪造注册问题。针对前者,咱们能够经过受权平台管理调用方列表,调用方申请调用权限经过后生成与其标识相对应的令牌。而后每次调用都经过上下文隐式传递这些认证参数,提供方接着进行Hash校验,经过才放行。而针对伪造注册隐患的解决方案是不容许多个应用同时注册相同的服务。
十9、快速定位问题
RPC 框架自身以及服务提供方的业务逻辑实现,都应该对异常进行合理地封装,包装排查问题所须要的重要信息,好比接口签名信息、客户端和服务端的IP、异常信息。同时还要对各类异常作好分类标识,好比业务线程池耗尽,Netty链接异常,Netty数据传输异常,限流异常等等。若是想更加高效排查链路问题,就得处理好埋点和传递。
二10、定时处理
咱们能够利用时间轮机制优雅完成异步请求超时、启动超时、心跳探测等等功能。时间轮相似生活中的时钟,它只会轮循第一层时间槽的任务,当遍历完成后才将更高层的任务从新分布到第一层,而后从新遍历。这样遍历时就不会额外遍历其余暂时不会执行到的槽,避免浪费CPU能力。
二11、流量回放
开源界支持流量回放的软件有不少,好比TcpCopy,可是都须要运维手工操做。有了RPC框架后,操做姿式就不同了,RPC框架能够收集请求数据,而后假装成一个服务调用者,请求改造后须要回归验证或者促销时须要压促的服务提供者。
二12、泛化调用
在不一样开发语言场景中或者网关场景中,调用者没法解析服务提供者的接口私服JAR包信息,那此时调用就须要RPC框架进行兼容。调用者只须要指定接口、方法、参数类型、参数值,就能够完成一次调用,这种调用方式称为Generic泛化调用。