kenaito-dns/main.go

86 lines
2.6 KiB
Go

package main
/*
* @Description 服务入口
* @Author www.odboy.cn
* @Date 20241107
*/
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/miekg/dns"
"kenaito-dns/cache"
"kenaito-dns/config"
"kenaito-dns/controller"
"kenaito-dns/core"
"net/http"
"time"
)
func main() {
fmt.Println("[app] [info] " + time.Now().Format(config.AppTimeFormat) + " kenaito-dns version = " + config.AppVersion)
cache.ReloadCache()
go initDNSServer()
initRestfulServer()
}
func initDNSServer() {
// 注册 DNS 请求处理函数
dns.HandleFunc(".", core.HandleDNSRequest)
// 设置服务器地址和协议
server := &dns.Server{Addr: config.DnsServerPort, Net: "udp"}
// 开始监听
fmt.Printf("[dns] [info] "+time.Now().Format(config.AppTimeFormat)+" Starting DNS server on %s\n", server.Addr)
if err := server.ListenAndServe(); err != nil {
fmt.Printf("[dns] [error] "+time.Now().Format(config.AppTimeFormat)+" Failed to start DNS server: %s\n", err.Error())
}
}
func initRestfulServer() {
gin.SetMode(config.WebMode)
// 创建一个新的 Gin 引擎实例,使用 gin.New() 方法来创建一个不包含任何默认中间件的实例
router := gin.New()
// LoggerWithFormatter 中间件会写入日志到 gin.DefaultWriter
// 默认 gin.DefaultWriter = os.Stdout
// 自定义的日志格式化函数
router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
// 自定义日志格式
return fmt.Sprintf("[gin] [info] %s [Request] [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
// 请求时间戳
param.TimeStamp.Format(config.AppTimeFormat),
// 客户端 IP 地址
param.ClientIP,
// 请求方法 (GET, POST 等)
param.Method,
// 请求路径
param.Path,
// 请求协议
param.Request.Proto,
// 响应状态码
param.StatusCode,
// 请求延迟时间
param.Latency,
// 用户代理
param.Request.UserAgent(),
// 错误信息(如果有的话)
param.ErrorMessage,
)
}))
// 允许使用跨域请求,全局中间件
router.Use(core.Cors())
// 使用 Recovery 中间件,处理任何出现的错误,并防止服务崩溃
router.Use(gin.Recovery())
server := &http.Server{
Addr: config.WebServerPort,
Handler: router,
ReadTimeout: config.WebReadTimeout * time.Second,
WriteTimeout: config.WebWriteTimeout * time.Second,
}
controller.InitRestFunc(router)
fmt.Printf("[gin] [info] "+time.Now().Format(config.AppTimeFormat)+" Start Gin server: %s\n", config.WebServerPort)
err := server.ListenAndServe()
if err != nil {
fmt.Printf("[gin] [error] "+time.Now().Format(config.AppTimeFormat)+" Failed to start Gin server: %s\n", config.WebServerPort)
}
}