前两天刚好有个同事来问是否用过 dubbo泛化 调用,不需要通过指定配置。第一次听到的时候,还是有点懵,但觉得有意思,可以学点东西。

立马百度了,找了demo,这篇比较容易上手(http://www.cnblogs.com/lobo/p/7129119.html)。并结合 dubbo的官方文档(http://dubbo.io/user-guide/demos/%E6%B3%9B%E5%8C%96%E5%BC%95%E7%94%A8.html)写了个demo。

provider 直接引用了 dubbo官方文档中的例子。

接口:

public interface DemoService {
String sayHello(String name);
}

实现类:

public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}

配置文件 provider.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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app" /> <!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!--<dubbo:registry address="multicast://224.5.6.7:1234" />--> <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="persistence.dubbo.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="persistence.dubbo.impl.DemoServiceImpl" /> </beans>

启动类:

public class Provider {

    public static void main(String[] args) throws IOException {

        ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"classpath:provider.xml"});
// new ClassPathXmlApplicationContext(new String[] {"thread/src/main/resources/provider.xml"});
context.start(); System.in.read(); // 按任意键退出
}
}

结合 dubbo文档中的consumer 进行了测试,亲测可以调用成功。

然后进行 dubbo泛化调用测试。主要是通过 GenericService 来实现泛化调用。

 1 public class DubboServiceFactory {
2
3 private ApplicationConfig application;
4 private RegistryConfig registry;
5
6 private static class SingletonHolder {
7 private static DubboServiceFactory INSTANCE = new DubboServiceFactory();
8 }
9
10 private DubboServiceFactoryDemo(){
11 Properties prop = new Properties();
12 ClassLoader loader = DubboServiceFactory.class.getClassLoader();
13
14 try {
15 InputStream resourceAsStream = loader.getResourceAsStream("dubboconf.properties");
16 prop.load(loader.getResourceAsStream("dubboconf.properties"));
17 } catch (IOException e) {
18 e.printStackTrace();
19 }
20
21 ApplicationConfig applicationConfig = new ApplicationConfig();
22 //这个应该对应 <dubbo:registry id="${dubbo.registry.id}"/> 的id
23 //我这里测试随意些没关系
24 applicationConfig.setName("dubbo-test");
25 //这里配置了dubbo的application信息*(demo只配置了name)*,因此demo没有额外的dubbo.xml配置文件
26 RegistryConfig registryConfig = new RegistryConfig();
27 registryConfig.setAddress("zookeeper://127.0.0.1:2181");
28
29 this.application = applicationConfig;
30 this.registry = registryConfig;
31
32 }
33
34 public static DubboServiceFactoryDemo getInstance() {
35 return SingletonHolder.INSTANCE;
36 }
37
38 public Object genericInvoke(String interfaceClass, String methodName, List<Map<String, Object>> parameters){
39
40 ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
41 reference.setApplication(application);
42 reference.setRegistry(registry);
43 reference.setInterface(interfaceClass); // 接口名
44 reference.setGeneric(true); // 声明为泛化接口
45 // reference.setId("reportReadService");
46 //这里有version的必须注明
47 // reference.setVersion("1.0.0.test");
48
49 //ReferenceConfig实例很重,封装了与注册中心的连接以及与提供者的连接,
50 //需要缓存,否则重复生成ReferenceConfig可能造成性能问题并且会有内存和连接泄漏。
51 //API方式编程时,容易忽略此问题。
52 //这里使用dubbo内置的简单缓存工具类进行缓存
53
54 ReferenceConfigCache cache = ReferenceConfigCache.getCache();
55 GenericService genericService = cache.get(reference);
56 // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用
57
58 int len = parameters.size();
59 String[] invokeParamTyeps = new String[len];
60 Object[] invokeParams = new Object[len];
61 for(int i = 0; i < len; i++){
62 invokeParamTyeps[i] = parameters.get(i).get("ParamType") + "";
63 invokeParams[i] = parameters.get(i).get("Object");
64 }
65 return genericService.$invoke(methodName, invokeParamTyeps, invokeParams);
66 }
67
68 }

注:这里我把参数都直接写死了,Properties部分这里是没其作用。

这里笔者也有点没弄清楚classLoader.getResourceAsStream("dubboconf.properties"); 路径问题!!!!!!(需要课后补补课,查了一些也没太搞明白,有通俗易通的解释,麻烦和我说下,先谢过啦,)

测试类:(别忘启动zookeeper)

 1 @org.junit.Test
