Dubbo入门程序直连式
1 什么是Dubbo?
摘自百度:
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC
实现服务的输出和输入功能,可以和 [1] Spring框架无缝集成。 Dubbo是一款高性能、轻量级的开源Java
RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
1.1 业务场景
在实际开发中,经常会出现这样的场景:A项目需要调用B项目的接口来获取所需要的数据,A项目并不关心B项目的实现细节,只需要B项目暴露一个接口来给A项目来调用即可。因此,使用dubbo能让这变得简单。
1.2 Dubbo体系结构
摘自Dubbo官网的体系结构:
dubbo的核心组件:
消费者(customer),调用远程服务的一方称为"消费者";
提供者(provider),暴露服务的一方称为“提供者";
注册中心(Register),服务注册与发现的中心目录服务称之为“服务注册中心”。
监控中心(Monitor),统计服务的调用次数和调用时间的日志服务称之为“服务监控中心”。
结合上图与组件,我们来熟悉下dubbo的执行流程以及各组件分工:
1)首先启动Provider(提供者)容器,然后提供者会通过ajax请求到注册中心注册服务;然后当消费者(customer)容器启动后,会通过ajax请求到注册中心去订阅服务。
2)当提供者增加了新的服务,会注册到Registry中,然后Registry会通知(notify)消费者。
3)Monitor会统计调用服务的次数与时间。
2.springBoot整合dubbo架构图
此处使用dubbo直连方式,快速入门dubbo:
通过创建2个Maven项目来引入dubbo进行服务调用。
3.实现步骤
3.1 创建提供者(provider01):
1.新建一个普通的Maven Project项目,创建Service跟启动类:
2.创建Service,实现具体的服务细节:
BaseService 接口类:
public interface BaseService {
String hello(String name);
}
SomeServiceImpl实现类:
public class SomeServiceImpl implements BaseService {
public String hello(String name){
System.out.println(name+",大家好,我是提供者。");
return "hello,Dubbo! -->"+name;
}
}
3.在pom.xml中引入spring依赖以及dubbo依赖:
pom.xml :
<dependencies>
<!--dubbo依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
</dependency>
<!--spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
4.dubbo配置文件spring-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="provider01" />
<!--指定注册中心:不使用注册中心-->
<dubbo:registry address="N/A" />
<!--注册业务接口实现类,它是真正的服务提供者-->
<bean id="someService" class="com.test.service.impl.SomeServiceImpl"/>
<!--服务暴露-->
<dubbo:service interface="com.test.service.BaseService" ref="someService" />
</beans>
5.编写main方法启动服务:
ProviderRun类:用于启动该java application
public class ProviderRun {
public static void main(String[] args) throws IOException {
//创建Spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-provider.xml");
//启动Spring容器
((ClassPathXmlApplicationContext)ac).start();
//使用主线程阻塞
System.in.read();
}
}
6.执行main方法:
执行main方法后,我们让该线程阻塞,等候消费者调用。当看到上图中的打印日志,提示我们dubbo服务发布成功,并且显示了远程调用服务的url,接口名等元数据时,就说明dubbo提供者已经发布成功了。
3.2 创建消费者(customer01):
1.新建一个普通的Maven Project项目,创建Service跟main入口:
2.业务接口类,BaseService:
public interface BaseService {
String hello(String name);
}
3.dubbo消费者配置文件:
<?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="customer01" />
<!--指定注册中心:不使用注册中心-->
<dubbo:registry address="N/A"/>
<!--直连式提供者-->
<dubbo:reference id="someService" interface="com.test.service.BaseService" url="dubbo://localhost:20880"/>
</beans>
4.pom.xml jar包依赖(跟提供者依赖一致):
<properties>
<!--自定义版本号-->
<spring-version>4.3.16.RELEASE</spring-version>
</properties>
<dependencies>
<!--dubbo依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
</dependency>
<!--spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
5.main方法启动类,CustomerRun:
public class CustomerRun {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-customer.xml");
BaseService service = (BaseService) ac.getBean("someService");
String hello = service.hello("zhangSheng");
System.out.println(hello);
}
}
4.效果以及总结
1.先执行maven项目provider01的main方法,由该提供者暴露服务:
2.再执行maven项目customer01的main方法,来调用服务:
总结:好了,由效果图可看出,我们成功通过spring整合了dubbo。来实现了服务的调用。此处没有使用任何的注册中心,方便大家快速入门来理解该远程RPC框架。(博主后面会陆续记录spring+dubbo+zookeeper的使用)循序渐进,一起成长。