使用读写锁来保证数据安全






package initialization


import (


   "time"
   "github.com/gin-gonic/gin"
   "monitor/server/dingding"
   "monitor/server/email"
   "sync"
)


type  RLMap struct{
   Data map[string]time.Time
   sync.RWMutex
}


func (s *RLMap) Set(k string, v time.Time){
   s.Lock()
   s.Data[k] = v
   s.Unlock()
}
func (s *RLMap) Get(k string)(v time.Time, ok bool){
   s.RLock()
   defer s.RUnlock()
   v,ok = s.Data[k]
   return v, ok
}
func (s *RLMap)del(k string)  {
   s.Lock()
   delete(s.Data,k)
   s.Unlock()
}


var    Listenmap = new(RLMap)
var Problemlist = new(RLMap)


//func random() (res string){
// str := "0123456789"
// bytes := []byte(str)
// result := []byte{}
// r := rand.New(rand.NewSource(time.Now().UnixNano()))
// for i := 0; i < 10; i++ {
//    result = append(result, bytes[r.Intn(len(bytes))])
// }
// res = string(result)
// return res
//}


func Heartbeat(c *gin.Context){
   //fmt.Println(c.Request.Header)//map[User-Agent:[Go-http-client/1.1] Accept-Encoding:[gzip]]
   //fmt.Println(c.Request.URL.Path)// /
   //fmt.Println(c.Request.RemoteAddr)//127.0.0.1:50757
   //fmt.Println(c.Request.RequestURI)///?ID=1
   //fmt.Println(c.Request.Host)//127.0.0.1:8888
   //fmt.Println(c.Request.Body)//{}


   ID := c.Query("ID")
   Listenmap.Set(ID, time.Now())
    _,ok := Problemlist.Get(ID)


   if ok {
      Problemlist.del(ID)
      dingding.Dingding(ID + "服务已恢复")
      email.Email(ID + "服务已恢复")
   }


}




func SeriousError(c *gin.Context){
   ID := c.PostForm("ID")
   msg := c.PostForm("msg")
   dingding.Dingding(ID + msg)
   email.Email(ID + msg)
}

 

你可能感兴趣的:(Golang)