Dubbo:@DubboService和@Service、@DubboReference和@Reference的区别和关系

2023-05-16

目录

  • 前言
  • 1.不同时间的三组注解
  • 2.注解的升级
    • 2.1 @Reference
      • 2.1.1 Alibaba @Reference -> Apache @Reference
        • 2.1.1.1 注解升级
        • 2.1.1.2 属性增加
      • 2.1.2 @Reference -> @DubboReference
        • 2.1.2.1 注解升级
        • 2.1.2.2 属性增加
    • 2.2 @Service
      • 2.2.1 Alibaba @Service -> Apache @Service
        • 2.2.1.1 注解升级
        • 2.2.1.2 属性修改与增加
      • 2.2.2 @Service -> @DubboService
        • 2.2.1.1 注解升级
  • 3.注解在源码中的整合
    • 3.1 源码解析
      • 3.1.1 @Reference家族
      • 3.1.2 @Service家族
    • 3.2 使用方式
      • 3.2.1 @DubboReference 引用服务
      • 3.2.2 @DubboService 暴露服务
  • 4.总结

前言

大家春节假期好哦,我是内个内个内个内个内个内~~~~

1.不同时间的三组注解

在旧版本中,Dubbo使用自己的@Service、@Referenc注解来标注服务与引用。
或许是想与spring等框架的注解区分开,在2.7.7版本后,源码中的@Service、@Referenc被打上了@Deprecated注解,它们被使用的地方都被拦腰打上了横线,表示不建议使用。
在这里插入图片描述
定位到它们所在路径,发现总共有三种相似的注解

在这里插入图片描述
其实它们是Dubbo的三个不同时期的产物,它们的全路径名称如下

// 2.7.x 之前,Alibaba时期
com.alibaba.dubbo.config.annotation.Reference
com.alibaba.dubbo.config.annotation.Service

// 2.7.0之后,Apache时期
org.apache.dubbo.config.annotation.Reference
org.apache.dubbo.config.annotation.Service

// 2.7.7之后
org.apache.dubbo.config.annotation.DubboReference
org.apache.dubbo.config.annotation.DubboService

2.注解的升级

2.1 @Reference

@Reference 相关注解用来引用服务

2.1.1 Alibaba @Reference -> Apache @Reference

2.1.1.1 注解升级

新增注解,路径从com.alibaba变成org.apache,旧注解打上@Deprecated

2.1.1.2 属性增加

2.7.0的Apache版本,比Alibaba的@Reference注解多了protocol、tags、methods、id五个属性,这次升级后,开发者可以做通过protocol指定协议等操作。
在这里插入图片描述

2.1.2 @Reference -> @DubboReference

2.1.2.1 注解升级

2.2.7版本,主要是新注解名称加上Dubbo前缀,显得更直观,旧注解打上@Deprecated
在这里插入图片描述

2.1.2.2 属性增加

同时增加了merger、services属性
在这里插入图片描述

2.2 @Service

@Service 相关注解用来暴露服务

2.2.1 Alibaba @Service -> Apache @Service

2.2.1.1 注解升级

新增注解,路径从com.alibaba变成org.apache,旧注解打上@Deprecated

2.2.1.2 属性修改与增加

2.7.0的Apache版本,
将export、register的默认值从false改为true,
将回调callbacks默认值从空改为1,
将重试次数retries默认值从空改为2
将负载均衡loadbalance默认值从空改为rodom随机
增加了methods、id两个属性
在这里插入图片描述

2.2.2 @Service -> @DubboService

2.2.1.1 注解升级

2.2.7版本,主要是新注解名称加上Dubbo前缀,显得更直观,旧注解打上@Deprecated,属性一点没改,改名的目的很单纯

3.注解在源码中的整合

首先不用多想,dubbo应该支持这三种注解,在老项目升级后也应该兼容老注解,那到底是不是这样,有两种验证方式:源码分析或使用新注解验证实际效果

3.1 源码解析

3.1.1 @Reference家族

