🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
**为什么要使用注册中心** 有使用过 ip:port 地址直接调用服务的开发经历么?该段痛苦的经历在此处省略 500 字……,该种方式的缺点: 1. 需要手动的维护所有的服务访问 ip 地址列表。 1. 单个服务实现负载均衡需要自己搭建,例如使用 nginx 负载均衡策略,或者基于容器化多实例部署单个服务,在实例之间做负载均衡。 1. 服务提供者:向注册中心根据服务名称提供服务访问的 ip:port 以及其他信息。 1. 注册中心:根据服务名称,存储对应的 ip:port 以及其他信息。 1. 服务消费者:根据服务名向注册中心获取调用服务的 ip:port 以及其他相关的信息集合,然后根据负载均衡策略获取最终的服务器 ip:port 访问地址。 **使用 springcloud 时,常用的是 eureka 和 nacos 作为注册中心,如何选择呢 ?** **服务提供者** 主动向注册中心注册,续约,下线,获取注册表。服务注册成功后,定时向注册中心发送心跳,保证服务不被剔除。 **注册中心** 存储服务实例,定时扫描注册表,剔除过期的服务实例。通过同步复制方式实现高可用,先获取注册表,然后再向其他注册中心注册自己,属于 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 可以无侵入的切换。注册中心可以手动剔除服务实例,通过消息通知客户端更新缓存的实例信息 **nacos 重点需要了解下其领域模型 Nacos 数据模型 Key 由三元组唯一确定,Namespace 命名空间,分组 group,service 服务。详情可以参考官网 Nacos 架构。** nacos 与 Eureka 相比优势如下: 1. nacos 在自动或手动下线服务,使用消息机制通知客户端,服务实例的修改很快响应;Eureka 只能通过任务定时剔除无效的服务。 2. nacos 可以根据 namespace 命名空间,DataId,Group 分组,来区分不同环境(dev,test,prod),不同项目的配置。 ———————————————— 原文作者:FH-Admin 转自链接:https://learnku.com/articles/63672 版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。