main.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "net/http"
  7. "os"
  8. "github.com/gin-gonic/gin"
  9. "github.com/redis/go-redis/v9"
  10. )
  11. var helpFlag bool
  12. var (
  13. port = "8080"
  14. domain = "localhost:8080"
  15. proto = "https"
  16. redisAddr = "localhost:6379"
  17. redisPassword = ""
  18. )
  19. func init() {
  20. flag.BoolVar(&helpFlag, "h", false, "display help")
  21. flag.StringVar(&port, "port", port, "port to run the server on")
  22. flag.StringVar(&domain, "domain", domain, "domain of the server")
  23. flag.StringVar(&proto, "proto", proto, "protocol of the server")
  24. flag.StringVar(&redisAddr, "conn", redisAddr, "address of the redis server")
  25. flag.StringVar(&redisPassword, "password", redisPassword, "password of the redis server")
  26. }
  27. func main() {
  28. flag.Parse()
  29. if helpFlag {
  30. flag.Usage()
  31. os.Exit(0)
  32. }
  33. // 从环境变量中读取配置,且环境变量优先级高于命令行参数
  34. parseEnvirons()
  35. InitLogger()
  36. // init and check redis
  37. initRedisClient(&redis.Options{
  38. Addr: redisAddr,
  39. Password: redisPassword,
  40. DB: 0,
  41. })
  42. ctx := context.Background()
  43. rc := GetRedisClient()
  44. rs := rc.Ping(ctx)
  45. if rs.Err() != nil {
  46. logger.Fatalln("redis ping failed: ", rs.Err())
  47. }
  48. logger.Info("redis ping success")
  49. // GC optimize
  50. ballast := make([]byte, 1<<30) // 预分配 1G 内存,不会实际占用物理内存,不可读写该变量
  51. defer func() {
  52. logger.Info("ballast len %v", len(ballast))
  53. }()
  54. // start http server
  55. run()
  56. }
  57. func parseEnvirons() {
  58. if p := os.Getenv("MYURLS_PORT"); p != "" {
  59. port = p
  60. }
  61. if d := os.Getenv("MYURLS_DOMAIN"); d != "" {
  62. domain = d
  63. }
  64. if p := os.Getenv("MYURLS_PROTO"); p != "" {
  65. proto = p
  66. }
  67. if c := os.Getenv("MYURLS_REDIS_CONN"); c != "" {
  68. redisAddr = c
  69. }
  70. if p := os.Getenv("MYURLS_REDIS_PASSWORD"); p != "" {
  71. redisPassword = p
  72. }
  73. }
  74. func run() {
  75. // init and run server
  76. gin.SetMode(gin.ReleaseMode)
  77. router := gin.Default()
  78. // logger
  79. router.Use(initServiceLogger())
  80. // static files
  81. router.LoadHTMLGlob("public/*.html")
  82. router.StaticFile("/logo.png", "public/logo.png")
  83. router.GET("/", func(context *gin.Context) {
  84. context.HTML(http.StatusOK, "index.html", gin.H{
  85. "title": "MyUrls",
  86. })
  87. })
  88. router.POST("/short", LongToShortHandler())
  89. router.GET("/:shortKey", ShortToLongHandler())
  90. logger.Infof("server running on :%s", port)
  91. router.Run(fmt.Sprintf(":%s", port))
  92. }