查看@DubboReference被使用的地方,除了测试类,只在ReferenceAnnotationBeanPostProcessor中出现,可以看出,此@Reference家族的三个注解都在ReferenceAnnotationBeanPostProcessor的构造方法中,被传入此类继承的AbstractAnnotationBeanPostProcessor构造方法中,所以这三个注解是被一视同仁的,在Spring项目中,不论使用三个之中哪种注解,都归ReferenceAnnotationBeanPostProcessor管,都会被一视同仁。
在这里插入图片描述

	//ReferenceAnnotationBeanPostProcessor:
	/**
     * {@link com.alibaba.dubbo.config.annotation.Reference @com.alibaba.dubbo.config.annotation.Reference} has been supported since 2.7.3
     * <p>
     * {@link DubboReference @DubboReference} has been supported since 2.7.7
     */
    public ReferenceAnnotationBeanPostProcessor() {
    	//直接传入父构造器
        super(DubboReference.class, Reference.class, com.alibaba.dubbo.config.annotation.Reference.class);
    }
    
    //AbstractAnnotationBeanPostProcessor:
	/**
     * @param annotationTypes the multiple types of {@link Annotation annotations}
     */
    public AbstractAnnotationBeanPostProcessor(Class<? extends Annotation>... annotationTypes) {
        Assert.notEmpty(annotationTypes, "The argument of annotations' types must not empty");
        //三个注解都放在annotationTypes中
        this.annotationTypes = annotationTypes;
    }

	//annotationTypes三种类型再其他地方被如下逻辑挨个被使用
	for (Class<? extends Annotation> annotationType : getAnnotationTypes()) {

                    AnnotationAttributes attributes = getAnnotationAttributes(bridgedMethod, annotationType, getEnvironment(), true, true);
    // ******
    }

ReferenceAnnotationBeanPostProcessor就不展开了,说跑偏了。
在这里插入图片描述

3.1.2 @Service家族

@Service家族分别在ServiceAnnotationResolver和ServiceClassPostProcessor中被使用,三者被一视同仁,查看源码的逻辑参考上一个@Reference家族的讲解

public class ServiceAnnotationResolver {

    /**
     * The annotation {@link Class classes} of Dubbo Service (read-only)
     *
     * @since 2.7.9
     */
    public static List<Class<? extends Annotation>> SERVICE_ANNOTATION_CLASSES = unmodifiableList(asList(DubboService.class, Service.class, com.alibaba.dubbo.config.annotation.Service.class));
    // ******
}
public class ServiceClassPostProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware,
        ResourceLoaderAware, BeanClassLoaderAware {

    private final static List<Class<? extends Annotation>> serviceAnnotationTypes = asList(
            // @since 2.7.7 Add the @DubboService , the issue : https://github.com/apache/dubbo/issues/6007
            DubboService.class,
            // @since 2.7.0 the substitute @com.alibaba.dubbo.config.annotation.Service
            Service.class,
            // @since 2.7.3 Add the compatibility for legacy Dubbo's @Service , the issue : https://github.com/apache/dubbo/issues/4330
            com.alibaba.dubbo.config.annotation.Service.class
    );
    //******
}

3.2 使用方式

源码自带使用方式

3.2.1 @DubboReference 引用服务

package org.apache.dubbo.demo.consumer.comp;

import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.demo.DemoService;

import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;

@Component("demoServiceComponent")
public class DemoServiceComponent implements DemoService {
    @DubboReference
    private DemoService demoService;

    @Override
    public String sayHello(String name) {
        return demoService.sayHello(name);
    }

    @Override
    public CompletableFuture<String> sayHelloAsync(String name) {
        return null;
    }
}

3.2.2 @DubboService 暴露服务

package org.apache.dubbo.demo.provider;

import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.demo.DemoService;
import org.apache.dubbo.rpc.RpcContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CompletableFuture;

@DubboService
public class DemoServiceImpl implements DemoService {
    private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);

    @Override
    public String sayHello(String name) {
        logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
    }

    @Override
    public CompletableFuture<String> sayHelloAsync(String name) {
        return null;
    }

}

4.总结

