最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Gateway集成 Nacos注冊(cè)中心不能夠發(fā)現(xiàn)服務(wù)的解決方案

 更新時(shí)間:2026年01月09日 10:13:48   作者:馮立彬  
文章描述了在將Eureka替換為Nacos后,Spring Cloud Gateway在調(diào)用Nacos注冊(cè)的服務(wù)時(shí)出現(xiàn)問(wèn)題,通過(guò)調(diào)試和分析,發(fā)現(xiàn)Spring Cloud Gateway在初始化時(shí)沒(méi)有正確加載Nacos的ReactiveDiscoveryClient,導(dǎo)致服務(wù)調(diào)用失敗,感興趣的朋友跟隨小編一起看看吧

一、問(wèn)題描述

我們現(xiàn)在是在用Nacos替換Eureka,原來(lái)Eureka和Spring gateway運(yùn)行正常,可以通過(guò)Spring gateway調(diào)用注冊(cè)到Eureka中的服務(wù)。

當(dāng)前Spring cloud的版本是Hoxton.SR8,Nacos discovery的版本為0.9.0.RELEASE,使用的Nacos版本為2.0.3。

Nacos替換Eureka改動(dòng)的地方如下:

1、去掉POM中Eureka的引入;

2、去掉主類(lèi)中引入的@EnableEurekaClient注解;

3、引入Nacos依賴(lài):

<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的依賴(lài):

<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

現(xiàn)在的現(xiàn)象:

  • Spring gateway啟動(dòng)不報(bào)錯(cuò);
  • gateway也可以正常注冊(cè)到Nacos;
  • 通過(guò)打斷點(diǎn)到NacosDiscoveryClientAutoConfiguration,NacosDiscoveryClient會(huì)被初使化,但是調(diào)用時(shí)不會(huì)調(diào)用NacosDiscoveryClient.getInstances(String)獲取被調(diào)用應(yīng)用的Provider,會(huì)報(bào)類(lèi)似下面的接口404錯(cuò)誤:

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

其中user-service為注冊(cè)到Nacos上面的服務(wù)名稱(chēng),但是就是不能夠被調(diào)用到。

  • Spring gateway的注冊(cè)中心切換為Eureka,再次調(diào)用服務(wù)時(shí),Eureka的CompositeDiscoveryClient.getInstances(String)方法就會(huì)被調(diào)用。

二、問(wèn)題分析

前面走了一些彎路,也花了一些時(shí)間,最后想到的是與Eureka注冊(cè)中心進(jìn)行對(duì)比調(diào)試分析,下面例出關(guān)鍵的分析步驟。

Debug斷點(diǎn)打到DiscoveryClientRouteDefinitionLocator兩個(gè)構(gòu)造函數(shù)上,只有參數(shù)是ReactiveDiscoveryClient的構(gòu)造函數(shù)被加載:

繼續(xù)跟蹤到ReactiveCompositeDiscoveryClient.getServices()方法:

發(fā)現(xiàn)數(shù)組變量discoveryClients包含了兩個(gè)實(shí)現(xiàn),如下圖所示:

其中有一個(gè)是EurekaReactiveDiscoveryClient,那在使用Nacos時(shí)就應(yīng)該包含一個(gè)針對(duì)Nacos實(shí)現(xiàn)的ReactiveDiscoveryClient,于是切換為Nacos分支調(diào)試。

但是調(diào)試發(fā)現(xiàn)數(shù)組變量discoveryClients并沒(méi)有包含針對(duì)Nacos實(shí)現(xiàn)的ReactiveDiscoveryClient:

于是參考EurekaReactiveDiscoveryClient以及NacosDiscoveryClient,立即就寫(xiě)了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>

并在啟動(dòng)時(shí)創(chuàng)建Bean:

再次啟動(dòng)調(diào)試就可以看到數(shù)組變量discoveryClients中有NacosReactiveDiscoveryClient了:

 再次通過(guò)網(wǎng)關(guān)請(qǐng)求服務(wù),就可以正常調(diào)用成功了。

 感覺(jué)Nacos的怪問(wèn)題都讓我給碰上了!

