# dubbo-learn
**Repository Path**: zjwGit/dubbo-learn
## Basic Information
- **Project Name**: dubbo-learn
- **Description**: Dubbo快速学习
- **Primary Language**: Java
- **License**: GPL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2017-09-26
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Dubbo快速学习
## 准备工作
1.环境准备:JDK1.8+Zookeeper+MySQL
2.知识准备:需要了解Java基础+SpringBoot+Mybatis知识
## 产生背景
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服
务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

**单一应用架构**
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此
时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
**垂直应用架构**
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个
应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
**分布式服务架构**
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐
渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务
复用及整合的分布式服务框架(RPC)是关键。
**流动计算架构**
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中
心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调
度和治理中心(SOA)是关键。
## 需求
请自行查看官方文档或百度。
## 架构
请自行查看官方文档或百度。
## 服务接口设计原则(先学习Demo)
1. 服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未提供分布式事务支持,同时可以减少系统间的网络交互。
2. 不建议使用过于抽象的通用接口,如Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。
3. 每个接口应定义版本号,为后续不兼容升级提供可能如:``
4. 服务提供方不应将DAO或者SQL等异常抛给消费方,应在服务实现中对消费方不关心的异常进行包装,否则可能出现消费方无法反序列化相应异常。
5. 在Provider上尽量多配置Consumer端属性:
作为服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,并发控制数量,负载均衡,等等。
在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Comsumer的缺省值,否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的。
Provider上尽量多配置Consumer端的属性,让Provider实现者一开始就思考Provider服务特点、服务质量的问题。
6. 服务参数及返回值建议使用POJO对象,即通过set,get方法表示属性的对象,必须实现序列化。
服务参数及返回值不建议使用接口,因为数据模型抽象的意义不大,并且序列化需要接口实现类的元信息,并不能起到隐藏实现的意图。
服务参数及返回值都必需是byValue的,而不能是byRef的,消费方和提供方的参数或返回值引用并不是同一个,只是值相同,Dubbo不支持引用远程对象。
## 所需资源下载
[点击传送门](https://pan.baidu.com/s/1c28g5S8) 密码: yurt
## Zookeeper搭建
1. 将zookeeper解压到指定目录下,这里假定为/opt/zookeeper
2. 进入zookeeper目录下的conf目录,复制zoo_sample.cfg为zoo.cfg,并将内容修改如下
#心跳间隔时间,zookeeper中使用的基本时间单位,毫秒值。每隔2秒发送一个心跳
tickTime=2000
#集群中的follower服务器(F)与leader服务器(L)之间 初始连接 时能容忍的最多心跳数,表示10个心跳间隔
initLimit=10
#集群中的follower服务器(F)与leader服务器(L)之间 请求和应答 之间能容忍的最多心跳数,表示5个心跳间隔
syncLimit=5
#数据目录
dataDir=/tmp/zookeeper
#客户端连接端口
clientPort=2181
3. 配置完以后,就可以启动zookeeper服务了,进入Zookeeper/bin目录,启动Zookeeper服务 `./zkServer.sh start`
## dubbo-admin搭建(控制台)
控制台可以快速验证你的服务,消费者的当前情况,建议第一个搭建。
步骤如下:
1. 将Tomcat解压到指定目录。
2. 进入conf目录,执行`vim server.xml`
3. 进入webapps,将该目录下的所有文件夹文件清空。
4. 将dubbo-admin-2.5.5.tar.gz解压到webapps目录下。
5. 进入/dubbo-admin-2.5.5/WEB-INF文件夹,执行`vim dubbo.properties`
#将dubbo.registry.address改为你自己的zookeeper地址
dubbo.registry.address=zookeeper://192.168.56.101:2181
#zookeeper集群配置
#dubbo.registry.address=zookeeper://192.168.56.101:2181?backup=192.168.56.102:2181,192.168.56.103:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
6. 启动Tomcat,访问localhost:8080,出现下图说明控制台搭建成功。(默认用户名 root 密码 root)

## Demo说明
1. dubbo-common: 一些通用的实体类和工具存放模块
2. dubbo-interfaces: 服务接口模块
### 基础
1. dubbo-basic-provider: Dubbo基础Demo服务提供者
2. dubbo-basic-consumer: Dubbo基础Demo消费者
前置工作都做好后,启动dubbo-basic-provider,启动完成后,正常情况应该如下图所示:

接下来我们启动dubbo-basic-consumer,启动完成后,可以看到我们的消费者:

通过Postman测试我们的消费者运行是否正常,服务是否调用成功:

### 带数据库交互的Demo(高可用,服务负载均衡,容错处理配置)
1. dubbo-goods: 商品模块服务提供者
sql文件位于`docs/sql/`
2. dubbo-pay: 支付模块服务提供者
3. dubbo-backend-api: 后台管理系统对应的 rest api
启动顺序:
1. 启动dubbo-goods
2. 启动dubbo-pay
3. 确保服务启动成功,如下图:

4. 启动dubbo-backend-api
5. Postman测试Rest接口运行是否正常

6. 同时坚持数据库的值确实改变

PS:这边只是模拟立即购买的步骤,真正场景要考虑的远不止这些。
### 注意
1. 当前用户如果非root,默认日志目录需要自己创建,默认日志目录见logback-spring.xml。
2. 确保默认日志目录的权限是当前用户和用户组。(可以使用 `chown -R` 来修改)。