总之来说,@DubboService与@Service、@DubboReference与@Referenc的关系就是更新换代,在使用方式和功能上基本一样,最新的注解是加Dubbo前缀的,使用起来更直观一些

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo:@DubboService和@Service、@DubboReference和@Reference的区别和关系 的相关文章

  • mybatis-plus条件构造器以及QueryWrapper用法学习

    QueryWrapper的基本用法 话不多说 xff0c 直接上代码 更多使用方法传送门 span class token keyword public span span class token keyword void span spa
  • linux下安装aMule

    linux下安装aMule 在Linux下安装aMule xff0c 亲测有效 xff0c 话不多说 xff0c 直接上命令 cd span class token operator span opt span class token op
  • idea中debug启动项目特别慢的解决方法

    问题描述 问题 xff1a idea中使用debug方式启动项目 xff0c 原本30s不到的启动时间 xff0c 现在启动的时间超过了3分钟甚至更久 我自己的问题以及解决方案 xff0c 你们也有可能是其他原因 我本人的问题是因为打了太多
  • MacBook安装jdk1.8方便快捷稳定的方法

    MacBook安装jdk方便快捷稳定的方法 最简单快捷的jdk1 8安装 先查看有没有安装jdk xff1a java version 这样就是没有安装 然后去官网下载 下载地址 xff1a https www java com zh CN
  • RubyMine创建第一个ruby项目并运行

    第一步 xff1a 创建一个项目 RubyMine已分享网盘 xff1a 链接 https pan baidu com s 1MTbjYmuS1SxrgR1wBAmsoA pwd 61 5dh3 提取码 5dh3 Location xff1
  • 创建一个rails入门项目并运行

    创建第一个rails项目 从java转到ruby xff0c 正在学习中 xff0c 创建第一个rails项目 xff0c 做一些记录 首先要检查一下前置条件 检查是否安装ruby xff1a ruby version 我这里是已经安装了
  • rails/ruby字符串与数组之间的转换

    rails ruby字符串与数组之间的转换 初步接触ruby xff0c 点点滴滴记录下来 xff0c 希望能帮助同样是新加入ruby的同学 字符串与数组之间的转换 span class token comment ruby字符串转数组 s
  • this is incompatible with sql_mode=only_full_group_by解决方案

    MySQL查询时报错 xff1a this is incompatible with sql mode 61 only full group by 报错原因分析 xff1a 一 原理层面 这个错误发生在mysql 5 7 5 版本及以上版本
  • macbook安装Redis客户端another-redis-desktop-manager

    macbook安装Redis客户端another redis desktop manager 不讲废话 xff0c 直接上命令 macbook下使用brew安装another redis desktop manager brew insta
  • ruby on rails读取excel文件完整流程

    前端上传excel文件 xff0c 后端读取文件并写入数据库 话不多说 xff0c 直接上代码 代码复制可直接使用 xff0c 经过多次测试验证 Gemfile文件中引入 xff1a gem span class token string
  • vue3 + vite + ts + setup , 第二十一练 vue3 中使用函数式编程,h函数(一)

    之前跟大家介绍了两种vue编写风格分别是template模板方式 xff0c 和JSX方式感觉JSX被大家吐槽的很厉害 xff0c 其实用习惯还挺好用的今天介绍第三种函数式编程 主要会用到h函数 h 函数是一个用于创建 VNode 的实用程
  • 线程安全与实现方法

    线程安全 文章目录 线程安全线程安全的定义线程安全的分类补充 xff1a this引用逃逸什么是this引用逃逸逃逸场景场景一场景二 解决方案 线程安全的实现互斥同步 xff08 阻塞同步 xff09 实现举例 非阻塞同步实现举例 无同步方
  • github api 连接出错的几种情况和解决办法

    网络连接正常 xff0c github也能连接 xff0c 但是idea terminal 将代码push到远端时无法与github获取连接 情况一 使用git pus命令报错 fatal HttpRequestException enco
  • 【Proteus仿真】| 05——问题记录

    系列文章目录 Proteus仿真 01 软件安装 Proteus仿真 02 基础使用 Proteus仿真 03 超详细使用教程 Proteus仿真 04 绘制原理图模板 Proteus仿真 05 问题记录 文章目录 前言1 51单片机仿真2
  • 在Winxp虚拟机上安装Vxworks虚拟机,完成VxWorks_Tornado开发环境搭建

    前言 关于在虚拟机上安装虚拟机的做法并不普遍 xff0c 因为其实用性并不大 xff0c 对于很多人来说 xff0c 并没有必要再虚拟机上安装虚拟机 xff0c 以来这种做法确实很浪费内存资源 xff0c 二来没有具体的实用价值 因为主机装
  • centos7 搭建httpd服务

    查看是否有httpd root 64 Cheney yum list httpd 已加载插件 xff1a fastestmirror langpacks Loading mirror speeds from cached hostfile
  • 邮件系统被退回的原因及解决办法

    邮件为什么会被退回经常上网发送邮件的人可能会有邮件被退回的经历 xff0c 收到被退回的邮件要具体分析 xff0c 退回的信件一般都会有简短的说明 xff0c 结合这些说明你可以进一步了解具体的退信原因并作出相应处理 一 退信由哪些内容组成
  • Java lambda List,树数据处理工具类

    前言 再日常的业务开发中 xff0c 常少不了list for循环处理 在查询mysql业务中 xff0c 通常不会在for循环中去查询 xff0c 而是一次去查询符合条件的数据 xff0c 以避免频繁的释放和获取连接 xff0c 然后转成
  • Ubuntu配置jdk11及安装eclipse

    一 安装jdk 1 安装jdk sudo dpkg span class token operator span i jdk span class token operator span span class token number 11
  • Linux系统flameshot截图软件安装配置

    一 下载安装flameshot sudo apt install flameshot 二 配置 1 进入系统设置中的 键盘设置 2 页面中会列出所有现有的键盘快捷键 xff0c 拉到底部就会看见一个 43 按钮 3 点击 43 按钮添加自定

随机推荐