1 RPC 的通信原理以及 RPC 里各个功能组件的作用
其实 RPC 就是把拦截到的方法参数,转成可以在网络中传输的二进制,并保证在服务提供方能正确地还原出语义,最终实现像调用本地一样地调用远程的目的。
2 怎么设计一个灵活的 RPC 框架?
就是怎么在 RPC 框架中应用插件,用插件方式构造一个基于微内核的 RPC 框架,其关键点就是“插件化”
3 服务发现
服务发现的作用就是实时感知集群 IP 的变化,实现接口跟服务集群节点 IP 的映射。在超大规模集群实战中,我们更多需要考虑的是保证最终一致性。其实总结来说,就一关键词,“推拉结合,以拉为准”
4 健康检测
帮助调用方应用来管理所有服务提供方的连接,并动态维护每个连接的状态,方便服务调用方在每次发起请求的时候都可以拿到一个可用的连接。
5 异常重试
异常重试就是为了尽最大可能保证接口可用率的一种手段,但这种策略只能用在幂等接口上,否则就会因为重试导致应用系统数据“写花”
6 优雅停机
为了让服务提供方在停机应用的时候,保证所有调用方都能“安全”地切走流量,不再调用自己,从而做到对业务无损。其中实现的关键点就在于,让正在停机的服务提供方应用有一个状态,让调用方感知到服务提供方正在停机。
7 优雅启动
重点就是启动预热与延迟暴露
8 熔断限流
熔断是调用方为了避免在调用过程中,服务提供方出现问题的时候,自身资源被耗尽的一种保护行为;
限流是服务提供方为防止自己被突发流量打垮的一种保护行为。
9 如何提升单机资源的利用率
关键点就一个,那就是“异步化”。调用方利用异步化机制实现并行调用多个服务,以缩短整个调用时间;而服务提供方则可以利用异步化把业务逻辑放到自定义线程池里面去执行,以提升单机的 OPS。
10 安全体系
关键点就是“鉴权”,我们可以通过统一的鉴权服务动态生成秘钥,提高 RPC 调用的安全性。
11 分布式环境下如何快速定位问题
在分布式环境下,RPC 框架自身以及服务提供方的业务逻辑实现,都应该对异常进行合理地封装,让使用方可以根据异常快速地定位问题;在依赖关系复杂且涉及多个部门合作的分布式系统中,可以借助分布式链路跟踪系统,快速定位问题。
12 时钟轮在 RPC 中的应用
核心原理就一个关键字“分而治之”,我们可以把它用在任何需要高效处理大量定时任务的场景中,最具有代表性的就是在高并发场景下的请求超时检测。
13 流量回放
应用在引入 RPC后,所有的请求都会被 RPC 接管,而我们在 RPC 里面引入回放的原因也很简单,就是想通过线上流量来验证改造后应用的正确性,而线上流量相比手动维护 TestCase 的场景更丰富,所以用线上流量进行测试的覆盖率会更广。
14 如何在没有接口的情况下完成 RPC 调用
其关键在于要理解接口定义在 RPC 里面的作用。除了动态代理生成的过程中需要用到接口定义,剩余的其它过程中接口的定义只是被当作元数据来使用,而动态代理在 RPC 中并不是一个必须的环节,所以在没有接口定义的情况下我们同样也是可以完成 RPC调用的,只要把这些元数据发送过去即可。
15 在线上环境里兼容多种 RPC 协议
目的就是为了能够平滑地升级线上环境中已经存在的 RPC 框架,同时我们也可以利用多协议的特点来支持不同的使用场景。