背景
项目在做三方推送时需要先判断三方服务是否存活,以避免不必要的错误推送
原理
利用HTTP的OPTIONS:这个方法极少使用。它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,其中的值是所支持的方法,如“GET, POST”。这样就能够检测出服务是否支持该方法继而检测存活
示例代码
package httputils
import (
"bytes"
"errors"
"io/ioutil"
"net/http"
"os"
)
//http 探针
func HttpProbe(httpPool *hcpool.Pool, url string) bool {
req, _ := http.NewRequest("OPTIONS", url, nil)
resp, _ := httpPool.Do(req)
if resp != nil{
defer resp.Body.Close()
//fmt.Println("response code",resp.StatusCode)
if resp.StatusCode == 200 {
//ioutil.ReadAll(resp.Body)
return true
}
}
return false
}
//http检测
func httpProbe() {
iotlogger.Info("启动探针")
for {
if cfg, ok := getPushCfg(config.System.Cid); ok == true {
//推送数据
if len(cfg.PushUrl) == 0 {
iotlogger.Info("httpProbe pushUrl is null")
continue
}
if httputils.HttpProbe(httpPool, cfg.PushUrl) {
isLive = true
} else {
isLive = false
}
iotlogger.Debug("探测地址->%s ,是否存活->%t", cfg.PushUrl, isLive)
}
time.Sleep(time.Second * 10)
}
}