SpringCloud 基于Nacos和Eureka 实现双注册双订阅

一、使用场景/原因

  • 过渡期迁移:

    • 当系统从一个服务注册中心迁移到另一个时,例如从 Eureka 迁移到 Nacos,可以在过渡期内同时使用两个注册中心,确保服务平稳迁移,逐步过渡,避免一次性切换带来的风险。
  • 兼容性考虑:

    • 不同的微服务可能使用不同的注册中心,为了兼容这些微服务,可以同时支持 Nacos 和 Eureka。这样既可以支持新开发的服务使用 Nacos,也可以兼容旧有的使用 Eureka 的服务。

二、增加注册中心

        本篇文章我们升级的项目本身现在使用的是Eureka,然后新创建的项目采用的是 Nacos来作为注册中心,这就会出现一个问题 , 那就是微服务之间调用困难, 因为新旧微服务分别都注册在不同的注册中心。如果采用一次性整体切换成Nacos,对于已经运行了很久的现有项目来说, 工作量有点大, 所以我们采用这种办法, 就是项目同时支持Nacos、Eureka两个服务注册,为后续的逐步迁移做准备。

 2.1、Pom文件分别配置Nacos、Eureka

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2.2、启动类注解

1、注释掉 @EnableEurekaClent   // 弃用Eureka 专门的注册注解

2、新添加 @EnableDiscoveryClient  

@SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

2.3、项目配置文件Application.yml

eureka:client:serviceUrl:defaultZone: http://localhost:9002/eureka/instance:prefer-ip-address: true
server:port: 11500
spring:application:name: Kocloud:service-registry:auto-registration:enabled: falsenacos:discovery:server-addr: http://127.0.0.1:9999namespace: 47dea8bf-3dce-4c86-82bc-82f1497c57d2

三、启动项目

至此,并没有结束,配置结束后,我们来启动项目,看效果。

不出意外的话,会出现下面这个报错, 出意外的话那就是出意外了 🙃🙃🙃🙃

 3.1、自动注册时候报错

图和文字是一样的 为了方便看,可方便复制

Disconnected from the target VM, address: 'localhost:63051', transport: 'socket'
***************************
APPLICATION FAILED TO START
***************************Description:Field autoServiceRegistration in org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration required a single bean, but 2 were found:- nacosAutoServiceRegistration: defined by method 'nacosAutoServiceRegistration' in class path resource [com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.class]- eurekaAutoServiceRegistration: defined by method 'eurekaAutoServiceRegistration' in class path resource [org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.class]Action:Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

        言简意赅的阐述一下出现这个报错的原因是因为, @EnableDiscoveryClient 在启动的时候会进行自动注册, 干这件事情的就是 AutoServiceRegistrationAutoConfiguration ,然后这个了类在一开始 注入了一个类型为 AutoServiceRegistration的类 

继续往下看, AutoServiceRegistration这个类的实现有两个,分别是EurekaAutoServiceRegistration 和 NacosAutoServiceRegistration,这都是因为引入了两个注册中心后导致的,

然后我们再说日志中给出的建议,他是说建议你在其中一个类上面加@Primary , 这样虽然能解决问题, 但是,这是源代码,无法修改的,难道不修改源码就没什么办法了么 ?

  

让我们在回到最开始的那个自动配置类上 , 注意看 , 这个类的init , 在进行了注入之后,  什么都没有做 , 就只是做了一下Check ,我个人感觉啊, 把这个自动配置类, 给忽略掉,也就是将其排除。 不让他自动执行!

3.2、注入失败问题解决

前面我们说到,为了解决在自动注册时候注入类时候出现两个配置类的问题, 我们采用排除这个配置类的方式,排除办法有两种, 可以根据习惯自行选择

3.2.1 application.yml 配置方式 autoconfigure.exclude

spring:application:name: Kocloud:nacos:discovery:server-addr: http://127.0.0.1:9999namespace: 47dea8bf-3dce-4c86-82bc-82f1497c57d2config:enabled: falseserver-addr: http://127.0.0.1:9999import-check: falsenamespace: 47dea8bf-3dce-4c86-82bc-82f1497c57d2autoconfigure:exclude: org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration

3.2.2 Application 启动类配置方式

// exclude 同样可以起到忽略的作用 ,至于这里为什么要忽略两个,继续往下看,会说到
@SpringBootApplication(exclude = {AutoServiceRegistrationAutoConfiguration.class,ServiceRegistryAutoConfiguration.class})
@EnableDiscoveryClient
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

然后我们再重启项目,提示的错误还有一个地方的注册配置类,遇到了同样的问题,(请注意,下面这个报错,如果你并没有使用  spring-boot-starter-actuator 这个组件就不会有这个问题)如下:

