rpc服务器不可用(rpc服务器不可用)

1.RPC是什么?RPC是远程过程调用,是解决服务间协作和传递消息的技术方案。2.RPC通信过程RPC分为服务提供者和服务调用者。服务提供商和服务消息提供商之间

1.RPC是什么?

rpc服务器不可用(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

发表回复

登录后才能评论