Dubbo2.7服务暴露源码阅读笔记(未完)

服务暴露整体分为三部分,首先组装参数,构建URL,然后进入服务暴露逻辑,最后是向注册中心注册服务。入口就是ServiceBean的onApplicationEvent方法,因为实现了ApplicationListener接口,在spring容器refresh之后就会触发这段逻辑,进入服务暴露的逻辑。

这里判断是否设置了延迟暴露、是否已经被导出、是否不支持导出。我看了下2.7版本,这里的isDelay判断已经删除掉了,因为export里面已经有延迟暴露相关的判断了,这里的注释是无意义的。

public void onApplicationEvent(ContextRefreshedEvent event) {
   
        if (isDelay() && !isExported() && !isUnexported()) {
   
            if (logger.isInfoEnabled()) {
   
                logger.info("The service ready on spring started. service: " + getInterface());
            }
            export();
        }
    }

进入export方法
从providerConfig里面读取判断export和delay属性,如果配置了服务不暴露或者已经暴露过,直接return,如果配置了延迟暴露,有一个调度线程池进行调度,单位是毫秒。

public synchronized void export() {
   
       if (provider != null) {
   
           if (export == null) {
   
               export = provider.getExport();
           }
           if (delay == null) {
   
               delay = provider.getDelay();
           }
       }
       if (export != null && !export) {
   
           return;
       }
       if (delay != null && delay > 0) {
   
           delayExportExecutor.schedule(new Runnable() {
   
               public void run() {
   
                   doExport();
               }
           }, delay, TimeUnit.MILLISECONDS);
       } else {
   
           doExport();
       }
   }

进入doExport方法,分段阅读
1、同样判断是否支持暴露和是否已经暴露,如果支持暴露并且没有暴露过,将exported成员变量设置为true,标记已经暴露。校验接口名称是否为空,最后checkDefault方法拼接属性。

 if (unexported) {
   
            throw new IllegalStateException("Already unexported!");
        }
        if (exported) {
   
            return;
        }
        exported = true;
        if (interfaceName == null || interfaceName.length() == 0) {
   
            throw new IllegalStateException("<dubbo:service interface=\"\" /> interface not allow null!");
        }
        checkDefault();

2、进入checkDefault方法,获取provider相关标签解析出来的内容,调用一个所有config公用的方法appendProperties,主要作用是用来拼接环境变量和properties属性。

  private void checkDefault() {
   
        if (provider == null) {
   
            provider = new ProviderConfig();
        }
        appendProperties(provider);
    }

2.1、进入appendProperties方法,获取前缀prefix,getTagName方法的作用是获取类名的前缀,比如当前config是serviceConfig,那么前缀就是service,获取到的前缀类似dubbo.service.

protected static void appendProperties(AbstractConfig config) {
   
        if (config == null) {
   
            return;
        }
        String prefix = "dubbo." + getTagName(config.getClass()) + ".";
        Method[] methods = config.getClass().getMethods();

2.2、这里可以看到获取到了config配置类的全部方法,并筛选出全部的setter方法、且方法里面只有一个参数,且是基本数据类型。

 for (Method method : methods) {
   
            try {
   
                String name = method.getName();
                if (name.length() > 3 && name.startsWith("set") && Modifier.isPublic(method.getModifiers()) 
                        && method.getParameterTypes().length == 1 && isPrimitive(method.getParameterTypes()[0])) {
    // 方法的唯一参数是基本数据类型
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值