1. Dubbo初识
特性:
-
面向接口代理的高性能RPC调用:
提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
-
智能负载均衡:
内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
-
服务自动注册与发现:
支持多种注册中心服务,服务实例上下线实时感知。
过程:
1.各微服务启动时,将自己的实例信息注册到注册中心,注册中心存储这些数据
2.注册中心检测服务提供者的连接状态
3.服务消费者从注册中心获取服务提供者的实例信息
4.服务消费者远程调用服务提供者提供的接口服务
-
高度可拓展能力:
遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
-
运行期流量调度:
内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
-
可视化的服务治理与运维:
提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
2. Dubbo架构
Dubbo 定义了一些中心化组件,这包括:
- 注册中心(Registry)。协调 Consumer 与 Provider 之间的地址注册与发现
- 配置中心(Config Center)。
- 存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性
- 负责服务治理规则(路由规则、动态配置等)的存储与推送
- 元数据中心(Metadata)。
- 接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等)
- 作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展
Provider(服务提供者)、Consumer(服务消费者),比如用户Web(界面)就是consumer,用户业务(服务)就是provider。
注意init、async、sync的不同步骤
3. ZooKeeper注册中心
Dubbo
官方推荐使用ZooKeeper
ZooKeeper是Apache Hadoop的子项目,是一个树形的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度高,可用于生产环境,并推荐使用。
3.1 Dubbo-Admin
项目Github地址:https://github.com/apache/dubbo-admin/tree/master
是一个Maven项目,并且是Springboot的项目,需要打包执行,运行Dubbo-Admin
需要运行ZooKeeper
。
3.2 编写一个Hello World
假设有一个场景,有一个订单服务
和一个用户服务
,用户在支付时,订单服务需要获取到用户的所有地址:
在单体应用中,所有的bean、service和serviceImpl全都放在一个项目中。在分布式项目中,比如用户服务和订单服务在两个独立的项目中,这时候bean、service就不应当在每个项目中都重复定义,此时应当建立一个interface的项目,在其中定义如User
,Order
,UserService
,OrderService
;用户服务的项目和订单服务的项目都依赖这个interface项目(在pom.xml
中添加对这个项目的依赖)。
用户服务的项目中没有UserService
这个接口,而只有UserServiceImpl
这个实现类;订单服务相同。倘若这两个项目需要调用对方项目中的方法,需要provider
(服务提供者)先将自己(服务)注册到注册中心,然后让consumer
(服务消费者)去注册中心中订阅服务提供者的服务地址。
在配置服务提供者和服务消费者时,如果不使用注解而只使用xml配置文件将会非常繁琐,以服务提供者举例,涉及到:
- 指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名)
- 指定注册中心的位置
- 指定通信规则(通信协议、通信端口)
- 暴露服务
- 标明服务的实现的位置
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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
<dubbo:application name="user-service-provider"></dubbo:application>
<!-- 2、指定注册中心的位置 -->
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
<!-- 3、指定通信规则(通信协议?通信端口) -->
<!-- name就代表通信协议,协议可以有很多,这里使用dubbo;port随意写即可-->
<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
<!-- 4、暴露服务 ref:指向服务的真正的实现对象 -->
<dubbo:service interface="com.zzw.gmall.service.UserService" ref=