终于完成了php->go的转移工作

2022年 9月 19日

原型产品使用的 thinkphp+mysql+redis开发的 纯api,由于并发太大,php吃资源离谱。基于节约成本考虑,直接用go重写 。数据库 依旧是原来数据库。

总共30几个接口,历时一个月从零开始学习go并完成迁移工作。先重写大并发接口,而后逐个线上替换。

go主要用的库


import (
	"context"
	"crypto/md5"
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"strconv"
	"strings"
	"time"

	"github.com/buger/jsonparser"
	_ "github.com/go-sql-driver/mysql"
	"github.com/valyala/fasthttp"
)

jsonparser 是一个json处理库,比自带的encoding/json速度要快,但encoding/json更灵活一些,所以都使用了

fasthttp 是一个更加高性能的web服务,在多并发的时候 线程复用更强大

但是 依旧使用了 net/http 来处理一些 第三方sdk

感受和优势

1、vscode自带代码校验,大错误小错误都会提示,代码低级失误较少。代码自动格式化

2、不需要搭建环境,golang官方直接下载 安装即可,zip的话添加一个系统变量即可使用

3、可以不依赖nginx,当然基于ssl gzip 日志 等需求,前端还是套一个nginx 简单一些

4、编译速度很快,在vscode可以简单重新编译调试,4秒左右

5、直接导出二进制文件,不用担心源码泄露 尤其是源码里面的一些密码部分。比如md5的二次加密密钥等

6、计划任务 定时任务,可以直接单开一个线程处理,不依赖前台php文件唤起(当然 shell php也可以)go处理起来 很简单只需要一行 go cron_tab() //并发任务 即可

7、宝塔自带守护进程,不需要自己另外守护

8、fmt.Println fmt.Fprint(ctx, "{}") 的日志输出,开发过程中监控运行状态更简单

9、跨平台 依旧有高性能,win linux mac arm均可以搞定

10、可以开发简单的 客户端软件。同语言 搞起来省心

11、包管理和源码文件 管理,没有php方便 ,需要用go mod 或者第三方框架

12、go和php相比,强类型需要时间适应,另外很多函数需要自己复写。go的异常处理 较为啰嗦,原生开发go的话,需要自己写大量简单的函数来封装 以便主流程代码简洁比如 md5 函数

func MD5(str string) string {
	data := []byte(str + "xxxxxxxx") //附加密码
	has := md5.Sum(data)
	md5str := fmt.Sprintf("%x", has) 
	return md5str
}

还有 json和map互转 等等

13、字符类型转化 很啰嗦,甚至 int int8 int16 之间转化 代码啰嗦,不过按需使用 可以做到更快的运行速度和极限的更低的资源占用

小类

http://www.leiyanhui.com/?about

Comments