2 public void test1() {
3 Map map = new HashMap<>();
4 map.put("ParamType", "java.lang.String"); //后端接口参数类型
5 map.put("Object", "world"); //用以调用后端接口的实参
6
7 List<Map<String, Object>> paramInfos= new ArrayList<>();
8 paramInfos.add(map);
9
10 DubboServiceFactory dubbo = DubboServiceFactory.getInstance();
11
12 Object getReportResult = dubbo.genericInvoke("persistence.dubbo.DemoService", "sayHello", paramInfos);
13
14 System.out.println(getReportResult);
15
16 Map result = (Map) getReportResult;
17 }

dubbo泛化的小demo就这样完成了,应用到实际项目中,只要把参数提出来,写到配置文件就好了。

这里只是为了做个小demo,只是为了实现dubbo泛化调用功能,先动起来而已。其中有一些类、方法、参数的含义,需要自己再去深入了解。我本人也只是用了dubbo而已,很多东西也还没去深入学习。

 想养成写技术博客的习惯,从这里开始。目前格式排布还有很大改进,在后续中慢慢学习改变。欢迎大家指正!!

  

dubbo泛化调用 小demo的更多相关文章

  1. Dubbo 泛化调用的参数解析问题及一个强大的参数解析工具 PojoUtils

    排查了3个多小时,因为一个简单的错误,发现一个强大的参数解析工具,记录一下. 背景 Nodejs 通过 tether 调用 Java Dubbo 服务.请求类的某个参数对象 EsCondition 有 ...

  2. java 中的线程池和线程 调用小demo

    public class Main { public static void main(String[] args) { try { /// ThreadPoolExecutor executor = ...

  3. C#反射调用小DEMO

    程序集的源代码: namespace DesignMode { class IOCTest { public void TestO() { Console.WriteLine("O方法&qu ...

  4. dubbo接口泛化调用例子

    @ApiOperation(value = "dubbo泛化调用工具接口") public Result dubboApiTool( @ApiParam(value = " ...

  5. iOS11 SDK 新特性 CoreML 及swift 小demo

    github代码 如果本博客对您有帮助,希望可以得到您的赞赏! swift 机器学习Core ML的简单调用小demo.完整代码附上: https://github.com/Liuyubao/LYBC ...

  6. Dubbo高级特性实践-泛化调用

    引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

  7. Dubbo基本特性之泛化调用

    Dubbo 是支持泛化调用的,什么是泛化调用呢?泛化调用的好处是什么呢,泛化调用说白一点就是服务消费者并没有服务的接口. 在<Dubbo入门-搭建一个最简单的Demo框架>一文中,我们已完 ...

  8. Dubbo 高级特性实践-泛化调用

    引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

  9. Dubbo学习笔记4:服务消费端泛化调用与异步调用

    本文借用dubbo.learn的Dubbo API方式来解释原理. 服务消费端泛化调用 前面我们讲解到,基于Spring和基于Dubbo API方式搭建简单的分布式系统时,服务消费端引入了一个SDK二 ...

随机推荐

  1. MySQL 字符串索引优化方案

    字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: 直接对整个字符串建立索引 alter table SUser add in ...

  2. 一.3.序列化使用之idc资源与api文档

    前后端分离,前端写前端的,后端写后端的,但是它们中间得有一个api文档 1.idc资源 (1)models.py: from django.db import models class Idc(mod ...

  3. 2020年学习目标之一——emacs

    这两天在虚机里面安装了centos7(gnome),决定后续自己的学习一直在这个里面进行,对于编辑器我最后选择了emacs,新手一枚,不过正好也算是今年的一项学习目标吧,加油! (完)

  4. NuGet 应用指南

     一.前言 在产品开发过程中,一点有很多类库:这么多类库大家是如何管理的呢,TFS.SVN.Github……?在开发人员使用对应类库是否存在类库引用路径不一致.版本不一致问题.依赖类库版本不对应等一些 ...

  5. 数据库基础01-SQL基础语法

    数据库查询语言(Structured Query Language) 数据库查询语言: DDL(data definition language) -数据定义语言,建库建表 DML (data man ...

  6. Python 之父说 Python 历史

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:鸿影洲冷 这篇文章主要内容来源于 Python 编程语言的最初设计者 ...

  7. 手写一个React-Redux,玩转React的Context API

    上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...

  8. flask 源码专题(三):请求上下文和应用上下文入栈与出栈

    1.请求上下文和应用上下文入栈 # 将ctx入栈,但是内部也将应用上下文入栈 ctx.push() def push(self): # 获取到的 top == ctx top = _request_c ...

  9. SpringBoot2 整合JTA组件,多数据源事务管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个 ...

  10. 分布式任务调度平台XXL-JOB快速搭建教程

    1. XXL-JOB简介 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用.它的有两个核心模块,一个模块叫做 ...