f5/httpserver.go
aozhiwei ce7a0fd64c 1
2020-10-30 17:43:06 +08:00

94 lines
2.6 KiB
Go

package f5
import (
"net/http"
"sync"
"sync/atomic"
"fmt"
"q5"
)
type HttpServer struct {
totalRequestTimes int64
okTimes int64
pageNotFoundTimes int64
maxHandleTime int64
handlersMutex sync.RWMutex
handlers map[string]func(*http.ResponseWriter, *http.Request)
}
func (this *HttpServer) Init(serviceName string, logOutputTime int32) *HttpServer {
this.handlers = make(map[string]func(*http.ResponseWriter, *http.Request))
http.HandleFunc("/webapp/index.php", this.dispatchRequest)
this.RegisterHandle("Ops", "selfChecking",
func (w* http.ResponseWriter, r *http.Request) {
(*w).Write([]byte(`{"errcode":0, "errmsg":"", "healthy":1, "max_rundelay":10}`))
})
SysLog().Info("HttpServer.Init")
if logOutputTime > 0 {
Timer().AddRepeatTimer(
logOutputTime,
func (params* q5.XParams) {
params.Sender.SetString(serviceName)
},
func (params* q5.XParams) {
SysLog().Info("%s maxHandleTime:%d totalRequestTimes:%d okTimes:%d pageNotFoundTimes:%d",
params.Sender.GetString(),
this.maxHandleTime,
this.totalRequestTimes,
this.okTimes,
this.pageNotFoundTimes)
this.maxHandleTime = 0
this.okTimes = 0
this.pageNotFoundTimes = 0
})
}
return this
}
func (this *HttpServer) UnInit() {
SysLog().Info("HttpServer.UnInit")
}
func (this *HttpServer) Start(listen_port int32) {
SysLog().Info("HttpServer.Start listen_port:%d", listen_port)
go http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", listen_port), nil)
}
func (this *HttpServer) dispatchRequest(w http.ResponseWriter, r *http.Request) {
atomic.AddInt64(&this.totalRequestTimes, 1)
handleName := q5.Request(r, "c").GetString() + "$" + q5.Request(r, "a").GetString()
handle := this.getHandle(handleName)
if handle != nil {
beginTick := q5.GetTickCount()
handle(&w, r)
endTick := q5.GetTickCount()
if oldVal := atomic.LoadInt64(&this.maxHandleTime); beginTick - endTick > oldVal {
atomic.CompareAndSwapInt64(&this.maxHandleTime, oldVal, endTick - beginTick)
}
atomic.AddInt64(&this.okTimes, 1)
} else {
w.Write([]byte(`{"errcode":404, "errmsg":"接口不存在"}`))
atomic.AddInt64(&this.pageNotFoundTimes, 1)
}
}
func (this *HttpServer) getHandle(handleName string) (func(*http.ResponseWriter, *http.Request)) {
this.handlersMutex.Lock()
defer this.handlersMutex.Unlock()
if handle, ok := this.handlers[handleName]; ok {
return handle
} else {
return nil
}
}
func (this *HttpServer) RegisterHandle(c string, a string,
handle func(*http.ResponseWriter, *http.Request)) {
this.handlersMutex.Lock()
defer this.handlersMutex.Unlock()
handleName := c + "$" + a
this.handlers[handleName] = handle
}