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

news2024/11/27 8:39:54

一、使用场景/原因

  • 过渡期迁移:

    • 当系统从一个服务注册中心迁移到另一个时,例如从 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: Ko
  cloud:
    service-registry:
      auto-registration:
        enabled: false
    nacos:
      discovery:
        server-addr: http://127.0.0.1:9999
        namespace: 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: Ko
  cloud:
    nacos:
      discovery:
        server-addr: http://127.0.0.1:9999
        namespace: 47dea8bf-3dce-4c86-82bc-82f1497c57d2
      config:
        enabled: false
        server-addr: http://127.0.0.1:9999
        import-check: false
        namespace: 47dea8bf-3dce-4c86-82bc-82f1497c57d2
  autoconfigure:
    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
		@ConditionalOnEnabledEndpoint
		public ServiceRegistryEndpoint serviceRegistryEndpoint(
				ServiceRegistry serviceRegistry) {
			ServiceRegistryEndpoint endpoint = new ServiceRegistryEndpoint(
					serviceRegistry);
			endpoint.setRegistration(this.registration);
			return endpoint;
		}

	}

}

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

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

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

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

相关文章

http/2 二进制分帧层 (Binary Framing Layer)讲解

文章目录 二进制帧HTTP/2 中的帧、消息和流1. 帧&#xff08;Frame&#xff09;2. 消息&#xff08;Message&#xff09;3. 流&#xff08;Stream&#xff09;总结示例&#xff1a; 二进制帧结构1.帧头部结构2.帧负载数据 请求和响应多路复用 链接参考&#xff1a;https://web.…

C#修改 EXE 文件图标和 winForm 窗口图标

修改 EXE 文件图标 1.准备好图片&#xff0c;转换为 Icon 图片&#xff1b; 2.右键工程&#xff0c;选择属性&#xff1b; 3.选择 Icon 图标即可&#xff1b; 4.重新生成可执行文件&#xff0c;查看。 修改 winForm 窗口图标 1.选中 winForm &#xff0c;查看属性&#x…

天马学航——智慧教务系统(移动端)开发日志三

天马学航——智慧教务系统(移动端)开发日志三 日志摘要&#xff1a;更新了学生选课模块、我的课程模块以及退课的功能&#xff0c;优化了后端数据库的缓存 1、学生选课模块 学生选课模块主要实现&#xff0c;学生根据需求进行选课操作&#xff0c;通过后端查询到所有教师的课…

mysql 主从延迟

mysql 主从延迟 精华推荐 | 【MySQL技术专题】「主从同步架构」全面详细透析MySQL的三种主从复制&#xff08;Replication&#xff09;机制的原理和实战开发&#xff08;原理实战&#xff09; https://blog.csdn.net/l569590478/article/details/128329929 mysql主从之多线程复…

Nuxt 3 路由系统详解:配置与实践指南

title: Nuxt 3 路由系统详解&#xff1a;配置与实践指南 date: 2024/6/21 updated: 2024/6/21 author: cmdragon excerpt: 摘要&#xff1a;本文是一份关于Nuxt 3路由系统的详尽指南。它从介绍Nuxt 3的基本概念开始&#xff0c;包括Nuxt 3与Nuxt 2的区别和选择Nuxt 3的理由。…

创建OpenWRT虚拟机

环境&#xff1a;Ubuntu 2204&#xff0c;VM VirtualBox 7.0.18 安装必备软件包&#xff1a; sudo apt update sudo apt install subversion automake make cmake uuid-dev gcc vim build-essential clang flex bison g gawk gcc-multilib g-multilib gettext git libncurses…

供应链投毒预警 | utilitytool系列Py包开展XenoRAT远控木马投毒

概述 上周&#xff08;2024年6月14号&#xff09;&#xff0c;悬镜供应链安全情报中心在Pypi官方仓库&#xff08;https://pypi.org/&#xff09;中捕获2起针对Windows系统的Python包投毒事件&#xff0c;涉及Python组件包utilitytool及utilitytools&#xff0c;投毒者&#x…

C++开发基础之频繁使用`std::endl`可能导致性能问题

前言 你是否曾经注意过这个问题&#xff0c;频繁使用std::endl可能导致性能问题。在C开发中&#xff0c;许多开发者习惯于使用std::endl来换行输出并刷新缓冲区。然而&#xff0c;这种习惯性操作可能会在高频率输出场景中带来显著的性能瓶颈。接下来&#xff0c;我们将深入探讨…

