Spring Gateway集成 Nacos注册中心不能够发现服务的问题解决

Nacos集成spring cloud gateway 今天使用Nacos集成spring cloud gateway,记录一下 最开始我创建了一个module :cloud-gateway,并且在pom文件里配置这样(部分代码截取): <parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>1.0.0</version> 阅读详情
AI摘要

本文详细讲述了将SpringCloud从Eureka迁移到Nacos过程中遇到的问题,包括如何修改配置、创建NacosReactiveDiscoveryClient以修复服务调用失败,并分享了解决过程和关键代码实现。

一、问题描述

我们现在是在用Nacos替换Eureka,原来Eureka和Spring gateway运行正常,可以通过Spring gateway调用注册到Eureka中的服务。

当前Spring cloud的版本是Hoxton.SR8,Nacos discovery的版本为0.9.0.RELEASE,使用的Nacos版本为2.0.3。

Nacos替换Eureka改动的地方如下:

1、去掉POM中Eureka的引入;

2、去掉主类中引入的@EnableEurekaClient注解;

3、引入Nacos依赖:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  <version>0.9.0.RELEASE</version>
  <exclusions>
    <exclusion>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
    </exclusion>
    <exclusion>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-client</artifactId>
  <version>2.0.3</version>
</dependency>

4、引入spring-cloud-loadbalancer:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

5、spring-cloud-starter-openfeign中exclude掉ribbon的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>

6、application.yml中禁用nacos的ribbon:

ribbon:
  nacos:
    enabled: false

现在的现象:

  • Spring gateway启动不报错;
  • gateway也可以正常注册到Nacos;
  • 通过打断点到NacosDiscoveryClientAutoConfiguration,NacosDiscoveryClient会被初使化,但是调用时不会调用NacosDiscoveryClient.getInstances(String)获取被调用应用的Provider,会报类似下面的接口404错误:

{"msg":"/user-service/user/getByToken","result":404,"data":null}

其中user-service为注册到Nacos上面的服务名称,但是就是不能够被调用到。

  • Spring gateway的注册中心切换为Eureka,再次调用服务时,Eureka的CompositeDiscoveryClient.getInstances(String)方法就会被调用。

二、问题分析

前面走了一些弯路,也花了一些时间,最后想到的是与Eureka注册中心进行对比调试分析,下面例出关键的分析步骤。

Debug断点打到DiscoveryClientRouteDefinitionLocator两个构造函数上,只有参数是ReactiveDiscoveryClient的构造函数被加载:

继续跟踪到ReactiveCompositeDiscoveryClient.getServices()方法:

发现数组变量discoveryClients包含了两个实现,如下图所示:

其中有一个是EurekaReactiveDiscoveryClient,那在使用Nacos时就应该包含一个针对Nacos实现的ReactiveDiscoveryClient,于是切换为Nacos分支调试。

但是调试发现数组变量discoveryClients并没有包含针对Nacos实现的ReactiveDiscoveryClient:

于是参考EurekaReactiveDiscoveryClient以及NacosDiscoveryClient,立即就写了NacosReactiveDiscoveryClient:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties;
import org.springframework.cloud.alibaba.nacos.NacosServiceInstance;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;

import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.pojo.ListView;

import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;
/**
 * 
 * @author fenglibin
 *
 */
@Slf4j
public class NacosReactiveDiscoveryClient implements ReactiveDiscoveryClient {

	public static final String DESCRIPTION = "Spring Cloud Nacos Reactive Discovery Client";

	private NacosDiscoveryProperties discoveryProperties;

	public NacosReactiveDiscoveryClient(NacosDiscoveryProperties discoveryProperties) {
		this.discoveryProperties = discoveryProperties;
	}

	@Override
	public String description() {
		return DESCRIPTION;
	}

	@Override
	public Flux<ServiceInstance> getInstances(String serviceId) {
		try {
			List<Instance> instances = discoveryProperties.namingServiceInstance().selectInstances(serviceId, true);

			return Flux.fromStream(hostToServiceInstanceList(instances, serviceId).stream());
		} catch (Exception e) {
			throw new RuntimeException("Can not get hosts from nacos server. serviceId: " + serviceId, e);
		}
	}

	@Override
	public Flux<String> getServices() {
		try {
			ListView<String> services = discoveryProperties.namingServiceInstance().getServicesOfServer(1,
					Integer.MAX_VALUE);

			return Flux.fromStream(services.getData().parallelStream());
		} catch (Exception e) {
			log.error("get service name from nacos server fail,", e);
			return Flux.fromStream(Collections.<String>emptyList().stream());
		}
	}

