全局入口 spring schema handler
spring handler:com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler,定义了不同元素的解析器与映射的类。比如 dubbo:reference 对应 ReferenceBean,dubbo:service 对应 ServiceBean。
provider 侧
-
读取 spring 配置,dubbo 会将 spring xml 中的 dubbo:service 元素通过预先定义好的解析器封装成一个 ServiceBean,这是一个 service 的入口。
-
ServiceBean 实现了 spring 的 ApplicationListener 接口,用来监听 spring 上下文事件。Dubbo 响应了 ContextRefreshedEvent 事件,在上下文刷新之后执行导出 provider 动作。
-
执行导出操作,需要两个信息:
- 通信协议信息,用来指定 consumer 和 provider 间的通信方式以及信息。
- 注册中心信息,用来往对应的注册中心注册 provider url。
-
com.alibaba.dubbo.config.ServiceConfig#doExportUrls 生成 registry URL 以及 provider URL,并将 provider URL 作为 registry URL 的 export 参数绑定。根据 registry URL 的协议 registry://拿到对应的 RegistryProtocol并调用其 export 方法。
-
com.alibaba.dubbo.registry.integration.RegistryProtocol#export 主要完成两件事情:
- 作为 provider,使用定义好的通信协议来暴露服务,如 dubbo,http,rmi 等。
- 从 registry URL 的 export 参数来获取 provider URL。
- 通过 provider URL 的协议来获取其对应的协议处理类并调用 export 方法。
- 使用 registry URL 中的 registry 参数作为注册中心协议替换原来的**
- 通过新的 registry URL 的协议头,拿到相应的 com.alibaba.dubbo.registry.Registry 实例并调用其 com.alibaba.dubbo.registry.RegistryService#register 方法,比如向 zookeeper 新建临时节点。
- 作为 provider,使用定义好的通信协议来暴露服务,如 dubbo,http,rmi 等。
-
以上,就是 provider 侧的执行流程简述。
consumer 侧
- 同样的,dubbo 会将 dubbo:reference 封装成一个 ReferenceBean,但与 provider 不同,consumer 实现了 org.springframework.beans.factory.FactoryBean 接口,初始化的流程推迟到了调用 org.springframework.beans.factory.FactoryBean#getObject 时。
- 生成 registry URL,暂时指定协议为 registry://,并将实际协议作为 registry 参数的值绑定在 URL 上。
- 通过 registry URL 的协议 registry://,得到相应 RegistryProtocol,然后调用其 com.alibaba.dubbo.registry.integration.RegistryProtocol#refer 方法来获取 provider 引用。
- 更新 registry URL 协议。
- 通过 registry URL 获取相应的 com.alibaba.dubbo.registry.Registry。
- 使用 registry URL 和接口类型来生成相应的 com.alibaba.dubbo.registry.integration.RegistryDirectory。
- RegistryDirectory 通过 registry URL 和接口类型来命名。
- RegistryDirectory 用来封装所有的 invoker 地址信息以及路由信息等。
- 负责通过 provider URL 中的协议信息获取相应的链接协议处理类并调用 refer()方法以获取 Invoker对象。
- 生成订阅 URL,协议为 consumer://,通过 registry URL 获取相应的注册中心,向注册中心注册 consumer URL。
- 调用对应的注册中心的 subscribe 方法,com.alibaba.dubbo.registry.RegistryService#subscribe。
- 最终,会将 provider URL 保存到相应的 RegistryDirectory 中 com.alibaba.dubbo.registry.integration.RegistryDirectory#notify。可以查看 com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry#doSubscribe。
请求调用
-
默认使用 JDK 动态代理模式来获取实际执行类。
-
实际执行对象则是 com.alibaba.dubbo.registry.integration.RegistryProtocol#refer 返回的 Invoker 对象。
-
最终会执行 com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke 方法。
-
从 RegistryDirectory 中获取 Invoker List。
-
通过负载均衡从 Invoker List 中获取一个 Invoker。
-
拿到对应的链接协议 Invoker 实例,执行远程调用。
-
注意,consumer 实例是由 com.alibaba.dubbo.registry.integration.RegistryProtocol#refer 生成的,而用来执行远程链接处理远程协议的**refer()**方法则是由 RegistryDirectory 负责调用的。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于