应该是来自以下类似log
2017-08-07 13:51:32.358 DEBUG com.alibaba.dubbo.remoting.exchange.support.header.HeartBeatTask [dubbo-remoting-client-heartbeat-thread-1] [DUBBO] Send heartbeat to remote channel /10.100.20.87:8088, cause: The channel has no data-transmission exceeds a heartbeat period: 60000ms, dubbo version: 2.5.3, current host: 10.8.35.141
这段的意思是 dubbo服务守护线程在扫描是否存在dubbo。但是没有找到服务的发布者就提示,扫描周期过后没有获得服务提供者。
我遇到这个问题,解决了良久,才解决,是因为程序启动的时候由于资源链接不上(如数据库,mq服务器,zookeeper)导致线程阻塞在那里了。自然dubbo服务都没有被初始化。
但是启动服务后的1分钟后,dubbo服务检测程序启动,开始检测服务是否健康,就出现这个问题了。
答案是肯定可以的,我将从下面几点进行说明:
1.dubbo 的调用流程
2.Dubbo整体设计
3.从源码上说明注册中心挂了还是可以继续通信的
Dubbo 调用流程
架构图
流程说明:
1.Provider(提供者)绑定指定端口并启动服务
2.提供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储
3.Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心
4.注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。
5.Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。
6.Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer
这么设计的意义:
Dubbo 整体设计其协作流程如下:
从源码上说明注册中心挂了还是可以继续通信的
首先要把消费者注册到Zookeeper注册中心
然后使用RegistryDirectory 监听一下几个目录(会自动触发一次去获取这些目录上的当前数据)
当前所引入的服务的动态配置目录:/dubbo/config/dubbo/org.apache.dubbo.demo.DemoService:1.1.1:g1.configurators
比如监控providers 目录:
当有服务提供者注册,zookeeper会自动推动给订阅的消费者,然后转换为invoker存储到缓存中
我们在看调用时的代码:
我们看到 FailoverClusterInvoker 的doInvoke方法
Invoker invoker = select(loadbalance, invocation, copyInvokers, invoked)
此方法根据负载均衡器去缓存中获取一个invoker,
上面的 copyInvokers 就是上面我们缓存进去的 List
invokers = routerChain.route(getConsumerUrl(), invocation)
总结
在我们系统启动时,已经缓存了注册中心上的所有服务,后续的注册中心挂了只会影响到后续则注册,不会影响调用!
Dubbo分布式的RPC,微服务框架,
包括三个关键功能:基于接口的远程调用,容错与负载均衡,服务自动注册与发现。
Dubbo使得调用远程服务就像调用本地java服务一样简单。
参考Dubbo官方文档:包括实现细节,远程调用细节,服务提供者暴露服务。
主要流程。
1、provider向注册中心去注册
2、consumer从注册中心订阅服务,注册中心会通知consumer注册好的服务
3、consumer调用provider
4、consumer和provider都异步的通知监控中心
基于zk作为注册中心:
【提供者】在【启动】时,向注册中心zk 【注册】自己提供的服务。
【消费者】在【启动】时,向注册中心zk 【订阅】自己所需的服务。
所以是可以的,消费者在启动时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用,消费者本地有一个生产者的列表,他会按照列表继续工作,倒是无法从注册中心去同步最新的服务列表,短期的注册中心挂掉是不要紧的,但一定要尽快修复,挂掉是不要紧的,但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)