到此這篇關(guān)于Spring Gateway集成 Nacos注冊(cè)中心不能夠發(fā)現(xiàn)服務(wù)的解決方案的文章就介紹到這了,更多相關(guān)Spring Gateway集成 Nacos內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaCV 拉流存儲(chǔ)到本地示例解析

    JavaCV 拉流存儲(chǔ)到本地示例解析

    這篇文章主要介紹了JavaCV 拉流存儲(chǔ)到本地示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java Spring攔截器案例詳解

    Java Spring攔截器案例詳解

    這篇文章主要介紹了Java Spring攔截器案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java8簡(jiǎn)單了解Lambda表達(dá)式與函數(shù)式接口

    Java8簡(jiǎn)單了解Lambda表達(dá)式與函數(shù)式接口

    這篇文章主要介紹了Java8簡(jiǎn)單了解Lambda表達(dá)式與函數(shù)式接口,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java實(shí)現(xiàn)小程序簡(jiǎn)單五子棋

    Java實(shí)現(xiàn)小程序簡(jiǎn)單五子棋

    這篇文章主要介紹了利用Java實(shí)現(xiàn)小程序簡(jiǎn)單五子棋,本程序適用于java初學(xué)者鞏固類(lèi)與對(duì)象、事件響應(yīng)、awt包中各種工具的相關(guān)概念以及對(duì)邏輯能力的鍛煉,下面來(lái)看具體實(shí)現(xiàn)吧
    2021-12-12
  • Mybatis 自動(dòng)映射(使用需謹(jǐn)慎)

    Mybatis 自動(dòng)映射(使用需謹(jǐn)慎)

    這篇文章主要介紹了Mybatis 自動(dòng)映射(使用需謹(jǐn)慎),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java普通類(lèi)、抽象類(lèi)、接口的應(yīng)用和區(qū)別解析

    Java普通類(lèi)、抽象類(lèi)、接口的應(yīng)用和區(qū)別解析

    本文詳細(xì)對(duì)比了Java普通類(lèi)、抽象類(lèi)和接口的區(qū)別,從定義關(guān)鍵字、繼承或?qū)崿F(xiàn)關(guān)鍵字、成員字段和方法等方面進(jìn)行分析,感興趣的朋友跟隨小編一起看看吧
    2026-06-06
  • Maven項(xiàng)目中pom.xml父子模塊配置小結(jié)

    Maven項(xiàng)目中pom.xml父子模塊配置小結(jié)

    Maven父子模塊結(jié)構(gòu)通過(guò)pom.xml實(shí)現(xiàn)配置復(fù)用、版本統(tǒng)一和批量構(gòu)建,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • Springboot如何讀取resources下的json配置文件

    Springboot如何讀取resources下的json配置文件

    這篇文章主要介紹了Springboot如何讀取resources下的json配置文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • IDEA中GitLab的使用詳解

    IDEA中GitLab的使用詳解

    這篇文章主要介紹了IDEA中GitLab的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Java9以后的垃圾回收的具體用法

    Java9以后的垃圾回收的具體用法

    這篇文章主要介紹了Java9以后的垃圾回收的具體用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評(píng)論

临武县| 沽源县| 当雄县| 裕民县| 临汾市| 寻甸| 福泉市| 丰城市| 关岭| 久治县| 阳朔县| 鸡西市| 高雄县| 安阳县| 榆社县| 乐东| 柳州市| 延吉市| 蕉岭县| 彰武县| 湖北省| 台北县| 镇康县| 东乌珠穆沁旗| 西乌珠穆沁旗| 江孜县| 绵阳市| 玛沁县| 苏尼特左旗| 吐鲁番市| 许昌县| 揭东县| 崇仁县| 临邑县| 东至县| 宝应县| 霍州市| 浑源县| 洛浦县| 泸定县| 德惠市|