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 进行分布式系统架构。
其核心功能包含:
- Remoting - 远程通讯:网络通信框架,实现了 sync-over-async 和 request-response 消息机制。提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型,序列化,以及“请求 - 响应”模式的信息交换方式。
- RPC - 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
- Registry - 服务注册:服务目录框架用于服务的注册和服务事件发布和订阅。基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo 发展
- 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 工作原理
节点说明:
- Provider:服务提供者,暴露服务的服务提供方。
- Consumer:服务消费者,调用远程服务的服务消费方。
- Registry:注册中心,服务注册与发现的注册中心。
- Monitor:监控中心,统计服务的调用次调和调用时间的监控中心。
- Container:服务容器,运行服务的容器。
执行顺序说明:
- 服务容器(Container)负责启动,加载,运行服务提供者。
- 服务提供者(Provider)在启动时,向注册中心注册自己提供的服务。
- 服务消费者(Consumer)在启动时,向注册中心订阅自己所需的服务。
- 注册中心(Registry)返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心(Monitor)。
运行 Dubbo Demo
克隆 Dubbo 源码
1 | git clone https://github.com/apache/incubator-dubbo.git 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 | wget http://apache.etoak.com/tomcat/tomcat-6/v6.0.35/bin/apache-tomcat-6.0.35.tar.gz |
配置
1 | vi webapps/ROOT/WEB-INF/dubbo.properties |
启停
1 | ./bin/startup.sh |
访问
1 | http://127.0.0.1:8080/ |
登陆用户名/密码:root
/root
or guest
/guest