服务暴露原理

简介: 本文深入剖析Dubbo服务发布全过程,从启动日志切入,详解本地与远程暴露、多协议支持、Spring事件机制联动等核心机制,结合源码解读与面试高频题,系统梳理服务发布的关键步骤与设计思想。

前言
之前讲完了dubbo集群容错系列,现在开始讲比较重要的环节,也就是dubbo面试中比较喜欢问的两个点:服务发布和服务引用.
插播面试题
● 服务发布过程中做了哪些事
● dubbo都有哪些协议,他们之间有什么特点,缺省值是什么
● 什么是本地暴露和远程暴露,他们的区别
直入主题
从启动日志说起
大家都知道,dubbo是阿里巴巴开源的一个项目,前阵子阿里不仅发布的代码规范手册,还发布了相应的插件,从这点我们就知道,阿里是很注重这个代码规范的,从dubbo项目我们也发现了,他有完善的测试体系.说了这么说,那和我们今天要讲的dubbo的服务发布有什么关系呢?当然有,一个规范的项目,必然是有健全的日志系统.做过其他开发比如iOS开发的都知道,这个控制台输出在生产环境是不能随便输出的,太多日志有时候和没有日志是一样的.所以我们来看看这个服务启动过程中,日志究竟输出了什么.

这里我用不同颜色的框将关键的地方画了出来,一共有6种颜色,我一次从上到下说一下这发布过程的一些动作
● 暴露本地服务
● 暴露远程服务
● 启动netty
● 连接zookeeper
● 到zookeeper注册
● 监听zookeeper
从文档入手,了解全局
经常有人问到,看源码要怎么看.要了解这个服务发布,文档就是一个很好的切入口,如下

再献上文档提供的一个时序图

当然这些都是给已经对源码有一定熟悉的人看的,而我的源码解析类文档,是给对源码不熟悉的人看的.
其实我的每周一更dubbo源码系列文章,我的初衷有以下两个,一个就是做到系统分享,比如dubbo系列文章,我会从不少于内核,服务发布,服务引用,编解码这四个模块去剖析,后面如果有时间,会临摹一个简易的dubbo框架.另一个初衷就是把自己思考的过程和大家分享,在这个分享过程中,其实就是回答了"怎么看源码"这个问题
那么准备好五菱宏光,向秋名山出发

出发秋名山
我早年做Android开发的时候,就发现身边的人都是死在了一个点上,那就是配置环境.对于看源码,很多人最常问的一句话就是,怎么入手,也就是切入点.那么我们还是以开头的日志为例,来找一个这个切入点
仔细看输出日志,就会发现在暴露本地服务之前,有一句很重要的日志,就是

The service ready on spring started. service: com.alibaba.dubbo.demo.DemoService, dubbo version: 2.0.0, current host: 127.0.0.1
我们利用编译器的搜索文本功能,定位到了ServiceBean这个类,这个类是干嘛的?好,我假设我也不知道,既然不知道,那我们来看一下他的继承体系图

从这个图我们看到了许多和spring有关的东西,还发现了一个重要的接口,那就是ApplicationListener.要能敏锐的发现这个关键的接口,首先还是要对spring有一定了解,这个就是spring的事件机制(event).什么是事件机制呢?就比如监听spring容器初始化完成.那我们就定位到这行日志的位置,往下debug

下面要开始敲黑板划重点了.

从方法名我们很直观知道目的,但是这里同事不止一次问过我,这个dubbo.properties文件是怎么时候加载的,好像我根本没有设置,另外这个dubbo.properties文件的名字能不能改?面对这种问题,我从来都是不会直接把答案告诉他,而是告诉他,我是怎么得到这个答案的,如下图

同理,对于log4j.xml这个文件,好像我从来没有写代码加载过,为什么他会加载呢,其实也是同理的

接下来继续往下走,下面这里就是我们的第二道面试题

这里为什么会进行遍历呢,因为dubbo是支持多协议的,看文档原话

dubbo支持多种协议,默认使用的是dubbo协议,具体介绍官方文档写得很清楚,传送地址:相关协议介绍
马不停蹄,下面就到了第三个面试题,也是服务发布的重点,本地暴露和远程暴露

为什么会有本地暴露和远程暴露呢?不从场景考虑讨论技术的没有意义是.在dubbo中我们一个服务可能既是Provider,又是Consumer,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远,因此他是有本地暴露服务的这个设计.从这里我们就知道这个两者的区别
● 本地暴露是暴露在JVM中,不需要网络通信.
● 远程暴露是将ip,端口等信息暴露给远程客户端,调用时需要网络通信.
本篇着重讲解服务发布的整体过程,细节和总结后面会陆续展开.我们忘记下.其实注意一下我这些截图就能发现,我截的时候会特意把类名和方法名都截出来,方便大家能迅速定位.

从上图可知,这里用到了Adaptive(这个东西非常关键,后面会专门一篇讲解).点进ProxyFactory查看源码

@Adaptive注解打在类上和方法上,他们是有区别的(面试也喜欢问这种区别类的问题,这个留在Adaptive专题说,记得关注肥朝每周一篇源码解析 _ ),他打在方法上,就会生成动态编译的Adaptive类,下面就介绍一下怎么看这个动态编译类的源码
首先要将这个log4j的level调整为DEBUG

为什么需要调整成DEBUG,更重要的是把如何知道的,告诉大家,比如如下图,当然这个时候可能会朋友说,我也不知道这个类也还是没办法找到这行代码.其实这个也是在后面专门的一篇Adaptive中会说,到时候我会提供另一种实现思路,我们一起思考对比优劣.

