文章目录

  • Dubbo3注册模式介绍
  • 踩坑记录

Dubbo3注册为应用级时,Nacos注册中心看到注册服务服务和订阅列表均正常,但是实际调用时报错“No provider available for the service XXX”

Dubbo3注册模式介绍

dubbo3共有三种provider服务注册模式,分别为 interface(接口级)、instance(应用级)、all,默认是all(双注册,兼容模式)
大概配置如下

dubbo:application:name: ${spring.application.name}#provider注册模式,可选值 interface(接口级)、instance(应用级)、all,默认是all(双注册)register-mode: instancemetadata-service-port: -1#consumer服务发现模式service-discovery:# FORCE_INTERFACE,只消费接口级地址,如无地址则报错,单订阅 2.x 地址# APPLICATION_FIRST,智能决策接口级/应用级地址,双订阅# FORCE_APPLICATION,只消费应用级地址,如无地址则报错,单订阅 3.x 地址migration: FORCE_APPLICATIONregistry:address: nacos://localhost:8848?namespace=my_localprotocol:port: -1consumer:check: falseprovider:filter: dubboExceptionFilter,-exception

踩坑记录

简单记录一下踩坑过程,当注册模式dubbo.application.register-mode=all双注册时可以正常调用,注册模式都改为应用级注册时dubbo.application.register-mode=instance调用报错“No provider available for the service XXX”

最终排查导致这个报错的原因是项目中自定义的日志traceId传递filter中使用了RpcContext.getContext().isProviderSide()这行代码报错NullPointException导致Consumer端拉取Provider端接口元数据失败,最终导致调用时报错“No provider available for the service XXX”

原来代码:

@Activate(group = {CommonConstants.PROVIDER, CommonConstants.CONSUMER}, order = MDCTraceUtils.FILTER_ORDER)
public class DubboTraceFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {// 使用应用级时,这行代码会报错 NullPointExceptionboolean isProviderSide = RpcContext.getContext().isProviderSide();//服务提供者逻辑if (isProviderSide) {} else { //服务消费者逻辑}try {return invoker.invoke(invocation);} finally {}}
}

在这个代码中加了一行判断,如果时内置元数据拉取服务MetadataService时,跳过当前Filter

if (MetadataService.isMetadataService(invocation.getServiceName())) {return invoker.invoke(invocation);
}

修改后代码为

@Activate(group = {CommonConstants.PROVIDER, CommonConstants.CONSUMER}, order = MDCTraceUtils.FILTER_ORDER)
public class DubboTraceFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {// 如果是内置元数据服务则跳过filter,否则走下面的会报错,导致元数据拉取失败,最终导致No provider错误if (MetadataService.isMetadataService(invocation.getServiceName())) {return invoker.invoke(invocation);}boolean isProviderSide = RpcContext.getContext().isProviderSide();//服务提供者逻辑if (isProviderSide) {} else { //服务消费者逻辑}try {return invoker.invoke(invocation);} finally {}}
}

以上代码基于dubbo-3.0.8,nacos-2.1.0调试

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.0.8</version>
</dependency>
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId><version>3.0.8</version>
</dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.0</version>
</dependency>