	private static ServiceInstance hostToServiceInstance(Instance instance, String serviceId) {
		NacosServiceInstance nacosServiceInstance = new NacosServiceInstance();
		nacosServiceInstance.setHost(instance.getIp());
		nacosServiceInstance.setPort(instance.getPort());
		nacosServiceInstance.setServiceId(serviceId);

		Map<String, String> metadata = new HashMap<>();
		metadata.put("nacos.instanceId", instance.getInstanceId());
		metadata.put("nacos.weight", instance.getWeight() + "");
		metadata.put("nacos.healthy", instance.isHealthy() + "");
		metadata.put("nacos.cluster", instance.getClusterName() + "");
		metadata.putAll(instance.getMetadata());
		nacosServiceInstance.setMetadata(metadata);

		if (metadata.containsKey("secure")) {
			boolean secure = Boolean.parseBoolean(metadata.get("secure"));
			nacosServiceInstance.setSecure(secure);
		}
		return nacosServiceInstance;
	}

	private static List<ServiceInstance> hostToServiceInstanceList(List<Instance> instances, String serviceId) {
		List<ServiceInstance> result = new ArrayList<>(instances.size());
		for (Instance instance : instances) {
			result.add(hostToServiceInstance(instance, serviceId));
		}
		return result;
	}

}

或者集成如下starter:

    <dependency>
        <groupId>com.eeeffff</groupId>
        <artifactId>nacos-reactive-discovery-client</artifactId>
        <version>1.0.0</version>
    </dependency>

并在启动时创建Bean:

再次启动调试就可以看到数组变量discoveryClients中有NacosReactiveDiscoveryClient了:

 再次通过网关请求服务,就可以正常调用成功了。

 感觉Nacos的怪问题都让我给碰上了!

Nacos启动报错com.alibaba.nacos.api.exception.NacosException: java.lang.reflect.InvocationTargetException 今日使用nacos开启配置中心功能后启动报错。 阅读详情

相关推荐

Nacos——服务订阅

Nacos的服务订阅源码分析,结合Spring Cloud Gateway的服务化路由讲解Nacos的服务订阅

看不懂的男孩的博客 4182

服务提供者无法注册到nacos服务器

问题可能是这样的 get service name from nacos server fail //或 No service to register for nacos client... // 或 nacos NoSuchMethodError // 或 nacos registry, qit-service-provider register failed...NacosRegistration{nacosDiscoveryProperties=NacosDiscoveryProperties{ser

日日留心的技术专栏 2万+

Spring gateway 网关的使用(nacos 作为注册中心)

本文主要介绍一个demo,用 nacos 做为注册中心,展示Spring gateway 网关的基本使用。也讲了在这一过程中踩过的坑。

weixin_44002599的博客 1760

关于nginx指向nacos遇到的坑

刚入职的时候一直在用正式服务器进行开始,项目上线后,还有东西要改就要放到测试服务器上,测试服务器是个新服务器,里面没有东西,我一想,简单啊,正式的往测试上面一放项目部署上去不就行了么,我想的太简单了。 部署时遇到的问题,项目里使用到了nacos,我就直接把正式上面的nacos和nginx都下载下来放到测试服务器上面,因为测试服务器上面只开放了8848端口,那就用nginx做代理指向nacos把,然后不出意外的出现问题了。 先把nacos的端口改成8849端口 然后做了个代理指向nacos .

qq_40472999的博客 4782

nacos服务注册中心+gateway网关+服务提供者

1.Spring Cloud GateWay需在pom.xml中增加如下配置: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <version>2.1.5.RELEASE</version> </dependency&gt

changqinrong的博客 1971

【异常】Spring Cloud Gateway启动异常提示NacosException: Client not connected,current status:UNHEALTH

根据堆栈跟踪,问题发生在以下步骤:当前应用尝试通过Nacos的gRPC客户端代理(NamingGrpcClientProxy)向Nacos服务器发起请求。在调用requestToServer方法时,由于底层的RpcClient组件未能成功连接到Nacos服务器,抛出了Nacos异常。异常指出客户端与Nacos服务器之间的连接存在问题,即客户端当前并未建立有效的连接。如果是在分布式环境中,确认所有节点的Nacos客户端配置一致并能正确连接到Nacos服务器。因此解释了,为啥会偶发性出现问题。

奶爸的编程之路,也就一周冷个三天 3602

Gateway - 无缝集成 Nacos:自动发现微服务并动态路由

