我为什么要使用golang重构Bullet?
我是一个Java开发,最熟悉的语言是Java,但是现在的Java在运行时会占用大量的内存空间,跑起来几百兆就没有了,而BulletClient可能会运行在低功耗的ARM linux系统中,在有限的内存中使用。除了内存限制,还有磁盘空间限制。目前容易入手的ARMbain Linux 硬件设备时玩客云(网心云、小爱盒子)。这个时我目前使用成本最低的Arm linux系统硬件了。在咸鱼或淘宝上在60员元左右就能买到。
所以我开启了一个新的分支,客户端放弃使用Java,服务器端使用Java到无所谓。接下来就是开始重构Bullet协议,通过golang中的结构体+函数来模拟消息对象。由于Bullet协议目前承载在Websocket之上的协议。因此移植工作也变得简单,只要使用golang 用websocket连接到服务器端,然后通过二进制的消息即可用golang与服务器之前通信。
令人兴奋的是golang编译的二进制可执行文件支持ARM设备,也支持32位和64位。而且编译ngrok客户端在11MB左右,运行起来后内存占用在2MB左右,非常适合低功耗的ARM设备。甚至理论上他可以跑在Android设备上,通过内网的Android手机安装客户端APP链接到服务器。
要开始做的第一件事儿-熟悉golang开发
综合golang在各方面的优势,所以我选择了golang。早在16年的时候就听说了golang,在成都也有golang的岗位。说实话一个做Java开发的程序员习惯了Java的语法和它的生态,真的就很难选择其他语言了。有的时候也会因为兴趣爱好而选择重新学习一份对自己来说是一门新的语言。通过W3CShcool可以把最基础的golang开发知识学习到位,深入的东西还是需要通过实战去了解,所以我直接开启了读golang代码模式。把ngrok的代码打开,翻来覆去的去看去理解他,通过debug模式去了解在各个变量存的值以及对应的逻辑。通过一些列的尝试或打印输出来了解ngrok的运行逻辑。如何继承一个新的golang项目框架进去,等等。
要开始做的第二件事儿-集成Websocket
由于Bullet协议是基于Websocket之上的二进制协议,所以我需要把java的Websocket客户端的代码逻辑移植到ngrok客户端中,通过查看资料了解到了这个项目:
https://github.com/gorilla/websocket
按照golang开源项目的套路,每个golang项目都会有自己的example程序,慢慢的去熟悉这些代码例子,第一个Websocket链接程序就写好了。这仅仅是golang的代码链接到了bullet服务器端,这就让我异常的兴奋,程序员在兴奋的时候写代码效率是最高的。于是就把基础的绑定设备的代码实现了。然后就是其他的消息实现。
完整的BulletClient流水线改造
最终通过几天时间的努力,还有周末的休息时间,完整的逻辑全部实现。于是就开始了Jenkins流水线的改造,让它能够自动的打包分发到宝塔的http服务中。再通过另外的一套流水线了实现,运行模板的打包与自动化分发到github或是百度网盘(这一步还没有实现、一切都是手动发布的,哈哈)。
docker buildx 分发多平台镜像
基于Dockerfile来定制bulletClient的镜像。这一步也花了不少时间,最终还是成功了。
docker run --rm --name=bullet-client \
wuweiit/bullet-client:0.0.6
支持armv6、amd64、386 等架构系统
结束
这些只是小目标,实现了java客户端的golang代码重构。没有新增任何的功能,但是Bullet这个产品是我目前做的唯一一个有商业价值的东西,我希望是能把他做好,让更多的人来使用他。