《rpc实战与核心原理》学习笔记day7

技术修行者 技术修行者     2023-01-24     179

关键词:

这篇文章主要关注服务发现,会讨论基于DNS、VIP、ZooKeeper以及消息总线的服务发现机制,研究出在服务发现需要AP还是CP。

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. 采取推拉模式,消费者可以及时地拿到服务实例增量变化情况,并和内存中的混存数据进行合并。

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

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

tomcat核心原理--学习笔记(代码片段)

1.Http服务器与Tomcat(1)Http服务器的请求处理过程(2)Tomcat中Http服务器的请求处理方式Servlet接口Servlet容器的作用tomcat容器创建servlet实例的过程2.Tomcat的整体架构(1)Tomcat的连接器--Coyote连接器的作用Coyote(连接器)与Catalina(容器)Request与Re... 查看详情

学习笔记kafka——kafka与spark集成——原理介绍与开发环境配置实战(代码片段)

一、环境1.1、Hadoop环境1.2、Spark环境1.3、SparkStreaming1.4、AddMavenDependencies&开发流程AddScalaFrameworkSupport添加依赖(在pom.xml添加)<dependency><groupId>org.apache.spark</groupId>< 查看详情

学习笔记kafka——kafka与spark集成——原理介绍与开发环境配置实战(代码片段)

一、环境1.1、Hadoop环境1.2、Spark环境1.3、SparkStreaming1.4、AddMavenDependencies&开发流程AddScalaFrameworkSupport添加依赖(在pom.xml添加)<dependency><groupId>org.apache.spark</groupId>< 查看详情

学习笔记kafka——kafka与spark集成——原理介绍与开发环境配置实战(代码片段)

一、环境1.1、Hadoop环境1.2、Spark环境1.3、SparkStreaming1.4、AddMavenDependencies&开发流程AddScalaFrameworkSupport添加依赖(在pom.xml添加)<dependency><groupId>org.apache.spark</groupId>< 查看详情

阅读书单2020

JAVA并发编程实战BrianGoetz深入理解kafka:核心设计与实践原理Maven实战Grale实战Spring实战(第四版)Spring源码深度解析(第2版)从Paxos到ZooKeeper分布式一致性原理实战MySQL技术内幕InnoDB存储引擎第2版MyBatis从入门到精通MongoDB实战(第... 查看详情

学习笔记8:《大型网站技术架构核心原理与案例分析》之固若金汤:网站的安全架构

一、网站攻击与防御攻击:1、XSS攻击:危险字符转义,HttpOnly2、注入攻击:参数绑定3、CSRF(跨站点请求伪造):Token,验证码,RefererCheck4、其他漏洞攻击ErrorCodeHTML注释文件上传路径遍历防御:1、Web应用防火墙:ModSecurity2、网... 查看详情

redis核心技术与实战:学习总结目录

本文是我学习极客时间《Redis核心技术与实战》的学习总结,涵盖了数据结构与基础使用、高可靠性与高性能、使用规范等几个主要的主题,助你构建Redis的知识体系。本文是我学习极客时间《Redis核心技术与实战》的学习总结,... 查看详情

《深入浅出mybatis技术原理与实战》读书笔记-mybatis入门与配置(代码片段)

MyBatis入门与配置MyBatis:一个半自动映射的框架,之所以称它为半自动,是因为它需要手工匹配提供POJO,SQL和映射关系。1.MyBatis的基本构成MyBatis的核心组件:SqlSessionFactoryBuilder(构造器):它会根... 查看详情

as开发实战第二章学习笔记——其他

第二章学习笔记(1.19-1.22)像素Android支持的像素单位主要有px(像素)、in(英寸)、mm(毫米)、pt(磅,1/72英寸)、dp(与设备无关的显示单位)、dip(就是dp)、sp(用于设置字体大小),常用的是px、dp、sp三种。dp与物理设备无... 查看详情

学习笔记kafka——kafka与spark集成——原理介绍与开发环境配置实战(代码片段)

一、环境1.1、Hadoop环境1.2、Spark环境1.3、SparkStreaming1.4、AddMavenDependencies&开发流程AddScalaFrameworkSupport添加依赖(在pom.xml添加)<dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId><v... 查看详情

学习笔记5:《大型网站技术架构核心原理与案例分析》之瞬时响应:网站的高性能架构

网站性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。不同的人员会有不同的衡量标准:用户,开发人员,运维人员。一、性能测试指标1、响应时间指应用执行一个操作所需要的时间,包括从发出请求... 查看详情

service学习笔记02-实战startservice与bindservice(代码片段)

...言Service学习笔记01-启动方式与生命周期Service学习笔记02-实战startService与bindServiceService学习笔记03-前台服务实战Service学习笔记04-其他服务实现方式与替代方式1.启动服务的两种方式区别启动Service的两种方式是startService和bindService,... 查看详情

微服务学习rpc原理与gorpc(代码片段)

本文介绍了RPC的概念以及Go语言中标准库rpc的基本使用。什么是RPCRPC(RemoteProcedureCall),即远程过程调用。它允许像调用本地服务一样调用远程服务。RPC是一种服务器-客户端(Client/Server)模式,经典实现... 查看详情

学习笔记6:《大型网站技术架构核心原理与案例分析》之万无一失:网站的高可用架构

一、网站可用性度量1、网站不可用性度量:网站不可用也称为网站故障,业界常用多少个9来衡量网站的可用性。2、网站可用性考核二、高可用性网站架构1、应用层      位于应用层的服务器通常为了应对... 查看详情

flink内核原理学习组件通信rpc(代码片段)

Flink内核原理学习之RPC文章目录Flink内核原理学习之RPC一、Akka与Actor模型二、RPC消息类型三、Flink通信组件3.1RpcGateway3.2RpcEndpoint3.3RpcService与RpcServer3.4AkkaRpcActor四、PRC交互过程Java、大数据开发学习要点(持续更新中…)一、... 查看详情

kubernetes快速实战与核心原理剖析

K8S概览1.1K8S是什么?K8S官网文档:https://kubernetes.io/zh/docs/home/K8S是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。翻译成大白... 查看详情

kubernetes快速实战与核心原理剖析

K8S概览1.1K8S是什么?K8S官网文档:https://kubernetes.io/zh/docs/home/K8S是Kubernetes的全称,源于希腊语,意为“舵手”或“飞行员”,官方称其是:用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。翻译成大白... 查看详情

汇总:入门与实战

最新最全DiffusionModels论文、代码汇总1、DiffusionModels扩散模型与深度学习(数学原理和代码解读)这篇文章适合小白入门看,能快速了解diffusionmodels背后的物理背景、数学推导、核心思想、代码实现。2、击败GANs的新生成式模型&#... 查看详情