dubbo服务调用者的三种调用过程

 更新时间:2026年01月16日 08:45:19   作者:辰辰浩  
文章主要介绍了在Dubbo框架中进行服务调用的几种常见方法,包括使用注解、在XML中注册服务实例以及泛化调用

1、使用注解

@Referenc 或 @DubboReference(2.2.7版本以后)

	@Reference
    DubboTestService dubboTestService;
	
/*  @DubboReference
    DubboTestService dubboTestService;*/
	
    @GetMapping(value = "/dubbo/getInfo")
    public Map<String, Object> cachePermissions(String id) {
       return dubboTestService.getInfo(id);
    }
	

2、将服务实例在 applicationContext.xml 文件中注册 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo
       http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.lyj.service"></context:component-scan>

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,可自定义 -->
    <dubbo:application name="spring-consumer"  />

    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 监控中心监控设置,直连监控中心服务器地址或者从注册中心发现 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
    <!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> -->

    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="dubboTestService" interface="com.dubbo.service.dubboTestService" loadbalance="consistenthash" timeout="30000" />

</beans>

服务调用时可通过继承ApplicationContextAware,获取spring容器内的实例

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @description: ApplicationContextProvider 通过context获取目标原型
 **/
@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        this.applicationContext = applicationContext;
    }

    /**
     * 通过name获取 Bean.
     *
     * @param name
     * @return
     */
    public static Object getBean(String name) {

        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz) {

        return getApplicationContext().getBean(clazz);
    }

}

调用服务时只需要

Object bean = ApplicationContextProvider.get(dubboTestService)//值取自<dubbo:reference里注册的 id
String method = "getInfo";//需要调用的方法名
Class<?> parameterTypes = Class.forName("java.lang.String");//method的参数类型的列表(参数顺序需按声明method时的参数列表排列),可含有多个,取决于该方法
Method met= bean.getClass().getMethod(method, parameterTypes);
Object resp= met.invoke(bean, id); //resp返回值 id为method方法的参数

3、泛化 

创建服务调用类   借鉴 dubbo-samples

import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.rpc.service.GenericService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class DubboServiceGeneric {

    public static final Logger logger = LoggerFactory.getLogger(DubboServiceGeneric.class);

    @Value("${dubbo.cloud.subscribed-services}")
    public String applicationName;

    @Value("${dubbo.registry.address}")
    public String dubboRegistryAddress;


    public Object invoke(String interfaceName, String version, String metName, String[] paramsClass, Object[] paramsValues) {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName(applicationName);
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress(dubboRegistryAddress);
        ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(interfaceName);
        referenceConfig.setVersion(version);
        applicationConfig.setRegistry(registryConfig);
        referenceConfig.setApplication(applicationConfig);
        referenceConfig.setGeneric("true");
        referenceConfig.setAsync(true);
        referenceConfig.setTimeout(7000);

        GenericService genericService = referenceConfig.get();
        Object o = genericService.$invoke(metName, paramsClass, paramsValues);
        return o;
    }
}

调用时只需要

@Autowired
DubboServiceGeneric dubboServiceGeneric;

String s = "";//s为method方法的参数
String getInfo = dubboServiceGeneric.invoke("com.dubbo.service.DubboTestService", "1.0.0", "getInfo", s);//1.0.0为版本号 

对应的服务提供者为

import com.dubbo.service.DubboTestService;
import org.apache.dubbo.config.annotation.Service;

@Service(version = "1.0.0")
public class DubboTestServiceImpl implements DubboTestService {


    @Autowired
    GatewayComponentMapper gatewayComponentMapper;

    @Override
    public Map<String, String> getInfo(Object json) {
        List<GatewayComponentDTO> dtos = gatewayComponentMapper.selectList(new QueryWrapper<>());
        HashMap<String, String> map = new HashMap<>();
        map.put("info", JSON.toJSONString(dtos));
        return map;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java通过value获取Map中key的三种实现过程

    Java通过value获取Map中key的三种实现过程

    本文介绍了三种通过Value值获取Map中的Key值的方法:循环法、Stream方法和ApacheCommonsCollections的BidiMap,每种方法都有其特点和适用场景,选择哪种方法应根据具体需求来决定
    2026-01-01
  • SpringBoot防止消息重复消费的方法步骤

    SpringBoot防止消息重复消费的方法步骤

    这段文章详细介绍了消息队列中消息重复消费的问题及解决方案,重点讲解了Redis唯一ID防重、数据库唯一索引防重、业务状态机防重和全局唯一约束防重四种方案,适合不同业务场景和并发量的需求,需要的朋友可以参考下
    2026-05-05
  • spring boot 2.x html中引用css和js失效问题及解决方法

    spring boot 2.x html中引用css和js失效问题及解决方法

    这篇文章主要介绍了spring boot 2.x html中引用css和js失效,需要的朋友可以参考下
    2018-11-11
  • Java 生成图片验证码3种方法(字母、加减乘除、中文)

    Java 生成图片验证码3种方法(字母、加减乘除、中文)

    这篇文章主要介绍了Java 生成图片验证码3种方法(字母、加减乘除、中文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • SpringCloud Eureka的使用教程

    SpringCloud Eureka的使用教程

    这篇文章主要给大家介绍了关于SpringCloud Eureka使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 微信公众号支付(一)如何获取用户openId

    微信公众号支付(一)如何获取用户openId

    本篇文章给大家介绍微信公众号支付如何获取用户openid,需要授权回调页面域名等一系列途径实现此功能,需要的朋友可以参考下
    2015-09-09
  • Nacos集群模式下服务无法注册问题

    Nacos集群模式下服务无法注册问题

    这篇文章主要介绍了Nacos集群模式下服务无法注册问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 图解Java经典算法插入排序的原理与实现

    图解Java经典算法插入排序的原理与实现

    插入排序的算法描述是一种简单直观的排序算法。其原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。本文将用Java语言实现插入排序算法并进行可视化,感兴趣的可以了解一下
    2022-09-09
  • 解决Java中基于GeoTools的Shapefile读取乱码的问题

    解决Java中基于GeoTools的Shapefile读取乱码的问题

    本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属性信息解析的方法,感兴趣的朋友跟随小编一起看看吧
    2025-03-03
  • 使用import导入静态成员的方法

    使用import导入静态成员的方法

    这篇文章主要介绍了浅谈使用import导入静态成员,需要的朋友可以参考下。
    2017-09-09

最新评论