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;
    }
}

总结

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

相关文章

  • Mybatis之Mapper动态代理实例解析

    Mybatis之Mapper动态代理实例解析

    这篇文章主要介绍了Mybatis之Mapper动态代理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 浅谈线程通信wait,notify作用

    浅谈线程通信wait,notify作用

    这篇文章主要介绍了浅谈线程通信wait,notify作用,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Java中调用第三方接口的详细代码示例

    Java中调用第三方接口的详细代码示例

    这篇文章主要介绍了Java中调用第三方接口的详细代码示例,文章总结了多种Java进行HTTP请求的方法,每种方法都有其特点和适用场景,从原生到封装,再到声明式客户端,满足了不同复杂度的HTTP请求需求,需要的朋友可以参考下
    2024-12-12
  • springboot整合持久层的方法实现

    springboot整合持久层的方法实现

    本文主要介绍了springboot整合持久层的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java中构造函数,set/get方法和toString方法使用及注意说明

    Java中构造函数,set/get方法和toString方法使用及注意说明

    这篇文章主要介绍了Java中构造函数,set/get方法和toString方法的使用及注意说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Java语言ReadWriteLock特性实例测试

    Java语言ReadWriteLock特性实例测试

    这篇文章主要介绍了Java语言ReadWriteLock特性实例测试,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • SpringSecurity集成第三方登录过程详解(最新推荐)

    SpringSecurity集成第三方登录过程详解(最新推荐)

    在ThirdAuthenticationFilter 类的attemptAuthentication()方法中,我们通过authType类型,然后创建对应的Authentication实现来实现不同方式的登录,下面给大家分享SpringSecurity集成第三方登录过程,感兴趣的朋友一起看看吧
    2024-05-05
  • Spring注解驱动开发实现属性赋值

    Spring注解驱动开发实现属性赋值

    这篇文章主要介绍了Spring注解驱动开发实现属性赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Springboot启动原理详细讲解

    Springboot启动原理详细讲解

    这篇文章主要介绍了SpringBoot启动原理的分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java邮件乱码的彻底解决方案

    java邮件乱码的彻底解决方案

    在本篇文章里小编给大家整理的是关于java邮件乱码的彻底解决方案,需要的朋友们可以学习下。
    2019-12-12

最新评论