一路踩坑构建Dubbo源码
dubbo构建
- 源码环境
- 构建
- 快速启动
- 总结
源码环境
随着溪源目前对技术栈的求知欲,也开始入手Dubbo源码啦!!! 构建源码第一步: 必备开发环境:Java 1.5 以上的版本;Maven 2.2.1 或者以上的版本; 官网下载源代码 官网构建文档学习一下;
构建
上面part介绍了dubbo源码环境,下面溪源将一步步踩坑构建源码。虽然上面附属了官方文档连接,此处溪源再重复说一下下载步骤:
-
git下载
命令
git clone https://github.com/apache/dubbo.git
; - maven 构建 到这里溪源开始踩坑了,噩梦的开始~ 官网文档里可以使用两种方式构建:是否跳过单元测试;
毕竟是第一次构建源码,故溪源选择了第一种方式:
- 构建时间长,需要构建单元测试;
- 可能会存在单测错误现象(构建过程可以直接忽略);
直奔主题,毫不意外构建失败,直接步入今天的主题:踩坑。
遇到这种依赖冲突情况,溪源提供一种暴力解决方法:将本地仓库删除相关jar包文件,重新下载依赖文件; 由于不跳过单测,构建过程略长,溪源采用了第二种构建方式,如图
静静地等待构建。。。心里默默祈求成功吧(哈哈~)
-
idea编译
命令:
mvn idea:idea
继续等待编译完成,毫不意外溪源又被摧残了一下,BUILD FAILURE
构建失败;
心里想着再坚持一下,快要成功了~,溪源继续想办法解决,看到关于本地仓库的问题,于是乎溪源在本地仓库中查找没有对应的Jar包依赖;
溪源第一反应就是下载对应的Jar资源文件,在哪里下载呢???面向度娘吗??不不,对于这种资源包缺失问题,网上很少回答的。大家可以动脑思考一下,项目依赖文件来源于中央仓库
,于是乎~阿里云仓库
嘛;
溪源分享一下阿里云仓库资源文件下载地址:源地址,网络原因,有可能访问缓慢;
将jar包下载完成以后,在本地仓库建立相应的文件夹;
引出一个拓展点:
平时日常开发配置maven时,需要在setting.xml
引入阿里云仓库,一般我们百度时配置提供的基本是一种老版地址
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
溪源在解决上面依赖问题时,发现阿里云仓库已经进行了地址更新:阿里云maven
官方配置指南参考:
于是,溪源将本地maven配置setting.xml
改成新的仓库地址:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
以上踩坑似乎跟溪源本地仓库有关,溪源在这里分享出来,希望能够带给伙伴一种解决思路,遇到类似问题,不要着急,看错误日志,寻找解决方案。
解决完资源依赖问题,再次输入mvn idea:idea
命令,终于迎来胜利的曙光,构建成功啦!
快速启动
经历一番折腾后,溪源终于解决了问题,终于要准备开启dubbo的大门啦,一探究竟~ 事实告诉溪源高兴的太早了,坑啊~,继续踩坑。
idea打开dubbo源码,进入dubbo-demo项目
按照正常步骤,溪源将配置文件中zookeeper注册中心IP地址改成自己阿里云公网地址(根据自己情况修改); 满心欢喜启动项目~结果:
[11/08/20 08:36:35:376 CST] main INFO imps.CuratorFrameworkImpl: Default schema
Exception in thread "main" java.lang.IllegalStateException: zookeeper not connected
at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:83)
at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.createZookeeperClient(CuratorZookeeperTransporter.java:26)
at org.apache.dubbo.remoting.zookeeper.support.AbstractZookeeperTransporter.connect(AbstractZookeeperTransporter.java:70)
at org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter$Adaptive.connect(ZookeeperTransporter$Adaptive.java)
at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration.<init>(ZookeeperDynamicConfiguration.java:56)
at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory.createDynamicConfiguration(ZookeeperDynamicConfigurationFactory.java:37)
at org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory.lambda$getDynamicConfiguration$0(AbstractDynamicConfigurationFactory.java:39)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory.getDynamicConfiguration(AbstractDynamicConfigurationFactory.java:39)
at org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration(DynamicConfiguration.java:224)
at org.apache.dubbo.config.bootstrap.DubboBootstrap.prepareEnvironment(DubboBootstrap.java:1034)
at org.apache.dubbo.config.bootstrap.DubboBootstrap.startConfigCenter(DubboBootstrap.java:623)
心里怒骂一声“此处省略三个字”!!!溪源最终屈服于它,说服自己遇到问题不要慌,分析一波吧;面对第一次处理dubbo源码,溪源心里也没有底啊。但是按照往常溪源遇到问题的处理方式,就是看到上面的日志,找到第一个报错的类(为什么呢?跟过源码或者经验比较丰富的伙伴应该清楚,我们开发代码一般类似洋葱,一层套一层,故第一个报错的类,肯定是出问题的地方);于是乎,溪源选中CuratorZookeeperClient.java:83
此类作为突破目标;
看到了日志报错的地方,开始吧~撸起袖子就是干啊;
跟进源码我们发现了时间超时问题,我们距离成功解决问题又进了一步;故我们在配置文件中修改其连接时间: 官方文档:dubbo:registry 接下来就是修改dubbo源码中的配置文件: 将dubbo-provider.xmldubbo-consumer.xml中均添加超时时间:
<dubbo:registry address="zookeeper://IP地址:2181" timeout="10000"/>
解决完这些问题,溪源心里已经不敢期望成功运行源代码了,心里担忧~ 小心尝试分别运行provider、consumer主启动类;
溪源心里一颗大石头终于放下来了,踩了一路的坑,终于成功运行demo了。
总结
从溪源构建代码过程中,发现即使过程中遇到各种坑,希望大家能够静下来心,寻找有效日志,作为突破目标,一举攻破!!!下面溪源也要追逐dubbo的学习了。 溪源第一次接触dubbo源码,若是存在不足之处,希望大佬及时指正! 若大家从中捞到东西,请给与溪源爱心三连哈~,激发溪源前进的脚步。
- objective-C 的代码文件组织
- objective-C 的OOP(上)--类定义、继承及方法调用
- jQuery打造智能提示插件二(可编辑下拉框)
- Nicholas Christakis:朋友多是由基因决定的?
- WPF中的MatrixTransform
- kvm虚拟化管理平台WebVirtMgr部署-虚拟化环境安装-完整记录(0)
- ruby学习笔记(3)--语法层面的先见之明
- jQuery操作Select
- ruby学习笔记(11)--symbol与hash参数
- zabbix监控-基本原理介绍
- OpenStack构架知识梳理
- mysql操作命令梳理(4)-grant授权和revoke回收权限
- 问未来
- ruby on rails + mysql 开发环境搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PDO::lastInsertId讲解
- thinkPHP框架RBAC实现原理分析
- PHP PDOStatement::debugDumpParams讲解
- PDO::prepare讲解
- sklearn的predict_proba使用说明
- 如何使用python记录室友的抖音在线时间
- 使用keras实现BiLSTM+CNN+CRF文字标记NER
- 图解MyBatis的SQL执行流程
- Keras: model实现固定部分layer,训练部分layer操作
- 在Keras中CNN联合LSTM进行分类实例
- DeepWalk:图网络与NLP的巧妙融合
- PHP扩展mcrypt实现的AES加密功能示例
- PHP PDOStatement::bindColumn讲解
- PHP PDOStatement::fetchAll讲解
- PHP PDOStatement::bindParam讲解