查看原文
其他

【193期】为什么要使用注册中心?是 Eureka 还是 Nacos?

Java精选 2022-08-09

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方有惊喜,留言必回,有问必答!

每天 08:15 更新文章,每天进步一点点...

为什么要使用注册中心

有使用过ip:port地址直接调用服务的开发经历么?该段痛苦的经历在此处省略500字......,该种方式的缺点:

  • 需要手动的维护所有的服务访问ip地址列表。
  • 单个服务实现负载均衡需要自己搭建,例如使用nginx负载均衡策略,或者基于容器化多实例部署单个服务,在实例之间做负载均衡。

使用注册中心能够实现服务治理,服务动态扩容,以及服务调用的负载均衡,完整调用链路示例如下:

  • 服务提供者:向注册中心根据服务名称提供服务访问的ip:port以及其他信息。
  • 注册中心:根据服务名称,存储对应的ip:port以及其他信息。
  • 服务消费者:根据服务名向注册中心获取调用服务的ip:port以及其他相关的信息集合,然后根据负载均衡策略获取最终的服务器ip:port访问地址。

使用springcloud时,常用的是eureka和nacos作为注册中心,如何选择呢?

Eureka注册中心

架构原理图如下:

服务提供者

主动向注册中心注册,续约,下线,获取注册表。服务注册成功后,定时向注册中心发送心跳,保证服务不被剔除。

推荐下自己做的 Spring Boot 的实战项目:

https://gitee.com/yoodb/jing-xuan

注册中心

存储服务实例,定时扫描注册表,剔除过期的服务实例。通过同步复制方式实现高可用,先获取注册表,然后再向其他注册中心注册自己,属于AP模式。在实际项目中,会根据环境,例如dev,test,prod配置不同的注册中心集群,如果不同的项目使用统一的注册中心,只能根据服务名称做区分。

重点介绍一下Eureka自我保护机制。如果出现大量的服务实例过期被剔除,则注册中心进入自我保护模式,注册表中信息不再被剔除,目的是提高eureka的可用性。默认情况下,统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。

讲述一次惨痛的上线经历,错误描述如下:

当时服务部署成功,在Eureka注册中心已经显示该服务已经注册成功,但是,前端请求经过网关再转发到该服务时,一直就没有反应,服务调用一直不成功。nginx转发,网关转发都在确认问题到底发生在哪里,几经折磨,在网关直接通过ip地址转发到上线的服务,快速的解决该问题。后续,复盘,应该Eureka的自我保护机制,导致的问题。在注册中心注册的服务是一个不可用的服务,但是,由于自我保护机制,Eureka Server没有将无效的服务剔除。

后续的解决方法是,设置enableSelfPreservation=false关闭自我保护机制,把renewalPercentThreshold 比例降低,在Eureka Server端,如果出现无效的服务就会将该服务剔除。

nacos注册中心

nacos是springcloud的扩展,注册中心功能通过NacosDiscoveryClient 继承DiscoveryClient,在springcloud中,与Eureka可以无侵入的切换。注册中心可以手动剔除服务实例,通过消息通知客户端更新缓存的实例信息,完整调用链路示例如下:

在spring cloud中引入nacos时,参考官网匹配具体的版本,如图:

nacos重点需要了解下其领域模型Nacos 数据模型 Key 由三元组唯一确定, Namespace命名空间,分组group,service服务。详情可以参考官网Nacos 架构。

推荐下自己做的 Spring Cloud 的实战项目:

https://gitee.com/yoodb/jingxuan-springcloud

nacos与Eureka相比优势如下:

  • nacos在自动或手动下线服务,使用消息机制通知客户端,服务实例的修改很快响应;Eureka只能通过任务定时剔除无效的服务。
  • nacos可以根据namespace命名空间,DataId,Group分组,来区分不同环境(dev,test,prod),不同项目的配置。

作者:VectorJin

https://juejin.cn/post/6844903473482317837

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!
------ THE END ------

精品资料,超赞福利!


3000+ 道面试题在线刷,最新、最全 Java 面试题!

期往精选  点击标题可跳转

【185期】RocketMQ 主机磁盘空间有限,如何无限期延长消息存储?

【186期】面试官问:OAuth2 vs JWT,到底怎么选择?

【187期】Java 中的 BigDecimal 运算,如何解决精度丢失问题?

【188期】面试官问:如何防止你的 jar 包被反编译?

【189期】利用 Fastjson 注入 Spring MVC 内存马,太秀了~!

【190期】对 volatile 的理解—从 JMM 以及单例模式剖析

【191期】Redis 延时任务详细解读,高手养成篇

【192期】面试官问:说说 Tomcat 组成与工作原理?

技术交流群!

最近有很多人问,有没有读者&异性交流群,你懂的!想知道如何加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群”,即可免费加入交流群!

文章有帮助的话,在看,转发吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存