RPC
文章平均质量分 57
介绍RPC相关知识
程序员面试那点事儿
互联网大厂校招、社招面试官,多年互联网大厂工作经验,分享校招、社招面试题、职场相关内容,互相交流经验
展开
-
学习导航
如何在线程兼容多种RPC协议原创 2021-01-06 21:46:09 · 68 阅读 · 0 评论 -
如何在线程兼容多种RPC协议
协议的作用就是用于分割二进制数据 流。每种协议约定的数据包格式是不一样的,而且每种协议开头都有一个协议编码,我们一 般叫做 magic number。当 RPC 收到了数据包后,我们可以先解析出 magic number ,找到对应协议的数据格式,然后用对应协议的数据格式去解析收到的二进制数据包。协议解析过程就是把一连串的二进制数据变成一个 RPC 内部对象,但这个对象一般是跟协 议相关的,所以为了能让 RPC 内部处理起来更加方便,我们一般都会把这个协议相关的对象转成一个跟协议无关的 RPC 对象。原创 2020-11-19 09:01:04 · 217 阅读 · 0 评论 -
泛化调用:如何在没有接口的情况下进行RPC调用
应用场景统一的测试平台让各个业务方在测试平台中通过输入接口、 分组名、方法名以及参数值,在线测试自己发布的 RPC 服务。轻量级的服务网关让各个业务方用HTTP的方式,通过服务网关调用其它服务如何做所谓的 RPC 调用,本质上就是调用端向服务端发送一条请求消息,服务端接收并处理,之 后向调用端发送一条响应消息,调用端处理完响应消息之后,一次 RPC 调用就完成了。只要调用端将服务端需要知道的信息,如接口名、业务分组名、方法名以及参数信息等封装成请求消息发送给服务端,服务端就能够解析并处理这条原创 2020-11-19 08:52:16 · 732 阅读 · 0 评论 -
分布式环境下如何快速定位问题
分布式环境定位问题存在哪些问题分布式服务中存在以下一条调用链当服务A出问题的时候,服务B、C、D都是可能导致问题的服务,不太好确定到底是哪一步引发的问题。通过跨部门日志人肉去追踪的话,需要所有的服务都加日志,比较慢。如何解决合理封装异常信息一款优秀的 RPC 框架要对异常进行详细地封装,分类,每类异常都要有明确的异常标识码,并整理成一份简明的文档。使用方可以快速地通过异常标 识码在文档中查阅,从而快速定位问题,找到原因;并且异常信息中要包含排查问题时所需 要的重要信息,比如服务接口名、服务分组原创 2020-11-18 08:59:11 · 1002 阅读 · 0 评论 -
流量回放:保证业务技术升级的神器
流量回放:将某个时间段的对A的所有请求,通过某种手段录制下来,然后在B应用上重新请求,这个过程为流量回放。流量回放可以做什么可以做真实数据的覆盖测试可以做流量压测RPC怎么做支持流量回放所有的请求都会经过RPC,所以在RPC中把请求参数录制下来,异步发送的一个固定的地方保存模拟应用调用方,把收到的请求重新发送一遍到要回归测试的应用里面。对比录制拿到的请求结果和新请求的结果,完成回放。...原创 2020-11-18 08:56:06 · 469 阅读 · 0 评论 -
时钟轮在RPC中的应用
文章目录定时任务的解决方案sleep轮询时钟轮RPC中时钟轮的应用注意定时任务的解决方案RPC中很多场景都会用到定时任务,比如调用端请求超时的处理逻辑,我们当时使用的是Future去实现调用,如下调用端在向服务器发送之前会创建一个Future,然后记录下这个Future创建时间和这个Future的超时时间,并有一个定时任务进行检测,当Future到达超时时间没有被处理时,执行超时逻辑。sleep每创建一个Future,就启动一个线程,之后sleep,到达超时时间就触发请求超时的处理逻辑。弊端是:原创 2020-11-18 08:46:04 · 458 阅读 · 0 评论 -
如何实现异步RPC,尽可能提高单机的吞吐量
单机吞吐量怎么提升RPC耗时大多都是在业务耗时,并非框架本身的处理的耗时,那么要提升吞吐量,最好的办法就是将业务处理异步化,异步策略调用端异步一次 RPC 调用的本质就是调用端向服务端发送一条请求消息,服务端收到消息后进行处理,处理之后响应给调用端一条响应消息,调用端收到响应消息之后再进行处理,最后将最终的返回值返回给动态代理。向服务端发送请求消息与接收服务端发送过来的响应消息,这两个处理过程是两个完全独立的过程,这两个过程甚至在大多数情况下都不在一个线程中进行,所以RPC框架内部实现都是异步的。原创 2020-11-17 10:05:05 · 540 阅读 · 0 评论 -
如何隔离流量
为什么要分组面对复杂的业务以及高并发场景时,我们还有别的手段,可以最大限度地保障业务无损,那就是隔离流量,避免某一单子服务把集群打挂导致其他服务也挂掉的问题。如何实现分组调用方应用服务发现的时候,除了带上对应的接口名,还需要带上一个特定分组名,所以对于调用方来说,它是拿不到其它分组的服务节点的,那这样的话调用方就没法建立起连接发请求了如何实现高可用把配置的分组区分下主次分组,只有在主分组上的节点都不可用的情况下才去选择次分组节点;只要主分组里面的节点恢复正常,我们就必须把流量都切换到主节点原创 2020-11-14 11:04:06 · 1061 阅读 · 0 评论 -
熔断限流
为什么需要自我保护因为高并发场景下,服务节点会因为访问量过大而引起耗时增加、CPU飘高,频繁Full GC等问题,为了保证服务的稳定性和高可用性,需要业务进行自我保护。如何自我保护服务端的自我保护服务端的负载高,采用方案通过不让它接收太多的请求就好了,等接收和处理的请求数量下来后,这个节点的负载压力自然就下来了。所以服务端的保护措施就是限流。限流是一个通用的功能,所以适合再RPC框架中集成,限流值可以让使用方配置,在访问量过大的时候,实施限流逻辑,抛回一个限流异常给调用端。限流逻辑计数器原创 2020-11-14 10:53:56 · 948 阅读 · 0 评论 -
关于RPC服务发现的那些事儿
为什么有服务发现高可用场景下,一般服务都是以集群模式对外提供服务,集群里的IP随时变化,调用方这个时候就需要一个服务方的服务节点的列表了。服务发现分为两个步骤:服务注册: 服务提供方启动的时候,将对外暴露的接口注册到注册中心之中,注册中心将这个服务节点的IP和端口保存下来。服务订阅:服务调用方启动的时候,去注册中心查找并订阅服务提供方的IP,然后缓存到本地,并用于后续的远程调用。服务发现方案DNS首先看下DNS的查询流程,如下:通过DNS拿到一个服务者提供的IP,建立长链接,存在什么原创 2020-11-13 21:48:55 · 201 阅读 · 0 评论 -
如何设计一个灵活的RPC框架
RPC本质把拦截到的方法参数,转成可以在网络中传输的二进制,并保证在服务端能正确的还原出语义,最终实现像调用本地服务一样调用远程服务。RPC基础架构原创 2020-11-13 21:48:29 · 163 阅读 · 0 评论 -
健康检测
因为服务方是集群模式对外提供服务,所以PRC会根据路由和负载均衡算法选择一个具体的IP地址,但是调用方和集群节点之间的网络状况是不确定的,所以如何保证选出来的节点可用,就成了大问题,最核心要解决的就是如何让调用方可以实时感知到节点的状态变化。一个服务,可以定位为三个状态:健康状态:建立连接成功,但是心跳请求也一直成功亚健康状态:建立连接成功,但是心跳请求连续失败死亡状态:建立连接失败健康监测它能帮助我们从连接列表里面过滤掉一些存在问题的节点,避免在发请求的时候选择出有问题的节点而影响业务。但原创 2020-11-13 21:47:34 · 219 阅读 · 0 评论 -
路由策略
真实环境中,服务方式是以集群方式提供服务的,为了减少上线新项目带来的风险,我们一般会选择灰度发布我们的应用实例,比如我们可以先发布少量实例观察是否有异常,后续再根据观察的情况,选择发布更多实例还是回滚已经上线的实例,但是对于一些基础服务来说,调用方还是挺多的,所以影响面也是很大的,所以我们的路由策略就出现了路由策略实现通过注册中心将过滤规则下发给调用方,调用方根据过滤规则,过滤出要请求的节点,比如IP地址同时也可以根据具体业务维度进行更细粒度的参数路由在 RPC 里面,不管是哪种路由策略,其核心思原创 2020-11-13 21:47:16 · 142 阅读 · 0 评论 -
异常重试
在约定时间内安全可靠地重试为什么需要异常重试因为网络会存在抖动情况,造成请求失败,这个时候就需要重新发起,但是在catch捕获异常中处理,不太优雅,所以考虑再RPC框架层面去做这件事情RPC框架重试机制即当调用端失败的时候,RPC框架可以自行进行重试,用户可以设置是否重试及重试次数。调用端在发起 RPC 调用时,会经过负载均衡,选择一个节点,之后它会向这个节点发送请求信息。当消息发送失败或收到异常消息时,我们就可以捕获异常,根据异常触发重试,重新通过负载均衡选择一个节点发送请求消息,并且记录请求的原创 2020-11-13 21:46:43 · 264 阅读 · 0 评论 -
优雅关闭
为什么要优雅关闭在重启服务的过程中,RPC 怎么做到让调用方 系统不出问题呢?上线大致流程如下:把请求发送到正在重启中的机器里面,从而导致调用方不能拿到正确的响应结果。重启过程中调用方会面临两种情况目标服务已经下线。对于调用方来说,跟目标节点的连接会断开,这时候调用方可以立马感知到,并且在其健康列表里面会把这个节点挪掉,自然也就不会被负载均衡选中。目标服务正在关闭。调用方并不知道它正在关闭,而且两者之间的连接也没断开,所以这个节点还会存在健康列表里面,因此该节点就有一定概率会被负载均衡选中。原创 2020-11-13 21:46:32 · 342 阅读 · 0 评论 -
优雅启动
启动预热让刚启动的服务提供方应用不承担全部的流量,而是让它被调用的次数随着时间的移动慢慢增加,最终让流量缓和地增加到跟已经运行一段时间后的水平一样。实现方案:在做负载均衡的时候,区分一下是否是刚启动不久的应用。区分是否是刚启动不久的应用,需要把启动的时间告诉注册中心或者以注册到注册中心的时间。通过IP列表里的启动时间,基于时间做相应的权重,最终达到设定的固定值。当大批量的重启服务提供方的时候,会不会导致没有重启的机器因为扛的流量太大出现问题?对于大批量重启的机器,权重都是一样的,不存在权重区分原创 2020-11-13 21:46:21 · 239 阅读 · 0 评论 -
动态代理,屏蔽RPC处理流程
通过采用动态代理技术,对字节码进行增强,在方法调用的时候进行拦截,以便在方法调用前后,增加额外处理逻辑。远程调用的内部逻辑使用RPC的时候,我们需要找提供方要接口,然后通过maven工作把接口依赖到我们的项目中,接口里是不包含真实的业务逻辑的,业务逻辑都在提供方的应用里。那么是如何通过调用接口方法,拿到了想要的结果呢?核心的技术是动态代理。当我们在项目中注入接口的时候,运行期实际绑定的是这个接口的代理类,调用过程中,是被代理类拦截到了,我们可以在代理类里加入远程调用逻辑。实现原理实现方法JDK原创 2020-08-17 11:37:45 · 225 阅读 · 0 评论 -
RPC框架在网络通信上更倾向于哪种IO模型
常见的网络模型阻塞IOIO多路复用什么是零拷贝Netty零拷贝原创 2020-08-17 10:16:38 · 295 阅读 · 0 评论 -
对象在网络中如何传输之序列化
为什么要序列化因为在网络中传输的数据只能是二进制。序列化就是将对象转换成二进制,反序列化就是讲二进制转化为对象的过程。常见的序列化JDK原生序列化方式JSONHessianProtobuf如何选择序列化方式RPC框架的性能和效率序列化协议的通用性和兼容性序列化协议的安全性RPC使用过程中注意哪些问题对象要尽量简单,没有太多的依赖关系入参和返回值体积不要太大尽量使用简单的、常用的原生对象。对象不要有复杂的继承关系。...原创 2020-08-16 14:34:27 · 1394 阅读 · 1 评论 -
如何设计可扩展的RPC协议
协议作用只有二进制才能在网络中进行传输,在RPC请求发送到网络之前,需要转化成二进制,然后写入本地Socket,然后通过网卡发送到网络设备中。对于RPC调用方来说,不会把所有二进制的数据整体一下子发送到服务端的机器上,中间会拆包或者并包。对于RPC服务方来说,从TCP通道里接收到的二进制数据,如何去识别具体的请求呢?类似于一个没有标点符号的文章,我们要想识别,就必须有标点,所以协议就是给我们断句提供依据。为什么不适用HTTP协议HTTP协议性能不高HTTP协议属于无状态协议设计协议原创 2020-08-16 10:10:05 · 605 阅读 · 0 评论 -
RPC概述及其通信流程
为什么要学习RPCRPC可以让我们调用远程服务像调用本地服务一样,RPC是微服务的基础,它是用来解决分布式系统通信的,涉及到网络通信就可以使用RPCRPC将网络通信的整个过程做了封装,使网络通信相关的开发逻辑变得简单。RPC的作用屏蔽远程调用和本地调用的差异隐藏底层网络通信的复杂性,更专注于业务逻辑。RPC通信流程首先RPC通信需要保证可靠性,一般采用TCP来传输。...原创 2020-08-14 17:52:18 · 741 阅读 · 0 评论