原文链接,点击跳转
Dubbo 介绍
Apache Dubbo 是一款 RPC(Remote Procedure Call 远程过程调用)服务开发框架,提供了远程调用方案和服务治理方案。
Dubbo 发展历程
-
2008年,Dubbo 最初是阿里巴巴内部的一个 RPC 框架,用于解决分布式系统中服务调用的问题。
-
2017 年:Dubbo 被正式捐献给 Apache 软件基金会并成为 Apache 顶级项目。
-
2019 年:Apache Dubbo 正式发布了 2.7.0 版本,引入了一些新特性和改进,如异步调用、响应式编程模型、SPI 机制的优化等。
Dubbo 2.6.x (包名:com.alibaba)版本
Dubbo 2.7.x (包名:org.apache.dubbo)版本。
Dubbo 架构
- Provider:暴露服务的服务提供方
- Consumer:调用远程服务的服务消费方
- Registry:服务注册与发现的注册中心
- Monitor:统计服务的调用次数和调用时间的监控中心
- Container:服务运行容器
调用过程
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 入门使用
文中涉及到的安装包和代码示例,需要的请关注【Qin的学习营地】,回复【dubbo入门使用教程】
一、Zookeeper 注册中心安装启动
这里下载 Zookeeper 3.6.4 版本的并在 windows 下启动。
下载对应安装包后解压,进入 bin 目录,找到 zkServer.cmd。在启动之前,可以打开 zkServer.cmd 文件,在后面添加 pause,可以在出错时不会闪退,方便查看错误原因。
双击 zkServer.cmd 启动,这里启动会报如下的错,这个错误信息是提示缺少一个 zoo.cfg 文件。
进入 config 目录下,可以看到有一个 zoo_sample.cfg 文件,这个文件不会生效,需要改成 zoo.cfg,在这里复制一份改为 zoo.cfg 配置文件,重新启动即可生效。 这里顺带配置一下 zoo.cfg 配置文件,配置 dataDir = F:\download,指定数据目录位置。
继续点击 zkServer.cmd 启动,发现还是报错,提示找不到 org.apache.zookeeper.server.quorum.QuorumPeerMain 启动类。
这里主要是因为下载版本的问题,之前下载的是源码版本,现在重新下载二进制版本,启动成功了。
二、服务提供方
使用 spring boot 整合 dubbo 实现。
1、引入依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--zookeeper 注册中心客户端引入 使用的是curator客户端 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
</dependency>
2、服务提供方实现类
接口:
public interface HelloService {
String sayHello(String name);
}
实现类:
// @Service: 这是 Dubbo 框架的注解,用于标记一个类为服务提供者。使得 Dubbo 可以自动扫描并将服务发布到注册中心,供消费者发现和调用。
@Service(interfaceClass=HelloService.class , retries=-1, version="1.0.0", timeout=15000)
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "【producer】 Hello, " + name + "!";
}
}
3、配置相关参数
# dubbo-provider.properties
dubbo.application.name=dubbo-provider
## 指定 Dubbo 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
## 指定 Dubbo 服务的协议类型和端口
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
## 指定需要扫描的基础包,用于查找 Dubbo 服务的实现类。
dubbo.scan.base-packages=com.example.dubbo.producer.service
三、服务消费方
使用 spring boot 整合 dubbo 实现。
1、引入依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--zookeeper 注册中心客户端引入 使用的是curator客户端 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
</dependency>
2、引用服务提供方暴露的接口
使用服务提供方的dubbo接口::
public class ProducerService {
// @Reference 是 Dubbo 框架中的一个注解,用于在消费者端标记对 Dubbo 服务的引用。
// Dubbo 框架会自动为该注解标记的字段或方法参数注入代理对象。这个代理对象封装了底层的远程调用逻辑,使得消费者可以像调用本地方法一样调用远程服务。
@Reference(retries=-1, version="1.0.0", timeout = 15000)
private HelloService helloService;
public String consumerSayHello(String name){
String hello = helloService.sayHello(name);
System.out.println("[consumer] "+ hello);
return hello;
}
}
3、配置相关参数
# dubbo-consumer.properties
dubbo.application.name=dubbo-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=30880