Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
它的特性以下html
Talk is cheap, Show me the code。如今来着手搭建一个Dubbo项目吧。java
建立三个项目git
service-api 服务提供者和服务消费者共用的接口github
service-consumer 服务消费者web
service-provider 服务提供者redis
先在service-api定义一个公用接口spring
public interface DemoService {
String sayHello(String name);
}
复制代码
服务提供者service-provider提供一个DemoService的实现类apache
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
System.out.println("[" + LocalDate.now() + "] Hello " + name );
return "Hello " + name;
}
}
复制代码
<dubbo:application name="demo-provider"/>
复制代码
可使用Multicast、Redis、Zookeeper、Simple这四个做为注册中心。api
<dubbo:registry address="multicast://224.5.6.7:1234"/>
复制代码
默认为dubbospringboot
<dubbo:protocol name="dubbo" port="20880"/>
复制代码
而后定义bean,以及将bean做为服务暴露出去
<bean id="demoService" class="com.learnDubbo.demo.provider.DemoServiceImpl"/>
<dubbo:service interface="com.learnDubbo.demo.DemoService" ref="demoService"/>
复制代码
编写一个main函数用于启动服务提供者
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
context.start();
System.in.read();//用于阻塞函数,使其一直运行
}
复制代码
服务消费者须要调用service-provider 服务提供者提供的DemoService实现类 一样须要编写xml文件,配置文件和服务提供者的相似,不一样的是须要将暴露服务的配置修改成引用服务的配置,以下
<dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/>
复制代码
编写一个main函数用于启动服务消费者,而后一直循环调用服务提供者提供的服务
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml");
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // 调用服务提供者提供的服务
while (true) {
try {
Thread.sleep(1000);
String hello = demoService.sayHello("Dubbo"); // call remote method
System.out.println(hello); // get result
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
复制代码
先启动service-provider项目,而后在启动service-consumer,输出结果以下
服务提供者和服务消费者共用的接口仍是使用service-api,新建下面两个项目
service-consumer-annotation 基于注解的服务消费者
service-provider-annotation 基于注解的服务提供者
新建一个springboot项目 一样须要提供一个DemoService的实现类,且在类上增长@Service
注解
注:是com.alibaba.dubbo.config.annotation.Service 不是org.springframework.stereotype.Service 别导错了
接下来须要增长dubbo的配置类
@Configuration
public class DubboConfiguration {
/**
* 对应xml配置:<dubbo:application name="demo-provider"/>
* @return
*/
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("demo-provider--annotation");
return applicationConfig;
}
/**
* 对应xml配置:<dubbo:registry address="multicast://224.5.6.7:1234"/>
* @return
*/
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("multicast://224.5.6.7:1234");
return registryConfig;
}
}
复制代码
最后一步在启动类上增长注解@DubboComponentScan(basePackages = "com.learnDubbo.demo.provider.service")
basePackages自行修改成提供服务类所在的包路径
也是须要有一个配置类,和服务提供者相似,这里就不贴代码了
接下来建立一个Controller,用于测试结果,代码以下
@RestController
public class DemoController {
@Reference
private DemoService demoService;
@GetMapping("sayHello")
public String sayHello(){
return demoService.sayHello("Dubbo");
}
}
复制代码
@Reference
注解表示引用服务相似于xml配置
<dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/>
复制代码
在项目启动类上一样须要注解@DubboComponentScan
指定dubbo扫描路径
同xml配置的同样,须要先启动服务提供者
配置信息主要包括3大块,注册中心、协议和schema配置
注册中心总共有4个,以下
注册中心 | 简要说明 | dubbo文档介绍 |
---|---|---|
Multicast | 不须要启动任何中心节点,只要广播地址同样,就能够互相发现。 | 连接 |
zookeeper | Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变动推送,适合做为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。 | 连接 |
Redis | 一个高效的 KV 存储服务器 , 从 2.1.0 版本开始支持 。 |
连接 |
Simple | 一个普通的 Dubbo 服务,能够减小第三方依赖,使总体通信方式一致。 | 连接 |
当使用Redis注册中心,需先把服务提供方和消费放的注册中心xml配置修改成下方
<dubbo:registry address="redis://localhost:6379"/>
复制代码
对应的redis会产生以下数据
能够看到有两个key,分别对应服务提供者和消费者。两个key对应的数据类型为Hash,能够看到服务消费者key的数据以下
1) "consumer://192.168.79.170/com.learnDubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.6.2&interface=com.learnDubbo.demo.DemoService&methods=sayHello&pid=14208&side=consumer×tamp=1534389723130"
2) "1534389813690"
复制代码
第一个为URL址,第二个为过时时间。
官网给的图以下
当使用Zookeeper注册中心,需先把服务提供方和消费放的注册中心xml配置修改成下方
<dubbo:registry address="zookeeper://localhost:2181"/>
复制代码
对应的Zookeeper会产生以下数据
下图是官网给出的数据图
有些出入,但大体仍是相同的,多了configurators和routers。 当服务提供者启动时: 会建立对应的目录结构,例如我上面代码中的共用接口名为com.learnDubbo.demo.DemoService
,就会建立 /dubbo/com.learnDubbo.demo.DemoService
目录,而后在建立providers
目录,再在providers
目录下写入本身的 URL 地址。
当服务消费者启动时:会在/dubbo/com.learnDubbo.demo.DemoService
目录建立 consumers
目录,并在consumers
目录写入本身的 URL 地址。
当监控中心启动时: 订阅 /dubbo/com.learnDubbo.demo.DemoService
目录下的全部提供者和消费者 URL 地址。
协议 | 简要说明 | dubbo文档介绍 |
---|---|---|
dubbo | Dubbo 缺省协议采用单一长链接和 NIO 异步通信,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的状况。 | 连接 |
rmi | RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短链接和 JDK 标准序列化方式。 |
连接 |
hessian | Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通信,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 做为服务器实现。 | 连接 |
http | 基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现。 | 连接 |
webservice | 基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现 。 | 连接 |
thrift | 当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,好比 service name,magic number 等。 | 连接 |
memcached | 基于 memcached实现的 RPC 协议。 | 连接 |
redis | 基于 Redis 实现的 RPC 协议。 | 连接 |
rest | 基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持 | 连接 |
schema配置的涉及的东西有点多这里就不列出来了
参考资料:Dubbo官网
官网的介绍都很详细了,从官网中通常都能获取到你想到的信息。
有须要查看这篇博文的源码的能够点这里:Github地址