2.XSS-存储型

储存型XSS 或持久型 XSS 交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性。 在留言板里面进行测试一下是否有做过滤 "<>?&66666点击提交 查看元素代码&#xff0c;已经提交完成&#xff0c;并且没有做任何的过滤措施 接下来写一个javascrip…

由于没有远程桌面授权服务器怎么办?

在现代的工作环境中&#xff0c;远程访问和远程桌面控制已经成为一项日益重要的需求。随着企业和组织的扩张&#xff0c;人们经常需要在不同的地点之间共享文件和应用程序。由于缺乏远程桌面授权服务器&#xff0c;这一过程可能会变得困难和不安全。 远程桌面授权服务器是一种…

MGV电源维修KUKA机器人电源模块PH2003-4840

MGV电源维修 库卡电源模块维修 机器人电源模块维修 库卡控制器维修 KUKA电源维修 库卡机器人KUKA主机维修 KUKA驱动器模块维修 机械行业维修&#xff1a;西门子系统、法那克系统、沙迪克、FIDIA、天田、阿玛达、友嘉、大宇系统&#xff1b;数控冲床、剪板机、折弯机等品牌数控…

gbase8s之Encoding or code set not supported

如图发生以下错误&#xff1a; 解决办法&#xff1a;在url里加上ifx_use_strenctrue 就可以了 参数解释&#xff1a;

【PS】提取手写签名

准备工具&#xff1a; 纸张&#xff1a;用于承载签名&#xff1b; 笔&#xff1a;用于签名&#xff1b; 手机&#xff1a;用于拍摄签名&#xff1b; Adobe Photoshop 版本: 12.0.3 (12.0.3x20101211 [20101211.r.1222 2010/12/11:02:00:00 cutoff; r branch]) x32&#xff1a;用…

Nacos安装教程(很细很简单),解决启动报错Please set the JAVA_HOME

nacos安装 找到你要下载的版本解压到任意非中文目录下端口默认8848&#xff0c;如有端口冲突&#xff0c;可修改配置文件中的端口。编辑shutdown.cmd文件&#xff0c;路径换成你的jdk安装地址否则会报错Please set the JAVA_HOME variable in your environment, We need java(x…

AI在线免费视频工具2:视频配声音;图片说话hedra

1、视频配声音 https://deepmind.google/discover/blog/generating-audio-for-video/ https://www.videotosoundeffects.com/ &#xff08;免费在线使用&#xff09; 2、图片说话在线图片生成播报hedra hedra 上传音频与图片即可合成 https://www.hedra.com/ https://www.…

国产化操作系统杂谈

目录 操作系统国产化背景国产化操作系统名录优秀操作系统介绍1.深度Linux&#xff08;deepin&#xff09;2.FydeOS3.AliOS&#xff08;openAliOS&#xff09;4.openEuler5.红旗Linux6. startOS 总结 操作系统国产化背景 官方的说法是为了打破长期以来国外对中国的操作系统的垄…

【for循环】水仙花数

【for循环】水仙花数 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 【参考代码】 #include <iostream> using namespace std; int main(){ for(int abc 100; abc<999; abc){// 获取范围内所有的数字 int c abc%10; //获取个位 int b abc%10…

场外个股期权怎么看涨跌情况?怎么判断是选涨还是选跌?

今天带你了解场外个股期权怎么看涨跌情况&#xff1f;怎么判断是选涨还是选跌&#xff1f;在期权市场中&#xff0c;投资者想要在其中获得盈利&#xff0c;学会判断涨跌是期权投资者赚钱路上要走的第一步。 判断场外个股期权的涨跌情况主要可以从以下几个方面入手&#xff1a; …

如何去除VisualStudioCode最新版本出现的两条横线

作为一个对频繁更新有些抗拒的人&#xff0c;我曾多次遇到在更新后出现莫名问题的情况。然而&#xff0c;由于最近一次更新已经有一段时间了&#xff0c;我觉得或许这次会带来一些更好的设计或其他改进。于是&#xff0c;我决定更新Visual Studio Code&#xff0c;并分享一下我…

数据结构5---矩阵和广义表

一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 &#xff08;1&#xff09;对称矩…