当前位置: 代码网 > it编程>编程语言>Java > SpringCloud 基于Nacos和Eureka 实现双注册双订阅

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

2024年08月06日 Java 我要评论
当系统从一个服务注册中心迁移到另一个时,例如从 Eureka 迁移到 Nacos,可以在过渡期内同时使用两个注册中心,确保服务平稳迁移,逐步过渡,避免一次性切换带来的风险。

一、使用场景/原因

  • 过渡期迁移:

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

    • 不同的微服务可能使用不同的注册中心,为了兼容这些微服务,可以同时支持 nacos 和 eureka。这样既可以支持新开发的服务使用 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、启动类注解

@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

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);
    }

}
***************************
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'
/**
 * @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;
		}

	}

}

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com