当拿到一款框架之后,一种不错的源码阅读方式大致如下:从运行最基础的 helloworld demo 源码开始 —> 再查看配置文件 —> 开启各种依赖服务(比如zk、consul) —> 开启服务端 —> 再到通过 client 调用服务端 —> 打印完整请求日志和回包。调用成功之后,再根据框架的设计模型,从配置文件解析开始,自顶向下递阅读整个框架的调用栈。
对于 C/S 模式的 rpc 请求来说,整个调用栈被拆成了 client 和 server 两部分,所以可以分别从 server 端的配置文件解析阅读到 server 端的监听启动,从 client 端的配置文件解析阅读到一次 invoker Call 调用。这样一次完整请求就明晰了起来。
运行官网提供的 helloworld-demo
官方 demo 相关链接:https://github.com/dubbogo/dubbo-samples/tree/master/golang/helloworld/dubbo
- dubbo-go 2.7 版本 QuickStart
1)开启一个 go-server 服务
将仓库 clone 到本地
$ git clone https://github.com/dubbogo/dubbo-samples.git
进入 dubbo 目录
$ cd dubbo-samples/golang/helloworld/dubbo
进入目录后可看到四个文件夹,分别支持 go 和 java 的 client 以及 server,我们尝试运行一个 go 的 server。进入 app 子文件夹内,可以看到里面保存了 go 文件。
$ cd go-server/app
sample 文件结构
可以在 go-server 里面看到三个文件夹:app、assembly、profiles。
其中 app 文件夹下保存 go 源码,assembly 文件夹下保存可选的针对特定环境的 build 脚本,profiles 下保存配置文件。对于 dubbo-go 框架,配置文件非常重要,没有文件将导致服务无法启动。
设置指向配置文件的环境变量
由于 dubbo-go 框架依赖配置文件启动,让框架定位到配置文件的方式就是通过环境变量来找。对于 server 端需要两个必须配置的环境变量:CONF_PROVIDER_FILE_PATH、APP_LOG_CONF_FILE,分别应该指向服务端配置文件、日志配置文件。
在 sample 里面,我们可以使用 dev 环境,即 profiles/dev/log.yml 和 profiles/dev/server.yml 两个文件。在 app/ 下,通过命令行中指定好这两个文件:
$ export CONF_PROVIDER_FILE_PATH="…/profiles/dev/server.yml"
$ export APP_LOG_CONF_FILE="…/profiles/dev/log.yml"
设置 go 代理并运行服务
$ go run .
如果提示 timeout,则需要设置 goproxy 代理。
$ export GOPROXY=“http://goproxy.io”
再运行 go run 即可开启服务。
2)运行 zookeeper
安装 zookeeper,并运行 zkServer, 默认为 2181 端口。
3)运行 go-client 调用 server 服务
进入 go-client 的源码目录
$ cd go-client/app
同理,在 /app 下配置环境变量
$ export CONF_CONSUMER_FILE_PATH="…/profiles/dev/client.yml"
$ export APP_LOG_CONF_FILE="…/profiles/dev/log.yml"
配置 go 代理:
$ export GOPROXY=“http://goproxy.io”
运行程序
$ go run .
即可在日志中找到打印出的请求结果:
response result: &{A001 Alex Stocks 18 2020-10-28 14:52:49.131 +0800 CST}
同样,在运行的 server 中,也可以在日志中找到打印出的请求:
req:[]interface {}{“A001”}
rsp:main.User{Id:“A001”, Name:“Alex Stocks”, Age:18, Time:time.Time{…}
恭喜!一次基于 dubbo-go 的 rpc 调用成功。
4)常见问题
当日志开始部分出现 profiderInit 和 ConsumerInit 均失败的日志,检查环境变量中配置路径是否正确,配置文件是否正确。
当日志中出现 register 失败的情况,一般为向注册中心注册失败,检查注册中心是否开启,检查配置文件中关于 register 的端口是否正确。
sample 的默认开启端口为 20000,确保启动前无占用。
- 配置环境变量
export APP_LOG_CONF_FILE="…/profiles/dev/log.yml"
export CONF_CONSUMER_FILE_PATH="…/profiles/dev/client.yml"