简介
腾讯开源的Tars和Dcache用于快速搭建微服务系统,使用还是很方便的。
但由于使用人数及场景还不是很充分,仍有一些隐藏的问题,使用中要评估到该风险。
本文就笔者使用经历,小结一下遇到的问题及解决方式,供参考。
注:权威信息请以官方为主。
win部署tarsnode发布服务失败
自v2.4.2以来,Tars开始提供了较好地支持Windows系统功能。
但在Windows部署tarsnode后,发布服务总是失败,显示的错误原因如下:
[TC_ConfigDomain::parse] 'C:\\Windows\ ystem32\\usr\\local\\app\\tars\\tarsnode\\data\\DemoServer\\bin\\' is invalid, '\ ' couldn't be parse!
刚开始找了一圈没找到原因,我还查了源码把源码改了:
注释了如图中的替换字符串的行,结果,上面的问题是解决了,但又来了个新问题:
TARS_PATH\\tarsnode\util\busybox.exe tar xzfv C:\Windows\system32\TARS_PATH\tarsnode\data\tmp\download\BatchPatchingLoad\Demo\Demo.tgz -C C:\Windows\system32\TARS_PATH\tarsnode\data\tmp\download\BatchPatching\Demo, error!
由此注意到,这问题的根本原因可能在于路径。
为什么是c:/windows/system32
呢?
而且也没有理由建立一个TARS_PATH
的目录。
查看了tarsnode源码,对于win系统,它会读取basepath.win
等相关配置。
又咨询了Tars开发人员,最终通过增加win配置解决了这个问题,步骤如下:
- 进入web界面-运维管理-模板管理
- 编辑tars.default,在中增加以下内容:
basepath.win=C:\tars-install\tars\tarsnode\data # 根据tarsnode实际安装路径填写,下同
datapath.win=C:\tars-install\tars\tarsnode\data
logpath.win=C:\tars-install\tars\app_log
- 重启win节点机tarsnode即可
此时,服务的路径就是c:/tars-install/tars/tarsnode/data
了。
另外,如果win发布的应用依赖动态库的话,也需要把库提前放到对应路径下,如:c:/windows/system32/
。
登录web后看不到服务
假期归来,开始工作,打开web,登录后发现了奇怪的一幕:
登录后,显示没有服务?!!!
赶紧执行一系列操作:
-
查看mysql是否正常,验证正常
-
查看后台所有tars服务是否正常,正常
-
界面进行框架检查,显示失败
-
后台查看该服务,正常(见鬼了)
-
查看dcache是正常的,所以应该不是dcache的问题
-
清浏览器缓存,重试,依然不行
-
最后仔细观察,发现了问题之处,请看下图:
-
用户明显不对啊!!!
-
退出,重新使用admin登录,这下可以了
结论:
- 可能是浏览器缓存导致的登录问题,登录时直接以游客身份进来了,所以看不到服务
- 退出当前账户,然后使用admin重新登录就可以了
重启设备后Dcache服务启动失败
在Dcache正常运行时,如果突然掉电或其他原因导致设备重启,在重启DCache服务时,都可能发现以下信息:
这是因为Dcahce在首次运行时创建了shmkey相关的dat文件,而突然重启时,该文件没有删除,再次启动就会失败。
这时,需要先关闭Dcache服务,然后删除dat文件,最后再重启服务就可以了。
dat文件位于/usr/local/app/tars/tarsnode/data/
目录下相应的DCache服务下的data目录下。
启动Dcache服务时提示shmkey已经存在
如果已经创建过该key,就会出现这个错误。
可以通过ipcs
命令查看所有的shmkey:
确认已经存在的key没有使用,可以使用ipcrm -m
把它删除:
然后再重启DCache服务即可。
Win下Tars服务发布失败
Tars发布服务时,后台会执行一系列流程,包括发布包下载、验证、解压、启动等,任何一个步骤都会导致服务发布失败。
一般情况下,是不会有问题的。
这里单独写win下发布失败,是因为在Linux下,是可以直接替换一个正在运行的进程的。但是windows下这样的操作会失败,因为文件忙。
所以在发布win下服务时,可以先把正在运行的服务关闭,再发布即可。
Dcache调用getMKVBatch接口失败
服务程序中调用getMKVBatch接口查询mkv模块的批量数据时,可能会遇到返回的错误码为-25的错误,查看模块的日志,如下:
2020-11-02 16:42:18|139942734829312|DEBUG|MKCacheImp::getMKVBatch recv : 1|333333|*|status!=2&status!=3
2020-11-02 16:42:18|139942734829312|DEBUG|get value size = 2, ret = 12
2020-11-02 16:42:18|139942734829312|ERROR|MKCacheImp::getMKVBatch exception: require field not exist, tag: 11 headType: 1, headTag: 1, mainKey = 333333
提示,查询的字段不存在。
这时,很可能是创建mkv时建立的数据结构与代码中要查询的数据结构不一致造成的。建议查看代码,把查询请求的所有字段与模块的所有字段对比。
如果确认无误,仍然报错,可以尝试重启mkv模块。