113 lines
2.3 KiB
Go
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))
|
|
}
|