golang实现一个mysql中随机获取cookies的API

之前用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程序,内存差了两倍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值