本文介绍了如何将Spring Cloud Gateway与Nacos无缝集成,实现微服务的自动发现和动态路由。文章首先概述了Spring Cloud Gateway的核心特性和Nacos的主要功能,阐述了二者集成的意义。随后详细讲解了环境准备、项目结构设计、核心依赖配置等实施步骤,包括Nacos服务器的启动方式和多模块项目结构设计。通过这种集成方案,可以实现网关自动感知服务实例变化、动态更新路由规则,从而简化运维工作并提高系统可用性。本文为构建智能灵活的微服务网关系统提供了实用参考。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【解决方案】使用transformer指定显卡后,模型依然加载到默认第1张显卡上

按理说指定了环境变量为后面几张显卡,模型会自动加载到我们指定的显卡上。可是查看gpu使用情况,发现还是加载在了第一张显卡上,这是为啥呢?

m0_56745306的博客 2440

Spring Cloud Gateway 必须用 Nacos 吗?3 种服务发现模式 + 配置示例

摘要:Spring Cloud Gateway的核心功能(路由转发、过滤、限流等)可以独立工作,是否需要集成nacos-discovery取决于微服务架构是否采用服务注册与发现模式。

码路同行 1304

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 647

工创赛智能搬运小车实战:视觉定位、底盘控制与RTOS调度

智能搬运系统是嵌入式控制与机器视觉融合的典型工程实践,其核心在于视觉定位精度、运动控制稳定性与实时任务调度能力。在有限算力(如STM32H7)、低功耗约束和结构化场景下,传统CV方法(如FAST+RANSAC)比轻量级深度学习更具鲁棒性与实时性;而底盘控制需穿透PID表层,直击死区补偿、编码器硬件滤波与负载自适应等物理层细节;RTOS则不是炫技工具,而是保障多模块时序确定性的刚需——尤其在视觉-控制-执行强耦合链路中,任务优先级、事件组通信与栈安全直接影响系统存活。本文聚焦全国大学生工程训练竞赛(工创赛)真

weixin_29194693的博客 264

nacos+gateway服务发现lb路由报503 Service Unavailable

问题产生背景 使用 Nacos 作为注册中心,gateway 作为网关,网关通过lb的方式进行服务路由,在网关报503服务不可用Service Unavailable。 现象版本 SpringCloud2020.0.3 Nacos 1.4.1 深入问题 是因为 ReactiveLoadBalancerClientFilter 全局过滤器没有加载。官方对其 的解释是: The ReactiveLoadBalancerClientFilter looks for a URI in the exchange a

写Bug的小白的博客 5646

基于OkHttp3+Retrofit2+RxJava3搭建响应式网络框架

本文介绍了一个基于OkHttp3+Retrofit3+RxJava3的响应式网络框架设计。该框架采用分层架构,OkHttp3负责底层网络请求,Retrofit3封装HTTP接口,RxJava3实现响应式流处理。核心亮点包括:1)高度解耦的分层设计;2)统一的异常处理和响应体封装;3)RxJava3实现线程切换和请求管理;4)MVVM架构适配,业务层只需关注数据逻辑。框架提供了完整的实现方案,包括全局配置、拦截器、响应转换、接口声明、仓库封装等组件,并支持生产环境扩展功能如Cookie持久化、Token刷新等

fuge2008的博客 870

spring cloud gateway整合nacos通过服务名获取不到服务404

今天在参照这篇文章https://blog.youkuaiyun.com/forezp/article/details/85210153测试spring cloud gateway整合nacos时,想如下配置,就可以通过服务名来调用服务接口,不用配置rooter了。但是测试发现总是404,后来发现是版本问题。 spring: application: name: chaoyue-gateway cloud: gateway: discovery: locator.

gitcat的博客 8315

AI提示词实战:用EARS语法5步搞定产品需求拆解(附完整案例)

本文详细介绍了如何运用EARS语法将模糊的产品需求进行原子化拆解,转化为清晰、可执行的结构化指令。通过一个完整的自由职业者项目管理工具案例,演示了从原始需求分析到构建增强AI提示词的五步实战流程,帮助产品经理和技术人员实现高效、精准的需求传达与协作。

nokia的博客 1030

Apple 网页 SRP 登录系列文章(四):Hashcash 工作量证明与完整登录流程

本文是Apple SRP登录系列文章的收官之作,重点解析了Apple独有的Hashcash工作量证明机制并展示了完整的登录流程实现。文章详细介绍了Hashcash的安全目的、格式标准、计算核心算法及难度评估方法,特别提供了Python实现代码。同时还讲解了如何动态获取服务器Hashcash参数以及建立容错机制。最后呈现了完整的Apple SRP登录主函数架构,为开发者提供了从理论到实践的全面指导。全文通过代码示例和流程分析,系统性地阐述了Apple安全登录机制的技术细节。

