以 SpingBoot 下使用 Dubbo 为例,被 Dubbo 的 @Service 注解修饰的服务,会按照 Spring 中初始化 Bean 的顺序,串行执行发布逻辑。Dubbo 框架会完成一系列的操作:
-
创建远程调用的 Proxy
-
把代理对象注册到 ProviderConsumerRegTable,方便远程调用到来时寻找到对应的服务
-
向注册中心注册
一旦服务信息注册到注册中心,在消费者看来该服务就是可以被调用的。然而,此时可能出现一些数据库、缓存资源尚未加载完毕的场景,这取决于你的系统有没有对应的组件,它们何时加载完毕,也完全取决于你的业务。如果你担心你的系统存在这种隐患,可以尝试多次重启集群中的任意一台机器,查看调用方是否存在报错,如果有报错,一种可能性是没有实现优雅停机,一种可能性是没有实现优雅上线。
Dubbo 服务暴露的起点一般是以 Spring 容器启动完毕后发出的 ContextRefreshedEvent 事件为准,Dubbo 的 ServiceBean 实现了 ApplicationListener 接口,用以接收这一容器刷新事件。
public void onApplicationEvent(ContextRefreshedEvent event) {
// 是否有延迟导出 && 是否已导出 && 是不是已被取消导出
if (isDelay() && !isExported() && !isUnexported()) {
// 导出服务
export();
}
}
Dubbo 为服务提供了 delay 配置:
<dubbo:service delay=“5000” />
如上配置后,Dubbo 服务将会在 Spring 容器启动后 5s,再执行暴露逻辑。这里 delay 的时长,取决于你系统资源初始化的耗时,没有一个经验值。如果不配置改值,Dubbo 将会在收到 ContextRefreshedEvent 事件后,立即执行发布逻辑。
Dubbo 2.6.5 版本对服务延迟发布逻辑进行了细微的调整,将需要延迟暴露(delay > 0)服务的倒计时动作推迟到了 Spring 初始化完成后进行。在此之前的版本的逻辑不太合理,如果想要让 2.6.5 之前的版本延迟到Spring 初始化完成后,再暴露服务,可以这样配置:
本节参考 Dubbo 官方文档
延迟暴露:http://dubbo.apache.org/zh-cn/docs/user/demos/delay-publish.html
Dubbo 还为服务提供了另一个配置项:
<dubbo:service register=“false” />
该配置项配置后,服务将不会发布到注册中心,可能很多 Dubbo 用户不会注意到这个配置,它的作用恰恰是 QOS 指令使用的。
Dubbo 2.5.8 及以上的版本,还提供了一些在线运维命令。为了演示该命令,我们准备一个 GreetingService 的 demo:
public class DubboProvider {
public static void main(String[] args) throws Exception {
ServiceConfig service = new ServiceConfig<>();
service.setApplication(new ApplicationConfig(“dubbo-provider”));
service.setRegistry(new RegistryConfig(“nacos://127.0.0.1:8848”));
service.setInterface(GreetingsService.class);
service.setRef(new GreetingsServiceImpl());
service.setRegister(false);
service.export();
System.out.println(“dubbo service started”);
new CountDownLatch(1).await();
}
}
注意我们配置了不发布:service.setRegister(false),由于 QOS 配置是默认打开的,在本地的 22222 端口,可以进入 QOS 控制台。
krito git:(master) ✗ telnet localhost 22222
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
/ _ \ / / / // _ ) / _ ) / __ \
/ // // // // _ |/ _ |/ // /
// _///// ___/
dubbo>ls
As Provider side:
±------------------------------------±–+
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!
金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
va 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。**
[外链图片转存中…(img-27FQi4id-1711868081229)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!