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() handle, _ := this.handlers[handleName] return handle } 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 }