Dubbo 使用学习笔记

Apache Dubbo™ is a high-performance, java based, open source RPC framework.

Dubbo 是什么

Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。使得应用可通过高性能 RPC 实现服务的输出、输入功能和 Spring 框架无缝集成。Dubbo 包含远程通讯、集群容错和自动发现三个核心部分。

它提供透明化的远程方法调用,实现像调用本地方法一样调用远程方法,只需简单配置,没有任何 API 侵入。同时它具备软负载均衡及容错机制,可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。它可以实现服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的 IP 地址,并且能够平滑添加或删除服务提供者。

2011 年末,阿里巴巴在 GitHub 上开源了基于 Java 的分布式服务治理框架 Dubbo,之后它成为了国内该类开源项目的佼佼者,许多开发者对其表示青睐。同时,先后有不少公司在实践中基于 Dubbo 进行分布式系统架构。

其核心功能包含:

  1. Remoting - 远程通讯:网络通信框架,实现了 sync-over-async 和 request-response 消息机制。提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型,序列化,以及“请求 - 响应”模式的信息交换方式。
  2. RPC - 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. Registry - 服务注册:服务目录框架用于服务的注册和服务事件发布和订阅。基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo 发展

Dubbo Chinese users

  • 2008 年底在阿里内部开启规划
  • 2009 年初开发 1.0 版本
  • 2010 年 4 月,重构后发布 2.0 版本
  • 2011 年 10 月,开源,开源后的第一个版本 2.0.7
  • 2012 年 3 月,发布版本 2.1.0
  • 2013 年 3 月,发布版本 2.4.10,停止更新
  • 2014 年 10 月 30 日,发布版本 2.4.11,修复了一些 Bug
  • 2017 年 7 月,重启 Dubbo 开源
  • 2018 年 2 月,成为 Apache 基金会孵化项目

分支版本

Dubbox

当当网于 2014 年 10 月,fork 了 Dubbo,并命名为 Dubbox(即 Dubbo eXtensions),2015 年 3 月 31 号发布了最后一个版本 dubbox-2.8.4

Dubbok

网易考拉海购使用的版本

JD-Hydra

京东基于 Dubbo 做的调用跟踪系统

Dubbo 工作原理

Dubbo working principle

节点说明:

  • Provider:服务提供者,暴露服务的服务提供方。
  • Consumer:服务消费者,调用远程服务的服务消费方。
  • Registry:注册中心,服务注册与发现的注册中心。
  • Monitor:监控中心,统计服务的调用次调和调用时间的监控中心。
  • Container:服务容器,运行服务的容器。

执行顺序说明:

  1. 服务容器(Container)负责启动,加载,运行服务提供者。
  2. 服务提供者(Provider)在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者(Consumer)在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心(Registry)返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心(Monitor)。

运行 Dubbo Demo

克隆 Dubbo 源码

1
2
git clone https://github.com/apache/incubator-dubbo.git dubbo
cd dubbo

构建 Maven 项目

版本要求

  • Java 1.5+
  • Maven 2.2.1+

构建项目(包含测试)

1
mvn clean install

构建项目(不包含测试)

1
mvn install -Dmaven.test.skip

构建源码 Jar 包(方便调试)

1
mvn clean source:jar install -Dmaven.test.skip

IDE 支持

Intellij Idea

1
mvn idea:idea

在 IDEA 中,选中 dubbo 文件夹导入即可

Eclipse

1
mvn eclipse:eclipse

配置 Maven 仓库,通过 Preferences -> Java -> Build Path -> Classpath 定义 M2_REPO 的 classpath 变量指向本地的 maven 仓库。

或使用如下命令:

1
mvn eclipse:configure-workspace -Declipse.workspace=/path/to/the/workspace/

在 Eclipse 中,选中 dubbo 文件夹导入即可

安装 ZooKeeper

本地安装

ZooKeeper 官网 下载后安装到本地

安装参考:ZooKeeper 笔记 (1) 安装部署及 hello world

Docker 安装

获取最新版本 ZooKeeper

1
docker pull zookeeper

查看 ZooKeeper

1
docker image ls

启动 ZooKeeper

1
docker run --name my_zookeeper -p 2181:2181 -d zookeeper:latest

查看日志

1
docker logs -f my_zookeeper

运行 Demo

前提条件:运行 Zookeeper

Provider

修改配置文件 dubbo/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml,修改内容如下:

1
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

用 IDE 运行 dubbo-demo-consumer 项目下的 com.alibaba.dubbo.demo.provider.Provider

Consumer

修改配置文件 dubbo/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml,修改内容如下:

1
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

用 IDE 运行dubbo-demo-provider 项目下的 com.alibaba.dubbo.demo.consumer.Consumer

Hello, World

启动过后就会在两个控制台打印 Hello, World

Provider:

1
[23:31:10] Hello world, request from consumer: /192.168.2.10:52128

Consumer:

1
Hello world, response from provider: 192.168.2.10:20880

管理控制台

安装

1
2
3
4
5
6
7
8
9
10
11
wget http://apache.etoak.com/tomcat/tomcat-6/v6.0.35/bin/apache-tomcat-6.0.35.tar.gz
tar zxvf apache-tomcat-6.0.35.tar.gz
cd apache-tomcat-6.0.35
rm -rf webapps/ROOT

git clone https://github.com/dubbo/dubbo-ops.git /var/tmp/dubbo-ops
pushd /var/tmp/dubbo-ops
mvn clean package
popd

unzip /var/tmp/dubbo-ops/dubbo-admin/target/dubbo-admin-2.0.0.war -d webapps/ROOT

配置

1
2
3
4
5
vi webapps/ROOT/WEB-INF/dubbo.properties
dubbo.properties
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

启停

1
2
./bin/startup.sh
./bin/shutdown.sh

访问

1
http://127.0.0.1:8080/

登陆用户名/密码:root/root or guest/guest

参考文献