互联网微服务时代,Dubbo框架是最火的框架之一,那服务端测试Dubbo接口成为一项比较重要的技能点
Dubbo是什么
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
- 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
- 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
- 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
编写一个Dubbo Demo
参考http://dubbo.apache.org/首页的例子,写完之后就有一个大概的应用框架知识了。
调用Dubbo接口的三种方式
API配置-点对点直连
参考:http://dubbo.apache.org/books/dubbo-user-book/configuration/api.html
pom.xml
依赖:
代码调用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
依赖:
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());
}
}