最近在做项目的时候,因为要调试,所以选择了直连dubbo
按照官方文档给出的配置
配置为:
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />
但是使用的时候还是报错,堆栈信息如下:
com.alibaba.dubbo.rpc.RpcException: Forbid consumer xx.xx.xx.xx access service xx.xx.xxx.xxx.xxx.xxx from registry 127.0.0.1:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist). at com.alibaba.dubbo.registry.integration.RegistryDirectory.doList(RegistryDirectory.java:579) ~[dubbo-2.5.3.jar:2.5.3] at com.alibaba.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:73) ~[dubbo-2.5.3.jar:2.5.3] at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:260) ~[dubbo-2.5.3.jar:2.5.3] at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:219) ~[dubbo-2.5.3.jar:2.5.3] at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72) ~[dubbo-2.5.3.jar:2.5.3] at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52) ~[dubbo-2.5.3.jar:2.5.3] at com.alibaba.dubbo.common.bytecode.proxy2.refundOrderAllMoney(proxy2.java) ~[na:2.5.3] at .....
百思不得其解:不是都直连了么,怎么还有一个注册中心啊?
排查:
官方给出的配置应该没错啊。构建一个demo程序,按照上面的配置直连服务提供者,连接成功,没报错。那么问题就出在我的代码里面了
仔细检查dubbo配置文件,以及错误日志,终于发现问题:同一个服务引用我定义了两次!!!!!只有其中一个配置了直连,另一个没有配置直连,就去注册中心查找服务,注册中心没有服务自然就报错了。
解决:
删除掉重复的服务引用,问题解决
其他:
因为代码重复引起的问题我已经遇到过三次了,每次都很蛋疼,看代码看到死都看不出来问题。因为问题代码根本就不在那里。所以呢,下次如果遇到这种代码明显没问题,但是执行结果有问题的情况,可以考虑去查下是不是存在代码重复的问题。也许代码执行的是另一个地方呢。
代码重复包括:代码方法定义重复、配置重复、类加载重复、代码版本错误等等等等
---------------------------------------------------------------------------------------------------
(下面的这坨不用看了,本来想写扩展点的,写着写着就不知道在写啥了)
网上有一个文档叫做:《dubbo源码解析2.0.pdf》写得很详细,想了解dubbo实现的可以看看这个文档
扩展:
直连式怎么做到的呢?怎么跳过注册中心的呢?
1) 配置直连服务提供者的时候
在ReferenceConfig.createProxy方法中回去判断引用有没有指定url
if (url != null && url.length() > 0) { // 用户指定URL,指定的URL可能是对点对直连地址,也可能是注册中心URL
String[] us = Constants.SEMICOLON_SPLIT_PATTERN.split(url);
if (us != null && us.length > 0) {
for (String u : us) {
URL url = URL.valueOf(u);
if (url.getPath() == null || url.getPath().length() == 0) {
url = url.setPath(interfaceName);
}
if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
urls.add(url.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));
} else {
urls.add(ClusterUtils.mergeUrl(url, map));
}
}
}
}
假设,我们只指定了一个url,并且这个url不是注册中心的url,那么执行这段代码后urls里面就只有一个url,为指定的服务提供者的地址,紧接着上面的代码在下面有这么一句代码
if (urls.size() == 1) {
invoker = refprotocol.refer(interfaceClass, urls.get(0));
}
此时的refprotocol.refer在代理类里面执行的时候,会根据url去匹配到对应的Protocol。
直连服务提供者的时候,这里我们配置的url是dubbo://xx.xxx.xxx.xxx:xxxx;那么他的协议时dubbo,就会找到对应的DubboProtocol类,去执行refer方法,在DubboProtocol方法中他就直接根据url创建了客户端,生产了Invoke了
2)没有配置直连服务提供者
没有配置直连服务提供者的时候,在ReferenceConfig.createProxy方法中是执行的这一段路径
else { // 通过注册中心配置拼装URL
List<URL> us = loadRegistries(false);
if (us != null && us.size() > 0) {
for (URL u : us) {
URL monitorUrl = loadMonitor(u);
if (monitorUrl != null) {
map.put(Constants.MONITOR_KEY, URL.encode(monitorUrl.toFullString()));
}
urls.add(u.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));
}
}
if (urls == null || urls.size() == 0) {
throw new IllegalStateException("No such any registry to reference " + interfaceName + " on the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", please config <dubbo:registry address=\"...\" /> to your spring config.");
}
}
从注册中心去获取可用的服务提供者的url,获取到了之后再依次对这些服务提供者的url进行refer,创建连接,invoker
相关推荐
解决启动dubbo项目的时候出现,无法读取方案文档 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd',其实在你本地把dubbo.jar文件解压,然后在META-INF下边就有个dubbo.xsd,就是他
- schema_reference.4: Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root ...
targetNamespace="http://code.alibabatech.com/schema/dubbo"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/> <xsd:import namespace="http://www.springframework.org/schema/beans"/> ...
下载一个dubbo.xsd文件 windows->preferrence->xml->xmlcatalog add->catalog entry ->file system 选择刚刚下载的文件路径 修改key值和配置文件的http://code.alibabatech.com/schema/dubbo/dubbo.xsd 相同 回到...
- schema_reference.4: Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root ...
Dubbo 是一款高性能、轻量级的开源Java RPC框架,由阿里巴巴公司开发并维护,它主要解决了企业服务治理的问题,提供了服务注册、服务发现、负载均衡、调用链跟踪等核心功能。在分布式系统中,Dubbo扮演着关键角色,...
本文将详细解析"标题"和"描述"中提到的"Dubbo.xsd"文件及其在解决Dubbo标签识别问题中的作用。 首先,我们需要理解XML Schema(简称XSD),它是一种用于定义XML文档结构和数据类型的规范。XSD文件定义了XML元素、...
3. 修改dubbo-admin项目中dubbo.properties文件,修改dubbo.registry.address地址指向自己发布的zookeeper地址 4. 将dubbo-admin进行打包成文件“dubbo-admin.war”,放到tomcat的webapps 5. 启动tomcat服务器 6. ...
Dubbo 2.5.3 全部jar包下载 [INFO] dubbo-parent ...................................... SUCCESS [1.042s] [INFO] Hessian Lite...[INFO] dubbo-demo-consumer ............................... SUCCESS [27.436s]
下载一个dubbo.xsd文件windows->preferrence->xml->xmlcatalog add->catalog entry ->file system 选择刚刚下载的文件路径 修改key值和配置文件的http://code.alibabatech.com/schema/dubbo/dubbo.xsd 相同 保存即可...
dubbo-doc-static 是 Dubbo 的文档镜像。 http://code.alibabatech.com/wiki/display/dubbo的拷贝。 HTML文件在分支gh-pages上,打包下载ZIP包。 关键的文档的链接: 用户指南: ...
`dubbo.xsd`文件包含了一系列用于描述服务提供者(Provider)、消费者(Consumer)、注册中心(Registry)、监控中心(Monitor)等组件的XML元素。例如,`<dubbo:service>`元素用来定义一个服务提供者,它包含了接口...
dubbo.xsd 下载 添加 xsd 源码位置获得:dubbo-config\dubbo-config-spring\src\main\resources\META-INF\dubbo.xsd
1.解决:dubbo找不到dubbo.xsd报错 2.Eclipse配置 选择windows-->preferrence-->xml->xmlcatalog-->add->catalog entry -->file system,选择模版文件(本地下载的)后,修改key值为...
本人实际测试过,这两个包可用。 环境描述:centos6/64位,JDK1.8,tomcat8 dubbo-admin安装要点: ...dubbo.registry.address 与 dubbo-admin中的配置一样 3.到dubbo-monitor中的bin目录下运行 start.sh脚本 ok
dubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo...
at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.returnFromResponse(DefaultFuture.java:190) at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:110) at ...
dobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo...
dubbo admin2.X的管理控制台zip包,专门为运行在jdk8(1.8)的同学准备。...dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=guest dubbo.admin.guest.password=guest