前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从Bean的生命周期分析Dubbo的源码

从Bean的生命周期分析Dubbo的源码

作者头像
CBeann
发布2023-12-25 19:52:15
960
发布2023-12-25 19:52:15
举报
文章被收录于专栏:CBeann的博客CBeann的博客

写作目的

Dubbo作为RPC中的经典落地实践,作为阿里内部目前还是大规模使用的基础框架,作为CRUD的底层。无论从什么角度来看简单的阅读一下Dubbo的源码还是有必要的。

前提:要了解Bean的生命周期

源码下载

gitee源码下载

源码分析

请添加图片描述
请添加图片描述

开启Dubbo引入了什么

以SpringBoot整合Dubbo为例,我们会使用以下注解

代码语言:javascript
复制
@EnableDubbo

该注解是符合注解,引入了一堆用于Spring提供的拓展点用于加载Dubbo的拓展点类,类的作用可以看上面的图。

代码语言:javascript
复制
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@EnableDubboConfig
@DubboComponentScan
public @interface EnableDubbo {
}
在这里插入图片描述
在这里插入图片描述

服务提供者怎么暴露

一般我们对外暴露服务会使用DubboService注解

代码语言:javascript
复制
@DubboService(interfaceClass = CreativeCommandService.class)
public class CreativeServiceImpl implements CreativeCommandService {
    @Override
    public Integer creativeCreative(CreativeDTO creativeDTO) {
        System.out.println(LocalDateTime.now().toString());
        return 9527;
    }
}

那么注解是被谁使用被谁拦截(对比Autowired)呢?

代码语言:javascript
复制
@DubboService(interfaceClass = CreativeCommandService.class)

在上面中提到了ServiceAnnotationPostProcessor(运行时机见上图)。 首先我们是知道Spring是有办法拿到有注解的DubboService的用户自定义的class的,然后重新定义一个拓展的Dubbo自定义的class。这个class就是org.apache.dubbo.config.spring.ServiceBean

在这里插入图片描述
在这里插入图片描述

ServiceBean的生命周期中做了什么

首先我们可以看一下这个类继承了哪些接口

代码语言:javascript
复制
public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean,
        ApplicationContextAware, BeanNameAware, ApplicationEventPublisherAware {
        //省略
        }

继承了InitializingBean接口,把服务添加到某个地方,用于后续的批量发布。

代码语言:javascript
复制
    @Override
    public void afterPropertiesSet() throws Exception {
        if (StringUtils.isEmpty(getPath())) {
            if (StringUtils.isNotEmpty(getInterface())) {
                setPath(getInterface());
            }
        }
        //register service bean
        ModuleModel moduleModel = DubboBeanUtils.getModuleModel(applicationContext);
        //把需要暴露的服务加到某一个地方
        //把需要暴露的服务加到某一个地方
        //把需要暴露的服务加到某一个地方
        moduleModel.getConfigManager().addService(this);
        moduleModel.getDeployer().setPending();
    }

什么时候发布

上文有提到​​​DubboDeployApplicationListener,这个类会在IOC容器加载完毕后被通知到。最后调用ServiceBean#exported方法

在这里插入图片描述
在这里插入图片描述

当然具体的暴露细节可以在详细看,但是整体的思路还是很清晰。

总结

顶层设计,宏观思维。带着目的去看源码,看设计思路,不要陷入细节。 拓展点的设计。一个好的框架是会使用者足够的拓展点使其二开框架。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写作目的
  • 源码下载
  • 源码分析
    • 开启Dubbo引入了什么
      • 服务提供者怎么暴露
        • ServiceBean的生命周期中做了什么
          • 什么时候发布
          • 总结
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档