***************************
APPLICATION FAILED TO START
***************************Description:Field registration in org.springframework.cloud.client.serviceregistry.ServiceRegistryAutoConfiguration$ServiceRegistryEndpointConfiguration required a single bean, but 2 were found:- nacosRegistration: defined by method 'nacosRegistration' in class path resource [com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.class]- eurekaRegistration: defined in BeanDefinition defined in class path resource [org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration.class]Action:Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed******** 
Disconnected from the target VM, address: 'localhost:63833', transport: 'socket'

这次提示的配置类是 ServiceRegistryAutoConfiguration  , 按照老办法,直接忽略这个配置类, 但这个类不像上一个那样实际什么都没做,这个还是做了点事情的 , 这个类加载的目的是因为我们项目中使用到的 Spring的监控组件, 存在这个依赖时,即使执行了上文的操作,启动时还是报错。就是因为在启动之初这个监控组件会将Service注册,便于后续的监控,所以我们可以将这个也选择直接排除这个配置类, 至于影响嘛,无非就是监控组件中会少一个EndPoint,无伤大雅。

/*** @author Spencer Gibb*/
@Configuration(proxyBeanMethods = false)
public class ServiceRegistryAutoConfiguration {@ConditionalOnBean(ServiceRegistry.class)@ConditionalOnClass(Endpoint.class)protected class ServiceRegistryEndpointConfiguration {@Autowired(required = false)private Registration registration;@Bean@ConditionalOnEnabledEndpointpublic ServiceRegistryEndpoint serviceRegistryEndpoint(ServiceRegistry serviceRegistry) {ServiceRegistryEndpoint endpoint = new ServiceRegistryEndpoint(serviceRegistry);endpoint.setRegistration(this.registration);return endpoint;}}}

至此,分别排除了AutoServiceRegistrationAutoConfiguration 和 ServiceRegistryAutoConfiguration 这两个自动配置类后,项目便可以正常启动,且会注册到两个注册中心

但是请注意,这种行为并不是长久之道,只适合在项目架构升级过渡期使用,或者其他特殊场景下使用,日常使用中还是建议 使用同一种注册中心,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 6.0 使用 Log4Net 和 Nlog日志中间件

前言 两年前,浅浅的学过 .NET 6,为啥要记录下来,大概是为了以后搭架子留下引线,还有抛砖引玉。 1. 环境准备 下载 建议使用 Visual Studio 2022 开发版 官网的下载地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具借助 Visual Studio 设计,具有自动完成…

支付宝推出NFC(近场通信)碰一碰支付功能

近日&#xff0c;支付宝推出NFC&#xff08;近场通信&#xff09;碰一碰支付功能&#xff0c;支持iPhone、安卓手机。NFC支付早已不是新事物&#xff0c;从二维码支付重回NFC支付&#xff0c;支付宝能撬动市场吗&#xff1f; 根据网友反馈&#xff0c;目前支付宝正在上海静安大…

海外社媒网站抓取经验总结:如何更高效实现网页抓取?

有效的网络抓取需要采取战略方法来克服挑战并确保最佳数据提取。让我们深入研究一些关键实践&#xff0c;这些实践将使您能够掌握复杂的网络抓取。 一、了解 Web 抓取检测 在深入探讨最佳实践之前&#xff0c;让我们先了解一下网站如何识别和抵御网络爬虫。了解您在这一过程中…

2-12 基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪

基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪。输出跟踪轨迹及其误差。程序已调通&#xff0c;可直接运行。 2-12 CV模型卡尔曼滤波 CT模型卡尔曼滤波 - 小红书 (xiaohongshu.com)

千年古城的味蕾传奇-平凉锅盔

在甘肃平凉这片古老而神秘的土地上&#xff0c;有一种美食历经岁月的洗礼&#xff0c;依然散发着独特的魅力&#xff0c;那便是平凉锅盔。平凉锅盔&#xff0c;那可是甘肃平凉的一张美食名片。它外表金黄&#xff0c;厚实饱满&#xff0c;就像一轮散发着诱人香气的金黄月亮。甘…

【过度的乐观和自信,得治】为什么数据类项目交付失败的不少?

引言&#xff1a;数据类项目包含数据治理和数据分析类项目&#xff0c;这些是数字化转型中数据能力打造&#xff0c;是基础性的工作。这类项目通常涉及Iaas、Paas和Saas层产品和服务&#xff0c;越靠近业务客户的Saas层交付服务客户满意度低&#xff0c;项目失败的不少&#xf…

白驹过隙,沧海桑田

01. 机缘 今天是我加入CSDN的第2620天&#xff0c;是我成为创作者的第1024天。2021 年 08 月 25 日我在这里分享了人生中第一篇技术文章 springboot 签名验证。 现在在回看这篇文章还能感觉到当时的青涩和技术的薄弱&#xff0c;后面每一篇文章的输出可能都是在不断的学习和进…

