为什么要用注册中心你是否有过使用ip:端口地址直接调用服务开发的经历?这段惨痛经历这里省略500字……,这种方式的缺点:需要手动维护一个所有服务访问ip地址的列表。单体服务实现负载均衡,需要自己构建,比如使用nginx负载均衡策略,或者基于容器化多实例部署单体服务,在实例间做负载均衡。使用注册中心可以实现服务治理、服务动态扩展、服务调用的负载均衡。完整的调用链接示例如下:服务提供者:根据服务名称向注册中心提供服务访问的ip:port等信息。注册中心:根据服务名称,存储对应的ip:port等信息。服务消费者:根据服务名称从注册中心获取调用服务的ip:port等相关信息集合,再根据负载均衡策略获取最终服务器ip:port访问地址。使用springcloud时,常用eureka和nacos作为注册中心。如何选择?推荐一个SpringBoot基础教程和实例:https://github.com/javastacks...Eureka注册中心架构示意图如下:服务商主动向注册中心注册,续约,去离线,并获取注册表。服务注册成功后,定时向注册中心发送心跳,保证服务不会被移除。注册中心存储服务实例,定期扫描注册中心,移除过期的服务实例。通过同步复制实现高可用,首先获取注册中心,然后将自己注册到其他注册中心,属于AP模式。在实际项目中,会根据环境配置不同的registry集群,如dev、test、prod。不同的项目如果使用统一的注册中心,只能通过服务名来区分。重点介绍Eureka自我保护机制。如果大量服务实例过期被删除,注册中心将进入自我保护模式,注册中心的信息将不再被删除,以提高eureka的可用性。缺省情况下,15分钟内统计心跳失败百分比低于85%。如果低于85%,EurekaServer将保护这些实例,使其不会过期。讲述一次惨痛的线上经历,错误描述如下:当时服务部署成功,Eureka注册中心显示服务注册成功。但是,当前端请求通过网关转发给服务时,一直没有响应,服务调用一直没有响应。成功。Nginx转发和网关转发都在确认问题出在哪里。几经折腾,网关直接将服务通过IP地址转发给在线服务,很快就解决了问题。follow-up,review,应该是Eureka的自我保护机制导致的。在注册表中注册的服务是不可用的服务。但是,由于自我保护机制,EurekaServer不会移除无效的服务。后续解决方案是设置enableSelfPreservation=false,关闭自我保护机制,降低renewalPercentThreshold的比例。在EurekaServer端,如果出现无效的服务,该服务将被移除。nacosregistrynacos是springcloud的扩展。注册中心功能通过NacosDiscoveryClient继承DiscoveryClient。在springcloud中,可以无侵入的方式切换Eureka。注册中心可以手动移除服务实例,并通过消息通知客户端更新缓存的实例信息。完整调用链接示例如下:springcloud引入nacos时,参考官网匹配具体版本,如图:nacos的关键点需要了解它的DomainmodelNacosdatamodelKey由三元组、Namespace命名空间、分组group、service服务唯一确定。具体可以参考官网Nacos架构。与Eureka相比,nacos有以下优势:nacos自动或手动下线服务,采用消息机制通知客户端,对服务实例的修改响应迅速;Eureka只能通过任务计时来剔除无效服务。nacos可以根据namespace命名空间、DataId、Group分组区分不同环境(dev、test、prod)和不同项目的配置。