golang实现一个mysql中随机获取cookies的API
之前用FASTAPI写了一个随机cookies请求的接口,现在尝试用golang实现同样的效果
1.编写go代码
package mainimport ("database/sql""encoding/json""fmt"_ "github.com/go-sql-driver/mysql""log""net/http""os""time"
)// 获取环境变量(优先使用环境变量,不存在则使用默认值)
func getEnv(key, defaultValue string) string {if value, exists := os.LookupEnv(key); exists {return value}return defaultValue
}// 数据库配置
const (dbDriver = "mysql"dbUser = "nobuy" // 替换为实际用户名dbPassword = "@zzwl" // 替换为实际密码dbHost = "192.168.1.1" // 替换为实际主机dbPort = "3306" // 替换为实际端口dbName = "nobuy" // 替换为实际数据库名
)// CookieResponse API响应结构
type CookieResponse struct {Status string `json:"status"`Cookie string `json:"cookie,omitempty"`Error string `json:"error,omitempty"`UserAccount string `string:"user_account,omitempty"`
}var db *sql.DBfunc main() {initDB()defer db.Close()// 注册路由apihttp.HandleFunc("/randomcookie", randomCookieHandler)// 启动HTTP服务器port := ":8081"log.Printf("Server started at http://localhost%s", port)log.Fatal(http.ListenAndServe(port, nil))
}func initDB() {dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true",getEnv("DB_USER", dbUser),getEnv("DB_PASSWORD", dbPassword),getEnv("DB_HOST", dbHost),getEnv("DB_PORT", dbPort),getEnv("DB_NAME", dbName))var err errordb, err = sql.Open(dbDriver, dsn)if err != nil {log.Fatalf("Database connection failed: %v", err)}// 设置连接池参数db.SetMaxOpenConns(25)db.SetMaxIdleConns(25)db.SetConnMaxLifetime(5 * time.Minute)// 验证数据库连接if err = db.Ping(); err != nil {log.Fatalf("Database ping failed: %v", err)}log.Println("Database connected successfully")
}
func randomCookieHandler(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")response := CookieResponse{}var cookie stringvar user_account stringerr := db.QueryRow(`SELECT cookies,user_accountFROM external_accountWHERE account_type_id=2 AND is_deleted=0 AND account_status=0ORDER BY RAND()LIMIT 1`).Scan(&cookie, &user_account)switch {case err == sql.ErrNoRows:response.Status = "error"response.Error = "No cookies avaiable"w.WriteHeader(http.StatusNotFound)case err != nil:response.Status = "error"response.Error = fmt.Sprintf("Database error: %v", err)w.WriteHeader(http.StatusInternalServerError)default:response.Status = "success"response.Cookie = cookieresponse.UserAccount = user_accountlog.Printf(response.Status, response.Cookie, response.UserAccount)}json.NewEncoder(w).Encode(response)}
2.docker打包golang镜像(直接运行.go文件)
打包的Dockerfile如下所示
FROM alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/golang AS builder# 设置工作目录
WORKDIR /app
# 设置国内镜像源
ENV GOPROXY=https://goproxy.cn,direct
# 复制 Go 源代码到工作目录
COPY . .# 构建你的 Go 程序
# RUN go build go_code/hello/demo.go# 暴露端口 8888
EXPOSE 8081# 设置容器启动时执行的命令
CMD go run "cookie_api.go"
打包成docker镜像
docker build -f Dockerfile3 -t cookieapi:1 .
3.docker打包golang镜像
将golang打包成可执行程序,然后打包docker镜像
FROM registry.cn-hangzhou.aliyuncs.com/devops_de/golang:1.21-alpine AS builder# 设置工作目录
WORKDIR /app
# 设置国内镜像源
ENV GOPROXY=https://goproxy.cn,direct
# 复制 Go 源代码到工作目录
COPY . .# 复制源代码并编译
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o nobuy-app# 运行阶段
FROM registry.cn-hangzhou.aliyuncs.com/devops_de/alpine:3.18
WORKDIR /app
# 从构建阶段复制二进制文件
COPY --from=builder /app/nobuy-app /app/nobuy-app
# 设置可执行权限
RUN chmod +x /app/nobuy-app
# 暴露端口 8888
EXPOSE 8081# 设置启动命令
CMD ["/app/nobuy-app"]
4.运行效果对比
运行效果差异如下所示
[root@centos-1 cookies]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adc6c31adf23 cookieapi:1 "/app/nobuy-app" 2 hours ago Up 2 hours 0.0.0.0:8181->8081/tcp, :::8181->8081/tcp romantic_bohr
f6023569cc62 cookies_api:0625 "/bin/sh -c 'go run …" 3 hours ago Up 3 hours 0.0.0.0:8089->8081/tcp, :::8089->8081/tcp
上述结果可以看到,直接运行cookie_api.go和运行打包可执行的go程序,内存差了两倍