软件测试修炼之路 A Tester

Dubbo接口调用

2018-05-29
Dex

互联网微服务时代,Dubbo框架是最火的框架之一,那服务端测试Dubbo接口成为一项比较重要的技能点

Dubbo是什么

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

其核心部分包含:

  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

编写一个Dubbo Demo

参考http://dubbo.apache.org/首页的例子,写完之后就有一个大概的应用框架知识了。

调用Dubbo接口的三种方式

API配置-点对点直连

参考:http://dubbo.apache.org/books/dubbo-user-book/configuration/api.html

pom.xml依赖: com.alibaba dubbo 2.5.3

代码调用Dubbo接口:

package Dubbo;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.xxx.xxx.xxx.xxxx.helper.OrderHelper;

public class DubboInvoke {
    public static void main(String[] args) {
        ApplicationConfig application = new ApplicationConfig();// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
        application.setName("itest");

        ReferenceConfig<OrderHelper> reference = new ReferenceConfig<OrderHelper>();
        reference.setApplication(application);

		// 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心,
		// 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值,
		// 路径对应service.setPath()的值,如果未设置path,缺省path为接口名
        reference.setUrl(String.format("dubbo://%s:%s/","10.10.10.2","20888"));
        reference.setVersion("1.0.0");
        reference.setTimeout(10000);
        reference.setInterface("com.xxx.xxx.xxx.xxxx.helper.OrderHelper");
        OrderHelper orderHelper = reference.get();
        System.out.println(orderHelper.getById(1147512345672545L).getOrderId());
    }
}

上述例子中,com.xxx.xxx.xxx.xxxx.helper.OrderHelper即为一个Dubbo接口,getById()是其一个方法;

telnet连接

在xshell中进入指定机器,如10.10.10.2,然后输入命令

指令1: telnet 10.10.10.2 20888
指令2:ls
指令3:invoke com.xxx.xxx.xxx.xxxx.helper.OrderHelper.getById(1147512345672545L)

XML配置

直连

pom.xml依赖: com.alibaba dubbo 2.5.3

dubbo-consumer.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="xxx-xxx-xxx-dubbo"/>
    <dubbo:reference id="OrderHelper" interface="com.xxx.xxx.xxx.xxxx.helper.OrderHelper" version="1.0.0" url="dubbo://10.10.10.2:20888"/>
    <dubbo:reference id="OrderHelper" interface="com.xxx.xxx.xxx.xxxx.helper.OrderHelper" version="1.0.0" />
</beans>

DubboXml.java代码开始调用:

package Dubbo;

import com.xxx.xxx.xxx.xxxx.helper.OrderHelper;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DubboXml {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[]{"spring/dubbo-consumer.xml"});
        context.start();
        OrderHelper orderHelper = (OrderHelper) context.getBean("OrderHelper");
        System.out.println(orderHelper.getById(1147511234772545L).getOrderId());
    }
}

通过注册中心连接

pom.xml依赖:

    <dependency>
        <groupId>com.xxx.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>3.0.2-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.12.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.9.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-client</artifactId>
        <version>2.9.1</version>
    </dependency>

dubbo-consumer.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="xxx-xxx-xxx-dubbo"/>
    <dubbo:registry protocol="zookeeper" address="zktest1.service.xxdns.cn:2181" group="xxx_services_betab" id="aaaaaa" client="curator"/>
    <dubbo:reference id="OrderHelper" interface="com.xxx.xxx.xxx.xxxx.helper.OrderHelper" version="1.0.0" registry="aaaaaa" />
</beans>

DubboXml.java代码:

package Dubbo;

import com.xxx.xxx.xxx.xxxx.helper.OrderHelper;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DubboXml {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[]{"spring/dubbo-consumer.xml"});
        context.start();
        OrderHelper orderHelper = (OrderHelper) context.getBean("OrderHelper");
        System.out.println(orderHelper.getById(1147511234772545L).getOrderId());
    }
}

Similar Posts

上一篇 HttpClient教程

Comments