MyUrls/main.go
2024-09-09 20:09:52 +08:00

113 lines
2.3 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"net/http"
"os"
"github.com/gin-gonic/gin"
"github.com/redis/go-redis/v9"
)
var helpFlag bool
var (
port = "8080"
domain = "localhost:8080"
proto = "https"
redisAddr = "localhost:6379"
redisPassword = ""
)
func init() {
flag.BoolVar(&helpFlag, "h", false, "display help")
flag.StringVar(&port, "port", port, "port to run the server on")
flag.StringVar(&domain, "domain", domain, "domain of the server")
flag.StringVar(&proto, "proto", proto, "protocol of the server")
flag.StringVar(&redisAddr, "conn", redisAddr, "address of the redis server")
flag.StringVar(&redisPassword, "password", redisPassword, "password of the redis server")
}
func main() {
flag.Parse()
if helpFlag {
flag.Usage()
os.Exit(0)
}
// 从环境变量中读取配置,且环境变量优先级高于命令行参数
parseEnvirons()
InitLogger()
// init and check redis
initRedisClient(&redis.Options{
Addr: redisAddr,
Password: redisPassword,
DB: 0,
})
ctx := context.Background()
rc := GetRedisClient()
rs := rc.Ping(ctx)
if rs.Err() != nil {
logger.Fatalln("redis ping failed: ", rs.Err())
}
logger.Info("redis ping success")
// GC optimize
ballast := make([]byte, 1<<30) // 预分配 1G 内存,不会实际占用物理内存,不可读写该变量
defer func() {
logger.Info("ballast len %v", len(ballast))
}()
// start http server
run()
}
func parseEnvirons() {
if p := os.Getenv("MYURLS_PORT"); p != "" {
port = p
}
if d := os.Getenv("MYURLS_DOMAIN"); d != "" {
domain = d
}
if p := os.Getenv("MYURLS_PROTO"); p != "" {
proto = p
}
if c := os.Getenv("MYURLS_REDIS_CONN"); c != "" {
redisAddr = c
}
if p := os.Getenv("MYURLS_REDIS_PASSWORD"); p != "" {
redisPassword = p
}
}
func run() {
// init and run server
gin.SetMode(gin.ReleaseMode)
router := gin.Default()
// logger
router.Use(initServiceLogger())
// static files
router.LoadHTMLGlob("public/*.html")
router.StaticFile("/logo.png", "public/logo.png")
router.GET("/", func(context *gin.Context) {
context.HTML(http.StatusOK, "index.html", gin.H{
"title": "MyUrls",
})
})
router.POST("/short", LongToShortHandler())
router.GET("/:shortKey", ShortToLongHandler())
logger.Infof("server running on :%s", port)
router.Run(fmt.Sprintf(":%s", port))
}