《RPC实战与核心原理》学习笔记Day7

08 | 服务发现:到底是要CP还是AP?

我们为什么需要“服务发现”?

从高可用的角度出发,在生产环境中,服务提供方通常会以集群的方式对外提供服务,集群中的IP地址随时可能发生变化,因此我们需要一本“通讯录”来及时获取对应的服务节点信息,维护“通讯录”以及或者节点信息的过程,我们称之为“服务发现”。

服务发现包括2个核心模块:

  • 服务注册:在服务提供方启动的时候,将对外暴露的接口注册到注册中心中,注册中心将这个服务节点的IP和接口保存下来。
  • 服务订阅:在服务调用方启动的时候,去注册中心查找并订阅服务提供方的IP,然后缓存到本地,并用于后续远程调用。

我们为什么不采用基于DNS的服务发现机制?

我们来看一下DNS查询流程。
在这里插入图片描述
它存在的两个主要问题:

  1. 如果服务节点的IP端口下线了,服务调用者能否及时摘除服务节点?
  2. 如果之前已经上线了一部分服务节点,这时突然对这个服务进行扩容,那么新上线的服务节点能否及时接收到流程呢?

为什么VIP方案也不能用于服务发现?

VIP方案如下所示。
在这里插入图片描述
它主要有以下几个问题:

  1. 搭建负载均衡设备或者TCP/IP四层代理,需要额外成本。
  2. 请求流程都经过负载均衡设备,多经过一次网络传输,会额外浪费性能。
  3. 负载均衡添加节点和摘除节点,一般都需要手动添加,当大批量扩容和下线时,会有大量的人工操作和生效延迟。
  4. 不能支持更灵活的负载均衡策略。

基于ZooKeeper的服务发现机制的工作流程是怎样的?

基于ZooKeeper的服务发现结构图如下。
在这里插入图片描述
它的工作流程如下:

  1. 服务平台管理端现在ZooKeeper中创建一个服务根路径,在这个路径下面再创建服务提供方目录和服务调用方目录。
  2. 当服务提供方发起注册时,会在服务提供方目录中创建一个临时节点,节点中存储该服务提供方的注册信息。
  3. 当服务调用方发起注册时,会在服务提供方目录中创建一个临时节点,节点中存储该服务提供方的注册信息。
  4. 当服务提供方目录下有节点数据发生变更时,ZooKeeper就会通知给发起订阅的服务调用方。

基于ZooKeeper的服务发现有什么问题?

当有超大批量的服务节点在同时发起注册操作,ZooKeeper集群的CPU使用率会飙升,导致ZooKeeper集群无法工作。

这本身就是ZooKeeper的性能问题,当连接到ZooKeeper的节点数量特别多,对ZooKeeper的读写操作会特别频繁,而且当ZooKeeper存储的目录达到一定数量时,ZooKeeper就会变得不稳定,CPU使用率持续升高,直到宕机。

ZooKeeper的一大特点就是强一致性,集群中的每个节点的数据每次发生变更操作时,都会通知其他节点同时执行跟新,这样它就要求每个节点的数据能够实时的完全一致,从而导致了ZooKeeper集群性能的下降。

基于消息总线的服务发现机制的工作流程是怎样的?

基于消息总线的服务发现流程图如下:
在这里插入图片描述
它的工作流程如下:

  1. 当有服务上线,注册中心节点收到注册请求,服务列表数据发生变化,会生成一个消息,推送给消息总线,每个消息都有一个整体递增版本。
  2. 消息总线会主动推送消息到各个注册中心,同时注册中心也会定期拉取消息。对于获取到消息的在消息回放模块里面回放只接受大于本地版本号的消息,小于本地版本号的消息直接丢弃,从而实现最终一致性。
  3. 消费者定于可以从注册中心内存拿到指定接口的全部服务实例,并缓存到消费者的内存中。
  4. 采取推拉模式,消费者可以及时地拿到服务实例增量变化情况,并和内存中的混存数据进行合并。

通过消息总线的方式,我们就可以完成注册中心集群间数据变更的通知,保证数据的最终一致性,并能及时地触发注册中心的服务下发操作。

服务发现的特性是允许我们在设计超大规模集群服务发现系统的时候,舍弃一致性,更多的考虑系统的健壮性,因此,在实际工作中,最终一致性是更为常用的策略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty是一个基于NIO的高性能网络通信框架,它的核心原理是通过事件驱动和异步处理机制来实现高效的网络传输。其特点是可扩展、可重用、易于维护、性能卓越。 RPC(Remote Procedure Call)是一种基于网络通信的分布式计算模型,通过这种模型,客户端调用服务端的远程方法就像调用本地方法一样简单。在RPC实践过程中,使用Netty框架可以有效提升RPC的性能和稳定性。 Netty的核心原理是基于事件驱动的模型,它的主要组成部分包括NioEventLoop、Channel、Buffer、Codec等。NioEventLoop是Netty中的核心组件之一,它是一个事件循环线程,通过不断遍历注册在它上面的Channel监听器,来处理网络传输过程中的事件,从而实现网络的异步非阻塞传输。 在RPC实践中,Netty通过对协议进行编解码,来实现远程方法的调用和响应过程。通常情况下,客户端与服务端之间需要使用一种协议来进行通信,需要对协议进行编解码处理,这个过程需要在客户端和服务端都实现一遍,使用Netty框架可以简化这个过程,使得开发人员只需要实现协议的编解码策略即可。 总之,Netty作为高性能网络通信框架,其核心原理是基于事件驱动的机制实现的。在RPC实践中,Netty可以高效地实现协议的编解码,提升RPC的性能和稳定性,因此在分布式计算中得到了广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值