1、基本简介
Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC分布式服务框架,致力于提供高性能和透明化 的RPC远程服务调用方案,以及SOA服务治理方案。 Spring Cloud Alibaba微服务开发框架集成 了Dubbo,可实现微服务对外暴露Dubbo协议的接口,Dubbo协议相比RESTful协议速度更快
RPC:
RPC
是远程过程(Remote Procedure Call)的缩写形式,调用RPC远程方法就像调用本地
方法⼀样,Dubbo之前阿里研发,中间停止维护2年,最后开启维护并捐献给Apache

以上是 Dubbo 的工作原理图,从抽象架构上分为两层:服务治理抽象控制面 和 Dubbo 数据面
- 服务治理控制面。服务治理控制面不是特指如注册中心类的单个具体组件,而是对 Dubbo 治 理体系的抽象表达。控制面包含协调服务发现的注册中心、流量管控策略、Dubbo Admin 控 制台等,如果采用了 Service Mesh 架构则还包含 Istio 等服务网格控制面。
- Dubbo 数据面数据面代表集群部署的所有 Dubbo 进程,进程之间通过 RPC 协议实现数据交 换,Dubbo 定义了微服务应用开发与调用规范并负责完成数据传输的编解码工作。
-
服务消费者 (Dubbo Consumer),发起业务调用或 RPC 通信的 Dubbo 进程
-
服务提供者 (Dubbo Provider),接收业务调用或 RPC 通信的 Dubbo 进程
-
2、Dubbo架构图
这是最重要的,理解Dubbo的架构图是理解Dubbo的第一步,我从Dubbo官网手册上截了一下Dubbo架构图:
在接下来的讲解之前,说明一个概念:所谓SOA也好,分布式服务框架也好,不是服务消费者从中间件(一般都是Zookeeper)上去拿数据,而是服务消费者从中间件上拿到可用的服务生产者的集群地址,再从集群地址中选出一个进行直连。
接下来认识一下图中的结点:
- Provider:暴露服务的服务提供方,或者直白点说就是服务生产者
- Consumer:调用远程服务的服务消费方,也就是服务消费者
- Registry:服务注册与发现的注册中心
- Monitor:统计服务的调用次数和调用时间的监控中心
- Container:服务(生产者)运行容器
图中已经有了调用步骤了,接着对步骤进行说明:
- 0:服务容器负责启动、加载、运行服务提供者(生产者)
- 1:服务提供者(生产者)在启动时,向注册中心注册自己提供的服务
- 2:服务消费者在启动时,向注册中心订阅自己所需的服务
- 3:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中细腻将基于长连接推送变更数据给消费者
- 4:服务消费者从服务生产者地址列表中,基于软负载均衡算法,选择一台提供者(生产者)进行调用,如果调用失败,再选另一台调用
- 5:服务消费者和提供者(生产者),在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
3、基础实现
A.提供统一业务api
/**
实战中,会将所有服务接⼝设计给⼀个叫做api的服务,单独维护,此处就在common服务设置
*/
public interface IProductService {
Product findByPid(Integer pid);
}
B.编辑服务提供者product
添加依赖
<!--dubbo-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
添加dubbo配置
dubbo:
scan:
base-packages: com.apesource.service.impl # 开启包扫描
protocols:
dubbo:
name: dubbo # 服务协议
port: -1 # 服务端⼝ 使⽤随机端⼝
registry:
address: spring-cloud://localhost # 注册中⼼
编写并暴露服务
//暴露服务:注意这⾥使⽤的是dubbo提供的注解@Service,⽽不是Spring的
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDao;
@Override
public Product findByPid(Integer pid) {
return productDao.findById(pid);
}
}
C.编辑服务消费者
添加依赖
<!--dubbo-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
添加dubbo配置
dubbo:
registry:
address: spring-cloud://localhost # 注册中⼼
cloud:
subscribed-services: service-product # 订阅的提供者名称
引用服务
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
// 引用服务
@Reference
private IProductService productService;
@RequestMapping("/order/prod/{pid}")
public Order order(@PathVariable Integer pid) {
System.out.println("接收到 " + pid + " 号商品的下单请求, 接下来调用商品微服务查询此商品信息");
// 调用商品微服务, 查询商品信息
Product product = productService.findByPid(pid);
System.out.println("查询到 " + pid + " 号商品的信息, 内容是: " + JSON.toJSONString(product));
// 下单(创建订单)
Order order = new Order();
order.setUid(1);
order.setUsername("测试用户");
order.setPid(pid);
order.setPname(product.getPname());
order.setPprice(product.getPprice());
order.setNumber(1);
orderService.createOrder(order);
System.out.println("创建订单成功, 订单信息为: " + JSON.toJSONString(order));
return order;
}
}