Dubbo3注册为应用级时报错“No provider available for the service XXX”相关推荐

  1. 解决MySQL删除外键时报错Error Code: 1091. Can‘t DROP ‘XXX‘; check that column/key exists

    解决MySQL删除外键时报错Error Code: 1091. Can't DROP 'XXX'; check that column/key exists   长期不写基础的 MySQL 代码,笔者 ...

  2. 搭建注册中心Eureka运行时报错:[ main] o.s.b.d.LoggingFailureAnalysisReporter :

    报错截图如下: 问题分析:项目运行时无法加载jar包里的某个类,那么删掉这个jar重新下载即可. (1)去本地maven库C:\Users\Administrator.m2\repository\co ...

  3. Android 调用.so包时报错:UnsatisfiedLinkError: No implementation found for XXX 时的解决办法

    环境 Android Studio 3.5 问题描述 使用可以正常运行的Demo中的module, 其中调用了第三方so文件.运行报错: java.lang.UnsatisfiedLinkError: ...

  4. 解决执行go get时报错的问题:dial tcp: lookup xxx.com on 8.8.8.8:53: no such host

    go env -w GOPRIVATE=xxx.com 最近在执行go mod tidy更新依赖库时遇到如下问题:dial tcp: lookup xxx.com on 8.8.8.8:53: no ...

  5. Dubbo调用时报错Invalid token Forbid invoke remote service interface

    dubbo开启token服务后,使用集群容错策略为FailoverClusterInvoker,当出现服务调用失败进行转移,重试其它服务器时,会出现token invalid错误,provider会拒 ...

  6. ubuntu下安装tomcat,shutdown时报错:./catalina.sh:1:eval:/home/xxx/jdk/jre/bin/java:not found

    该问题可能导致tomcat启动成功了,但是浏览器输入http://127.0.0.1:8080无法显示tomcat的欢迎界面 打开Tomcat安装目录下的bin文件下的setclasspath.sh, ...

  7. 解决执行go mod tidy时报错的问题:dial tcp: lookup xxx: no such host

    问题截图: 最近在执行go mod tidy更新依赖库时遇到如下问题:dial tcp: lookup xxx: no such host问题原因:Go 设置了默认的GOSUMDB=sum.golan ...

  8. Apex运行时报错提示“easy anti-cheat”“Game Security Violation Detected(#0000000D)[xxx.exe]“ 问题解决方案

    Apex运行时报错提示"Game Security Violation Detected(#0000000D)[xxx.exe]" 问题解决方案 1.问题分析 某天加载游戏突然失败 ...

  9. C#设置开机启动时报错,提示“对注册表项“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run访问被拒绝”

    参考文章 C#如何设置开机启动 C#设置开机启动时报错,提示"对注册表项"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current ...

最新文章

  1. PLSQL乱码TNS-12557: protocol adapter not loadable解决
  2. PHP - declare tick
  3. Leetcode: Binary Tree Inorder Traversal
  4. 直接插入_折半插入(python)
  5. java增删改查控制台_在控制台中输入增删改查 (初学者)
  6. 数据包的分类和调度-Linux TC的另一种解释
  7. Maven相关jar包安装
  8. 关于海康威视sdk与海康威视web的史上最精细的教程 (一)
  9. Axure原型设计介绍
  10. umount target is busy
  11. 4维俄罗斯方块 java_烧脑的方块:解析“俄罗斯方块”4种不同的基础模块
  12. 方框加对勾怎么输入_Word与Excel中,如何在方框中打对勾?
  13. java除去类里面的黄色警告_java中使用list会出现黄色警告图标如何去除
  14. 年月日、年积日、简化儒略日、GPS周之间相互转换(C++)
  15. 创建Vue+TS+Ant Design of Vue 项目
  16. 组合数学_排列与组合
  17. R语言生存分析数据分析可视化案例
  18. Aura Component父子组件通信
  19. Python装饰器最经典教程,以最易理解的方式教会你
  20. 解决vue-router报NavigationDuplicated: Avoided redundant navigation to current location: “/login“ 的问题

热门文章

  1. 一道有趣的伪博弈题——三叉树
  2. 多城市分站站群网站系统源码+完整搭建教程
  3. 服务器内存2666显示2400,2666MHz内存为什么系统只显示2400MHz呢?有这几种原因
  4. 蓝桥杯之单片机设计与开发
  5. vant组件库适配pc端
  6. Solr搜索引擎 — SolrCloud安装和集群配置
  7. 钓鱼工具gophish详细教程
  8. 关于Java中arraycopy的用法
  9. java的arraycopy_java System.arrayCopy使用说明
  10. Determining IP information for eth0... failed; no link present. Check cable?