打开DEBUG后,我们重新启动,就会看到日志有如下输出,这段就是相关代码,我们根据包名新建文件,如下

我们在getInvoker方法上打上断点,重启一下.

由上图知道,本地暴露的url是以injvm开头的,下面来看下远程暴露,其实这个也是回答本地暴露和远程暴露区别的一个回答点.面试回答要的并不是一个满分的答案,而是从一些细节中,看出一个人,是否真的研究过源码.

还是回到开头那句话,dubbo命名是很规范的,从Wrapper这个命名,其实可以和Spring的Bean Wrapper,以及装饰者设计模式联系起来.同时可以看看文档中的
写在最后
上面讲到了getInvoker方法,也就是拿到了Invoker,如果注意到本篇开头的文档说明中的那句Dubbo 处理服务暴露的关键就在 Invoker 转换到 Exporter 的过程,就知道,其实这个服务暴露还有很多细节是未完待续的,但是由于本篇已有一定篇幅,所以只能下周再见.

相关文章
|
XML 存储 分布式计算
hbase构建二级索引解决方案
HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索。假设我们相对Hbase里面列族的列列进行一些组合查询,就只能全表扫描了。表如果较大的话,代价是不可接受的,所以要提出二级索引的方案。
1447 0
hbase构建二级索引解决方案
|
3月前
|
人工智能 JSON 前端开发
手撸AI对话助手带上思考过程
本文介绍如何通过LangChain + Ollama实现大模型流式响应(类打字机效果),提升用户体验。包含FastAPI后端流式接口(`astream`)、带`<THINK>`/`<FINAL>`标签的思考过程解析,以及前端HTML实时渲染示例,支持思考折叠、光标动画与错误处理。(239字)
318 1
|
4月前
|
消息中间件 缓存 算法
外卖系统开源版核心模块拆解:商户、骑手与调度系统设计
本文深度解析开源外卖系统核心架构,聚焦商户、骑手、调度三大模块的设计逻辑与代码实现。强调其价值不在“源码公开”,而在清晰分层、高内聚低耦合、可扩展调度算法及稳定状态流转,助开发者构建真正可落地的履约系统。(239字)
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
415 14
|
8月前
|
缓存 运维 文字识别
《大模型驱动的智能文档解析系统:从领域适配到落地优化的全链路开发实践》
本文聚焦大模型在高端装备制造企业智能文档解析系统的落地实践,针对领域术语理解断层、长文档上下文限制、知识提取精准度不足、响应缓慢、微调成本高、稳定性差等核心痛点,提出对应解决方案:构建领域术语知识底座适配行业语境,以语义分块+关联图谱突破长文档解析瓶颈,用多轮校验+规则库保障知识可靠性,通过分层部署+多级缓存优化响应速度,采用增量微调+prompt工程降低成本并提升泛化能力,依托全链路监控+自动化运维保障长期稳定。优化后,术语识别准确率、知识逻辑完整性显著提升,单文档初步解析响应缩至3秒内,故障发生率降至1.2%,印证大模型落地需全链路协同且贴合领域需求。
604 15
|
10月前
|
安全 IDE 开发工具
错误代码0xc0000001如何处理?
错误代码0xc0000001是Windows系统启动时常见的故障,通常由系统文件损坏、硬件问题或驱动冲突引起。以下是综合解决方案:
|
人工智能 自然语言处理 API
OpenDeepResearcher:开源 AI 研究工具,自动完成搜索、评估、提取和生成报告
OpenDeepResearcher 是一款开源 AI 研究工具,支持异步处理、去重功能和 LLM 驱动的决策,帮助用户高效完成复杂的信息查询和分析任务。
1064 18
OpenDeepResearcher:开源 AI 研究工具,自动完成搜索、评估、提取和生成报告
|
12月前
|
资源调度 安全 Java
服务中国13亿社保持卡人:金保信与阿里云的“一云多芯”升级之路
在全球科技竞争与自主创新的双重驱动下,中国信息技术产业正加速推进科技创新与产业融合等多维布局,积极应对科技领域“卡脖子”难题,构建技术升级与安全保障体系。 而云平台作为产业发展的核心IT基础设施,也已成为数字化转型和升级的关键支撑。2019年,阿里云基于“开放兼容”的理念率先提出并践行“一云多芯”战略,并通过飞天企业版实现从CPU扩展到GPU、网络设备,以及各类行业生态应用、自建应用的全域兼容能力。
1004 1
|
11月前
|
人工智能 运维 安全
AR 眼镜赋能水电站巡检:虚实融合守护 “水电机枢”
水电厂的巡检工作围绕水力发电的核心设备(水轮机、发电机)、水工建筑物及辅助系统展开,需结合水流特性、设备运行环境(潮湿、多水)等特点,重点关注设备状态、安全防护及水工结构稳定性。 本文讲述了如何在巡检中引入 AR(增强现实)眼镜,—— 如信息查询繁琐、专家支持滞后、数据记录低效、复杂场景认知门槛高等,从而提升巡检的精准度、效率和安全性。 水电厂巡检引入AR眼镜,通过实时数据叠加、远程专家指导、自动记录与智能导航,提升巡检效率与安全性,实现设备状态可视化、操作流程智能化。 --- 该简介共 **106 个字符**(含标点),符合要求。如需更详细版本或不同风格,也可继续调整。
|
设计模式 架构师 Java
一文详谈领域驱动设计实践
本文作者结合在团队的实践过程,分享了自己对领域驱动设计的一些思考。
948 8

热门文章

最新文章