1.RPC是什么?RPC是远程过程调用,是解决服务间协作和传递消息的技术方案。2.RPC通信过程RPC分为服务提供者和服务调用者。服务提供商和服务消息提供商之间
1.RPC是什么?
RPC是远程过程调用,是解决服务间协作和传递消息的技术方案。
2.RPC通信过程
RPC分为服务提供者和服务调用者。服务提供商和服务消息提供商之间传输的信息需要通过网络传输。网络中传输信息是二进制的,
所以我们需要在服务提供者中将java对象转换成二进制文件,然后通过网络传输给服务提供者,服务提供者将二进制文件转换成java对象进行数据处理。
把这个java对象变成二进制的过程叫做序列化,把二进制变成java对象的过程叫做反序列化。
3.远程过程控制中的网络通信技术
服务调用者和服务提供者之间将建立一个长连接,在java中处理长连接的更好的方法是使用NIO多路复用。java原生的NIO的API不是很友好,所以大部分RPC都是netty实现的。Netty是nio的封装。
服务之间传输的二进制文件可能不会一次传输,需要多次接收再拼接。
这个过程在应用的内存空中进行,可能会引起数据移动、复制等很多操作。并且浪费服务器资源。所以netty用了零拷贝技术。
4.RPC中的动态代理
当我们使用RPC的时候,会发现它的使用方式和通用接口一样,因为是和spring合作的。就是注入一个接口bean,然后直接调用方法。
这背后的原理是动态代理。RPC会自动为接口生成一个代理类,这个接口生成的代理类实际上是在项目运行过程中绑定的。
这样,当调用接口方法时,它实际上会被拦截。这样,您可以向生成的代理类添加远程调用逻辑。
5.RPC使用的服务发现
1)注册中心的作用
的服务调用方和服务提供方可能不在同一台计算机上,或者一个服务调用方可能调用多个服务提供方。服务调用者如何获得服务提供者的地址来发起调用?这时候就需要一个注册中心了。
注册:服务提供者启动时,在注册中心注册暴露的接口,注册中心会保存这个服务节点的IP和接口。
订阅:当服务调用方启动时,去注册中心查找并订阅提供方的IP,然后在本地缓存,用于后续的远程调用。
2)注册中心选择
Zookeeper作为注册中心被广泛使用,很多zk+dubbo公司都在使用。
zk搭建的注册表集群是比较强的,就是CP。如果主节点出现问题,集群会重新选举一个主节点,在此期间集群无法使用。无法接受请求。
Zookeeper不仅可以作为注册中心,也可以作为配置中心。
Zookeeper也可以实现分布式锁。
Zookeeper也是hadoop生态系统的重要成员。
Eureka也是一种选择,它是终极单向集群(AP)。它是用java语言编写的。分为服务器端和客户端,具有自我保护功能。如果在短时间内,发现很多节点无法检查自己的心跳,他会怀疑是网络问题,不会在注册中心删除已注册的服务。
服务的调用方可以正常调用。
现在第二种方法比较流行,用最后的一致性作为注册表。
6.RPC运行状况检查
这里的健康检查指的是心跳机制。RPC的服务调用者和服务提供者会建议一个长连接,调用者会定期向提供者发送请求,检查提供者的状态。
调用者会计算一个可用率,当可用率低于某个值时,它会在自己的内存中将这个服务提供者的地址标记为不可用。
打电话的人会偶尔查一下这个地址。如果可用率达标,则调整为正常状态,否则进入死状态。
可用率计算为特定时间窗口内成功接口调用的百分比(成功次数/总调用数)。
7.RPC中的负载平衡
RPC中的负载平衡放在调用者身上。每次发起RPC调用,服务调用者都会独立选择一个服务节点,通过配置好的负载均衡插件发起RPC调用。
RPC调用者会有一个评分机制,通过心跳机制获取调用者系统的基本信息。如负载指数、CPU核心数、内存大小、请求处理时间、节点健康状态等。
根据这些信息,可以判断和选择呼叫者。它也可以是百分比值。如果分数高,会分配更多的流量;如果分数低,将分发较少的流量。也可以简单的随机循环。
8.RPC中的异常重试
RPC的异常重试功能仍然在调用者中实现,用户可以设置是否启动重试以及重试次数。
9.RPC关闭服务
当RPC关闭服务时,不能直接强制关闭,因为如果有未完成的请求需要处理,它不能同时接受新的请求。Runtime.addShutdownHook方法。
RPC会捕捉特定的异常,比如网络超时异常,网络连接异常等等。您必须捕获这个异常并再次调用请求。当然,服务提供者的接口必须是幂等的,否则会造成脏数据。
RPC中还有请求超时的概念。如果服务提供者的接口性能特别慢,可以受到影响,但是RPC的调用者不会等待而是直接返回一个请求超时的异常。
如果我们将请求超时设置为5s,请求重试次数为3次,每次持续两秒,是否会造成请求超时?虽然第三次可以正常返回结果,但是服务调用方还是会返回超时异常。
为了解决这个问题,我们可以在每次重试时将这个请求的时间重置为0。也就是说,请求超时是以请求成功一次的时间来计算的,而不是所有请求重试的时间。
10.RPC启动过程
有个概念叫启动预热:简单来说就是减少服务者刚启动的过程,调用次数会随着时间的增加逐渐增加到正常值。
RPC调用者可以通过注册中心获取服务提供者的注册时间,然后根据这个启动时间计算一个权重。刚开始的时候,流量很低。这种实现可以添加到负载平衡中。也可以独立。
如果rpc配合spring使用,可能会发现启动速度会慢一点。如果此时首先启动RPC,该信息将被注册到注册中心,并会收到一个请求。
其实这个时候spring还没有完成启动,需要延迟曝光。只有当服务完成启动时,信息才会注册到注册表中。
我们可以在服务提供者应用启动之后,在注册表中注册接口之前,预留一个钩子进程,这样用户就可以实现可扩展的钩子逻辑。用户可以在Hook中模拟调用逻辑,以便使用jvm指令预热。
而enabling可以提前在Hook中预加载一些资源。只有在所有资源都被加载后,接口才最终在注册表中注册。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/123703.html