微信搜索功能的加密功能包(golang实现)

为啥写这个代码包

由于微信搜索的接入需要进行性能测试,而我司项目惯用的PHP框架不适合用来做这样高性能的接口,所以我经过对空框架的压测之后选择用Golang的gin框架来做这个功能的开发。

本来想偷懒在现有项目上(Laravel框架)开发一下就好了,但是开发完了之后发现性能测试不达标,差太多了。200QPS就已经扛不住了,本来想用xdebug分析下到底性能瓶颈在哪,但是转念一想,业务逻辑很简单啊,要出问题应该出在MySQL或者Redis等存储服务上。
于是重点监控了一下,MySQL和Redis,还有ES。发现都没有报警。很明显在应用层就已经卡住了。后来我下载了一个新的Laravel项目,不写任何逻辑,就压空框架。结果真的就跪了。

于是决定还是用性能好的Golang来实现这个功能吧,省一点服务器的成本。

但是官方示例代码没有Golang的,所以我只能参考PHP,Python和Java代码翻译成Golang的样子。这个过程也是痛苦的,毕竟自己在加解密方面的知识真的不多。

翻译完成了代码包之后,其实对到底发生了什么还是不完全理解。目前也不打算深究。

简单的思考

说说翻译过程中的一些思考吧:

  1. 官方示例代码写的很随意,有时候很多功能耦合到一起,这个就需要反复读代码,参考不同语言的实现,这样能比较快速的划分出独立功能。
  2. 性能的考虑,虽然很细枝末节,但是对于性能要求高的情况还是值得思考一下。
    • 比如传入参数是string的地方我到底要不要换成[]byte,返回string的地方,我要不要换成[]byte,因为golang中很多字符串的操作都是基于[]byte的,所以一开始就有这种考虑。但是问题在于一开始我也无法确定该用哪个好,只是参考示例代码来翻译。这个时候也不用过于纠结,我的策略就是先调通功能,然后在逐步优化。实时上就是最后好几个函数都把string换成了[]byte,避免在string和[]byte之间来回转换。
    • 字符串拼接只用strings.Builder来做,这个之前的文章有介绍过。
  3. 复用性的考虑,像这种基本和业务无关的代码其实是比较容易提取出公用方法之类的东西的。所以翻译的时候也做了这方面的努力。

代码仓库地址

不得不说自己功力还是很浅啊,翻译这个代码也是让我好头疼。虽然可能不算太好,我也把它开放出来吧。希望能给人提供便利。

https://github.com/cook-coder/wxcrypt

加载评论框需要科学上网