无论 provider 还是 consumer
工作流程
No provider available for the service ...
@DubboReference(check=false)
关闭这个特性版本 | 注册中心 | 配置方式 |
---|---|---|
< 2.7 | zk | 接口注册 |
> 2.7 | zk / nacos | 接口注册 |
>= 2.7.6 | zk / nacos | 接口注册/应用注册 |
> 3 | zk / nacos2.0 | 接口注册/应用注册 |
Dubbo 2.7.6 开始,支持 3 种注册方式
与之相对的,Dubbo 的订阅方式也有 3 种
Dubbo 的服务导出机制,其实就是从服务启动到注册到注册中心的过程,在官网有详细解释(放心看,中文的)
Dubbo 3.0
Spring 启动后发送的 ContextRefreshEvent
事件,
Dubbo 会通过 DubboDeployApplicationListener
监听这个事件,
并通过 DefaultModuleDeploy.startSync()
开始同步
Dubbo 2.7
入口在 ServiceBean.onApplicationEvent(ContextRefreshEvent event)
,分为如下几步
属性ProviderConfig
、ApplicationConfig
等配置对象ApplicationConfig
、RegistryConfig
等配置对象Invoker
,这是 Dubbo 的核心模块,所有组件都是以此为核心的scope
参数决定是导出到本地还是远端
InjvmProtocol.export
创建 InjvmExporter
doLocalExport
导出服务DestroyableExporter
@DubboReference(check=false)
关闭 consumer 启动时检查 provider 是否可用
当不配置时,若 provider 无可用节点会报 No provider available for the service ...
启动失败
@DubboServide(group="xx")
@DubboReference(group="xx")
同接口多实现配置,消费者只会调用同组提供者
@DubboServide(version="xx")
@DubboReference(version="xx")
同接口有多个版本需要兼容,消费者只会调用同组提供者
spi 是 JDK 已经实现了的规范,Dubbo 独立实现了一套
其目的在于在多实现接口中仅实例化需要的实现
线程池位置
线程池类型
maximumPoolSize
时直接抛出异常而不是将任务放入阻塞队列corePoolSize
但是小于 maximumPoolSize
时,优先创建Worker来处理任务。maximumPoolSize
时,将任务放入阻塞队列中。阻塞队列充满时抛出 RejectedExecutionException
线程池满载
dubbo 的线程池是在服务节点上全服务共享的,默认最大线程数 200,超出后会拒绝请求并提示类似如下信息:
Server side(ip,port) thread pool is exhausted, detail msg: Thread pool is EXHAUSTED! Thread name: xx-ip:port, Pool Size: 200(active: 200,core: 200, max: 200,largest:200), Task 207(completed: 7), Executor status: (isShutdown: false, isTerminated:false, isTerminating:false), in dubbo:ip:port
解决方式:
官网原文在此,中文的,随便看
基于 http 的
基于缓存的
基于二进制序列化的(快)
基于 java 规范的