Comfy UI使用最新SD3模型,并解决报错‘NoneType‘ object has no attribute ‘tokenize‘【实测可行】

解决Comfy UI使用最新SD3模型报错’NoneType’ object has no attribute ‘tokenize’ 前几天SD3发布了&#xff0c;所以想着尝尝鲜&#xff0c;便去下载了SD3来玩一玩。使用的是Comfy UI而不是Stable Diffusion UI&#xff0c;这是一个比SD UI更加灵活的UI界面&#xff0c;使用…

多头Attention MultiheadAttention 怎么用?详细解释

import torch import torch.nn as nn# 定义多头注意力层 embed_dim 512 # 输入嵌入维度 num_heads 8 # 注意力头的数量 multihead_attn nn.MultiheadAttention(embed_dim, num_heads)# 创建一些示例数据 batch_size 10 # 批次大小 seq_len 20 # 序列长度 query torch…

视频监控平台功能介绍:内部设备管理(rtsp、sdk、onvif、ehome/ISUP、主动注册协议等)

一、功能概述 AS-V1000视频平台是一套集成了用户设备权限管理、视音频监控、大容量存储、电子地图的系统平台软件。它结合了现代视频技术、网络通讯技术、计算机控制技术、流媒体传输技术的综合解决方案&#xff0c;为用户提供了强大的、灵活的组网和应用能力。 AS-V1000管理端…

关于接口测试——自动化框架的设计与实现

一、自动化测试框架 在大部分测试人员眼中只要沾上“框架”&#xff0c;就感觉非常神秘&#xff0c;非常遥远。大家之所以觉得复杂&#xff0c;是因为落地运用起来很复杂&#xff1b;每个公司&#xff0c;每个业务及产品线的业务流程都不一样&#xff0c;所以就导致了“自动化…

CSS属性选择器具有不区分大小写的模式

今天&#xff0c;我偶然发现了 caniuse.com 项目的一期&#xff0c;其中提到了新的和即将推出的 CSS Level 4 选择器。 这个列表很长&#xff0c;并且有许多新的选择器正在开发中。一个新的选择器标志引起了我的注意&#xff1b;属性选择器将变成一个 i 标志&#xff0c;这使得…

pod设置资源请求和限制

设置资源请求和限制 实验目标&#xff1a; 学习如何为 Pod 设置资源请求和限制&#xff0c;以优化集群资源分配。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 和内存的资源请求和限制。使用 kubectl describe 命令查看资源分配情况。观察资源限制对 P…

智能汽车 UI 风格独具魅力

智能汽车 UI 风格独具魅力

揭秘无局放电源:定义、工作原理及其在工业设备中的重要性

当代社会对电源安全性&#xff0c;精密性要求越来也高&#xff0c;对电源设备的需求也越来越高。无局放电源作为电源设备中的一种&#xff0c;由于其独特的优点&#xff0c;越来越受到各行各业的关注。目前&#xff0c;无局放电源在全球范围内得到了广泛应用&#xff0c;尤其是…

OS复习笔记ch11-4

磁盘调度 磁盘的物理结构 经典的温彻斯特盘 其中的几个概念&#xff1a; 盘面&#xff1a;可以看成是一个操场的平面&#xff0c;不同的盘面通过中间的轴串在一起磁道&#xff1a;磁道可以看成是操场的跑道&#xff0c;我们知道操场上有外道和内道&#xff0c;最内道中间往…

论文解读:Pandora: 朝着结合自然语言动作与视频状态的通用世界模型发展

论文《Pandora: 朝着结合自然语言动作与视频状态的通用世界模型发展》探索了构建一个高度集成的AI系统&#xff0c;旨在理解自然语言指令并在视频所代表的视觉环境中执行相应操作&#xff0c;从而推进对复杂动态场景的建模与预测能力。以下是该论文的关键点和贡献的详细解读&am…

针对河南大学数据结构傻逼学堂在线的自动化脚本

首先展示一下我们的答案 {1: [对象], 2: [关系]} {1: [非数值计算], 2: [操作]} {1: [线性表]} [D] [B] [B] [C] [C] {1: [操作]} {1: [数据关系, 数据对象上关系的集合]} {1: [性质相同]} {1: [物理结构]} {1: [存储结构, 操作表示]} [C] [B] [D] [B] [D] [true] [false] [fa…

Polyp-DDPM: Diffusion-Based Semantic Polyp Synthesis for Enhanced Segmentation

Polyp- ddpm:基于扩散的语义Polyp合成增强分割 摘要&#xff1a; 本研究介绍了一种基于扩散的方法Polyp-DDPM&#xff0c;该方法用于生成假面条件下息肉的逼真图像&#xff0c;旨在增强胃肠道息肉的分割。我们的方法解决了与医学图像相关的数据限制、高注释成本和隐私问题的挑…