之前用FASTAPI写了一个随机cookies请求的接口,现在尝试用golang实现同样的效果
1.编写go代码
package main
import (
"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.DB
func main() {
initDB()
defer db.Close()
// 注册路由api
http.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 error
db, 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 string
var user_account string
err := db.QueryRow(`
SELECT cookies,user_account
FROM external_account
WHERE account_type_id=2 AND is_deleted=0 AND account_status=0
ORDER 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 = cookie
response.UserAccount = user_account
log.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程序,内存差了两倍