Sayid_Des的专栏 629

微服务实战(六)集成服务网关 SpringCloud GateWay (配置中心&注册中心用Nacos)

本章主要讲述服务网关、配置中心、注册中心 结合使用 结合使用微服务架构的 服务网关、配置中心、注册中心。 回顾一下:之前分别讲述了Nacos的配置中心、注册中心单独使用,记得在注册中心一章中我们是在消费者微服务中先进行了接口地址的寻址,然后再调用的。这次加上服务网关,就不用这么麻烦啦!只要将服务网关也注册到服务中心,那么服务网关就会自动代理服务中心的服务,相当于Nginx的作用。 介绍一下这...

看山不是山 4204

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

安装这个软件之前先安装VisualStudio,本文安装这个软件时已经安装了VisualStudio2019。1、下载倍福PLC编程软件TwinCAT。

qq_34059233的博客 3663

spring cloud gateway网关+nacos注册中心实现服务负载

1.原理很简单 gateway和serviceA都在nacos注册中心注册,gateway从注册中心发现serviceA提供的2个服务(只要愿意,可以启动N个serviceA服务),自动采用轮询机制访问serviceA。 nacos是spring cloud alibaba的组件,spring cloud alibaba属于spring cloud的子项目。所以spring cloud alibaba的组件可以和spring cloud组件之间可以很好结合 spring cloud gateway是sp.

张erdan的博客 2482

基于 Python + Flask + Echarts 的疫情监控系统

基于 Python + Flask + Echarts 的疫情监控系统

743

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【gateway系列】手把手教你gateway整合nacos注册中心

目录准备Gateway服务Member服务运行 往期相关推荐: 网关路由规则和nacos配置中心实战: 一步步带你学习gateway路由规则实践 nacos整合配置中心 准备 准备引入相关依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId>

增量星球 3752

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Spring实战】32 Spring Boot3 集成 Nacos 服务注册中心 并在 Gateway 网关中应用

Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它提供了服务发现、动态配置管理和服务元数据等功能,是构建和管理云原生应用的关键组件之一。通过这篇博客,我们初步认识了 Nacos 的定义、背景、起源、功能和特性,并通过简单示例演示了其在微服务中的应用。在接下来的学习过程中,你将更深入地了解 Nacos 的各项功能,并掌握其在构建可靠、高可用的微服务体系中的应用。

好久不见的流星 3980

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

spring cloud 微服务部署(2025年)第一章:Nacos、LoadBalancer、GateWay、Ribbon集成之Nacos部署

2025年最新spring cloud微服务集成nacos、gateway、ribbon(一)之nacos部署

尽绵薄之力填坑的人 1553

解决gateway使用nacos重启报503 Service Unavailable问题

问题描述 项目使用spring cloud gateway作为网关,nacos作为微服务注册中心,项目搭建好后正常访问都没问题,但是有个很烦人的小瑕疵: 当某个微服务重启后,通过网关调用这个服务时有时会出现503 Service Unavailable(服务不可用)的错误,但过了一会儿又可以访问了,这个等待时间有时很长有时很短,甚至有时候还不会出现 导致每次重启某个项目都要顺便启动gateway项目才能保证立即可以访问,时间长了感觉好累,想彻底研究下为什么,并彻底解决 接下来介绍我在解决整个过程的思路

jmysql的博客 1万+

SpringCloud Gateway的路由实践(nacos作为服务注册中心)

一、整体结构 此demo是基于nacos服务发现这个demo做的,把其中的zuul替换为gateway,所需的组件有nacos和gateway: 所有访问系统的请求都要经过网关,网关转发 Http 请求至 application-1 , application-1 使用 dubbo 调用 service1 完成自身业务,而后sevice1 调用 service2 完成自身业务。至此,完成所有组件贯穿。 项目结构如下: 二、路由规则 新建服务gateway: 1、初始化项目 目的是.

肖潇不写代码 1852

Spring Cloud Gateway 与 Nacos 集成详解

本文深入探讨Spring Cloud Gateway与Nacos服务注册中心的集成机制,包括服务发现、动态路由、配置管理等内容。通过详细的代码示例和架构分析,帮助开发者构建基于Nacos的动态网关系统。Nacos是阿里巴巴开源的服务发现和配置管理平台,提供动态服务发现、配置管理和服务管理等功能。Spring Cloud Gateway与Nacos的集成提供了强大的服务发现和动态配置能力。通过合理的配置和实现,可以构建灵活、可扩展的微服务网关系统。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1139
上一篇: Nacos使用域名做为服务地址遇到的问题及解决方案
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值