dubbo 2标签解析 ServiceBeanT 生产者服务暴漏过程
二、dubbo标签解析
com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
public void init() {
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
}
三、ServiceBean<T> 生产者服务暴漏过程,<dubbo:service>标签最终解析成了ServiceBean。
1、 ServiceConfig 的export方法为暴漏服务的方法。
private void doExportUrls() {
List<URL> registryURLs = loadRegistries(true);
//loadRegistries检查了注册中心,如果存在设置了URL的Protocol为registry
// url = url.addParameter(Constants.REGISTRY_KEY, url.getProtocol());
//可以配置多协议暴漏
for (ProtocolConfig protocolConfig : protocols) {
doExportUrlsFor1Protocol(protocolConfig, registryURLs);
}
}
2、 doExportUrlsFor1Protocol中
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
//生成了invoker,默认使用JavassistProxyFactory
Exporter<?> exporter = protocol.export(invoker);
exporters.add(exporter);
这个protocol使用的是Adaptive的,而这个invoker.url.protocol为registry,所以实际会得到RegistryProtocol
再加上wrapper则会得到ProtocolListenerWrapper->ProtocolFilterWrapper->RegistryProtocol
3、ProtocolListenerWrapper和ProtocolFilterWrapper在export方法中对registry类型的直接通过
ProtocolFilterWrapper
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) {
return protocol.export(invoker);
}
return protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER));
}
到了RegistryProtocol的export
//export invoker
final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker);
doLocalExport中
final Invoker<?> invokerDelegete = new InvokerDelegete<T>(originInvoker, getProviderUrl(originInvoker));
exporter = new ExporterChangeableWrapper<T>((Exporter<T>)protocol.export(invokerDelegete), originInvoker);
bounds.put(key, exporter);
getProviderUrl(originInvoker)通过invoker的url 获取 providerUrl的地址,这时候url的protocol就不是registry了,
而是具体的协议,比如dubbo
那么后面的protocol.export就会使用DubboProtocol,当然同样加上了wrapper,这两个wrapper会在调用过程中加上
listener和filter链,链的最后就是invoker
4、DubboProtocol的export
DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);
....
openServer(url)->createServer(url);
根据具体协议启动服务器,监听端口
5、Exchangers.bind->Transporters.bind->Server
server = Exchangers.bind(url, requestHandler);
HeaderExchanger的bind
public ExchangeServer bind(URL url, ExchangeHandler handler) throws RemotingException {
return new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler))));
}
Transporters的bind return getTransporter().bind(url, handler);
这里的Transporter使用的是自适应的,那么会根据配置或者默认使用NettyTransporter
6、NettyTransporter.bind->NettyServer(url, listener);
NettyServer里面的doOpen就是netty启动服务端的过程。
7、回到RegistryProtocol的export,在暴漏完invoker后,接着去注册中心注册了服务提供者
使用zookeeper则会注册地址/dubbo/interfaceClass/providers/{providerUrl}存储生成者的ip,端口等,供消费者订阅获取使用
dubbo 2标签解析 ServiceBeanT 生产者服务暴漏过程相关推荐
- Dubbo的服务暴漏与服务发现源码详解
服务暴漏 如果配置需要刷新则根据配置优先级刷新服务配置 如果服务已经导出,则直接返回 是否异步导出(全局或者服务级别配置了异步,则需要异步导出服务) 服务暴漏入口DefaultModuleDeploy ...
- dubbo配置参考手册,dubbo各个标签解析
配置参考手册 <dubbo:service/> <dubbo:reference/> <dubbo:protocol/> <dubbo:registry/&g ...
- 【springcloud】Eureka 服务提供者 增加服务暴漏
一.Controller 中添加一下代码 @Autowiredprivate DiscoveryClient client;@RequestMapping(value = "/discove ...
- 【SpringCloudAlibaba学习 04】整合Dubbo(实现数据消费者服务调用数据生产者服务)
文章目录 引言 1.[数据生产者工程]创建service-api子工程 1.1.[数据生产者服务]创建user-service-api服务 目录结构 UserService服务接口 UserServi ...
- dubbo源码解析(二)
大家好,我是烤鸭: dubbo 源码解析: 1.服务导出 介绍: Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可分为三 ...
- 【Dubbo源码阅读系列】服务暴露之本地暴露
在上一篇文章中我们介绍 Dubbo 自定义标签解析相关内容,其中我们自定义的 XML 标签 <dubbo:service /> 会被解析为 ServiceBean 对象(传送门:Dubbo ...
- 初试 Kubernetes 暴漏服务类型之 Nginx Ingress
目录 Ingress 介绍 环境.软件准备 部署 Default Backend 部署 Ingress Controller 部署 Ingress Name based virtual hosting ...
- Kubernetes暴漏服务类型之Nginx Ingress
Kubernetes暴漏服务类型之Nginx Ingress 一.Ingress 介绍 LoadBlancer Service NodePort Service 1.NodePort类型的服务 Ing ...
- Dubbo源码解析之服务路由策略
1. 简介 服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者.在详细分析服务路由的源码之前,先来介绍一下服务路由是什么.服务路由包含一条 ...
最新文章
- 面试问题-使用Java线程做数学运算
- [官版翻译]OpenStack centos版安装(三)
- SQL Server移除事务日志后sys.master_files依然存在记录问题
- Java调用.Net的web service的几种方式
- 【Java MyBatis Generator】使用generator自动生成Dao,Mapping和实体文件
- JAVA UDP网络编程学习笔记
- 静默错误:为什么看了那么多灾难,还是过不好备份这一关?
- 织梦根目录感染abc.php,织梦SEO优化:织梦dedecms根目录下robots.txt文件设置详解! - 张俊SEO...
- mysql oracle视频网盘_前端和后端终极学习视频(百度网盘资料)
- Eclipse如何优化(转)
- Android 关于推送通知还需要一些其他的设置问题,最新高频Android笔试题分享
- php 手写签批 手机办公_好签原笔迹手写签批SDK
- 【灵修】应对“三季人”,多活十余年(2012-1-14)
- WWW 2022 | 搜索广告CVR延迟反馈建模DEFUSE
- 文学赏析 - 人生若只如初见
- 通俗解释Docker
- android平板改成电视盒子,【当贝市场】废旧手机改造成电视盒子详细教程
- 学习笔记:min-width和min-height
- 推荐uml 流程图 在线编辑工具
- 第三章-集合论 3.2-Russell 悖论(选读)