Dubbo3注册为应用级时报错“No provider available for the service XXX”
文章目录
- 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”相关推荐
- 解决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 代码,笔者 ...
- 搭建注册中心Eureka运行时报错:[ main] o.s.b.d.LoggingFailureAnalysisReporter :
报错截图如下: 问题分析:项目运行时无法加载jar包里的某个类,那么删掉这个jar重新下载即可. (1)去本地maven库C:\Users\Administrator.m2\repository\co ...
- Android 调用.so包时报错:UnsatisfiedLinkError: No implementation found for XXX 时的解决办法
环境 Android Studio 3.5 问题描述 使用可以正常运行的Demo中的module, 其中调用了第三方so文件.运行报错: java.lang.UnsatisfiedLinkError: ...
- 解决执行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 ...
- Dubbo调用时报错Invalid token Forbid invoke remote service interface
dubbo开启token服务后,使用集群容错策略为FailoverClusterInvoker,当出现服务调用失败进行转移,重试其它服务器时,会出现token invalid错误,provider会拒 ...
- 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, ...
- 解决执行go mod tidy时报错的问题:dial tcp: lookup xxx: no such host
问题截图: 最近在执行go mod tidy更新依赖库时遇到如下问题:dial tcp: lookup xxx: no such host问题原因:Go 设置了默认的GOSUMDB=sum.golan ...
- Apex运行时报错提示“easy anti-cheat”“Game Security Violation Detected(#0000000D)[xxx.exe]“ 问题解决方案
Apex运行时报错提示"Game Security Violation Detected(#0000000D)[xxx.exe]" 问题解决方案 1.问题分析 某天加载游戏突然失败 ...
- C#设置开机启动时报错,提示“对注册表项“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run访问被拒绝”
参考文章 C#如何设置开机启动 C#设置开机启动时报错,提示"对注册表项"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current ...
最新文章
- PLSQL乱码TNS-12557: protocol adapter not loadable解决
- PHP - declare tick
- Leetcode: Binary Tree Inorder Traversal
- 直接插入_折半插入(python)
- java增删改查控制台_在控制台中输入增删改查 (初学者)
- 数据包的分类和调度-Linux TC的另一种解释
- Maven相关jar包安装
- 关于海康威视sdk与海康威视web的史上最精细的教程 (一)
- Axure原型设计介绍
- umount target is busy
- 4维俄罗斯方块 java_烧脑的方块:解析“俄罗斯方块”4种不同的基础模块
- 方框加对勾怎么输入_Word与Excel中,如何在方框中打对勾?
- java除去类里面的黄色警告_java中使用list会出现黄色警告图标如何去除
- 年月日、年积日、简化儒略日、GPS周之间相互转换(C++)
- 创建Vue+TS+Ant Design of Vue 项目
- 组合数学_排列与组合
- R语言生存分析数据分析可视化案例
- Aura Component父子组件通信
- Python装饰器最经典教程,以最易理解的方式教会你
- 解决vue-router报NavigationDuplicated: Avoided redundant navigation to current location: “/login“ 的问题
热门文章
- 一道有趣的伪博弈题——三叉树
- 多城市分站站群网站系统源码+完整搭建教程
- 服务器内存2666显示2400,2666MHz内存为什么系统只显示2400MHz呢?有这几种原因
- 蓝桥杯之单片机设计与开发
- vant组件库适配pc端
- Solr搜索引擎 — SolrCloud安装和集群配置
- 钓鱼工具gophish详细教程
- 关于Java中arraycopy的用法
- java的arraycopy_java System.arrayCopy使用说明
- Determining IP information for eth0... failed; no link present. Check cable?