# 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知识 ## 产生背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服 务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。 ![](docs/imgs/1.png) **单一应用架构** 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此 时,用于简化增删改查工作量的数据访问框架(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) ![控制台](docs/imgs/2.png) ## Demo说明 1. dubbo-common: 一些通用的实体类和工具存放模块 2. dubbo-interfaces: 服务接口模块 ### 基础 1. dubbo-basic-provider: Dubbo基础Demo服务提供者 2. dubbo-basic-consumer: Dubbo基础Demo消费者 前置工作都做好后,启动dubbo-basic-provider,启动完成后,正常情况应该如下图所示: ![Basic-Provider](docs/imgs/3.png) 接下来我们启动dubbo-basic-consumer,启动完成后,可以看到我们的消费者: ![Basic-Consumer](docs/imgs/4.png) 通过Postman测试我们的消费者运行是否正常,服务是否调用成功: ![Basic-Consumer](docs/imgs/5.png) ### 带数据库交互的Demo(高可用,服务负载均衡,容错处理配置) 1. dubbo-goods: 商品模块服务提供者 sql文件位于`docs/sql/` 2. dubbo-pay: 支付模块服务提供者 3. dubbo-backend-api: 后台管理系统对应的 rest api 启动顺序: 1. 启动dubbo-goods 2. 启动dubbo-pay 3. 确保服务启动成功,如下图: ![正常运行](docs/imgs/6.png) 4. 启动dubbo-backend-api 5. Postman测试Rest接口运行是否正常 ![调用成功](docs/imgs/7.png) 6. 同时坚持数据库的值确实改变 ![数据改变](docs/imgs/8.png) PS:这边只是模拟立即购买的步骤,真正场景要考虑的远不止这些。 ### 注意 1. 当前用户如果非root,默认日志目录需要自己创建,默认日志目录见logback-spring.xml。 2. 确保默认日志目录的权限是当前用户和用户组。(可以使用 `chown -R` 来修改)。