Files
hk4e/air-api/client/discovery.go
2022-11-20 15:38:00 +08:00

196 lines
4.3 KiB
Go

package client
import (
"encoding/json"
"errors"
"io/ioutil"
"net/http"
"strconv"
"time"
)
var httpClient http.Client
var airAddr string
var airPort int
func init() {
httpClient = http.Client{
Transport: &http.Transport{
DisableKeepAlives: true,
},
Timeout: time.Second * 60,
}
}
// 设置注册发现中心地址
func SetAirAddr(addr string, port int) {
airAddr = addr
airPort = port
}
// 获取某个HTTP服务的所有实例
func FetchHttpService(name string) (*ResponseData, error) {
url := "http://" +
airAddr + ":" + strconv.Itoa(airPort) +
"/http/fetch" +
"?name=" + name
return getAirServiceCore(url)
}
// 获取全部HTTP服务的实例
func FetchAllHttpService() (*ResponseData, error) {
url := "http://" +
airAddr + ":" + strconv.Itoa(airPort) +
"/http/fetch/all"
return getAirServiceCore(url)
}
// 长轮询某个HTTP服务的实例状态变化
func PollHttpService(name string) (*ResponseData, error) {
lastTime := int64(0)
for {
nowTime := time.Now().UnixNano()
if time.Duration(nowTime-lastTime) < time.Second {
time.Sleep(time.Millisecond * 100)
continue
}
lastTime = time.Now().UnixNano()
url := "http://" +
airAddr + ":" + strconv.Itoa(airPort) +
"/poll/http" +
"?name=" + name
responseData, err := getAirServiceCore(url)
if err != nil {
return nil, err
}
if responseData.Code != 0 {
return nil, errors.New("response code error")
}
if responseData.Instance == nil {
continue
}
return responseData, nil
}
}
// 长轮询全部HTTP服务的实例状态变化
func PollAllHttpService() (*ResponseData, error) {
lastTime := int64(0)
for {
nowTime := time.Now().UnixNano()
if time.Duration(nowTime-lastTime) < time.Second {
time.Sleep(time.Millisecond * 100)
continue
}
lastTime = time.Now().UnixNano()
url := "http://" +
airAddr + ":" + strconv.Itoa(airPort) +
"/poll/http/all"
responseData, err := getAirServiceCore(url)
if err != nil {
return nil, err
}
if responseData.Code != 0 {
return nil, errors.New("response code error")
}
if responseData.Service == nil {
continue
}
return responseData, nil
}
}
// 获取某个RPC服务的所有实例
func FetchRpcService(name string) (*ResponseData, error) {
url := "http://" +
airAddr + ":" + strconv.Itoa(airPort) +
"/rpc/fetch" +
"?name=" + name
return getAirServiceCore(url)
}
// 获取全部RPC服务的实例
func FetchAllRpcService() (*ResponseData, error) {
url := "http://" +
airAddr + ":" + strconv.Itoa(airPort) +
"/rpc/fetch/all"
return getAirServiceCore(url)
}
// 长轮询某个RPC服务的实例状态变化
func PollRpcService(name string) (*ResponseData, error) {
lastTime := int64(0)
for {
nowTime := time.Now().UnixNano()
if time.Duration(nowTime-lastTime) < time.Second {
time.Sleep(time.Millisecond * 100)
continue
}
lastTime = time.Now().UnixNano()
url := "http://" +
airAddr + ":" + strconv.Itoa(airPort) +
"/poll/rpc" +
"?name=" + name
responseData, err := getAirServiceCore(url)
if err != nil {
return nil, err
}
if responseData.Code != 0 {
return nil, errors.New("response code error")
}
if responseData.Instance == nil {
continue
}
return responseData, nil
}
}
// 长轮询全部RPC服务的实例状态变化
func PollAllRpcService() (*ResponseData, error) {
lastTime := int64(0)
for {
nowTime := time.Now().UnixNano()
if time.Duration(nowTime-lastTime) < time.Second {
time.Sleep(time.Millisecond * 100)
continue
}
lastTime = time.Now().UnixNano()
url := "http://" +
airAddr + ":" + strconv.Itoa(airPort) +
"/poll/rpc/all"
responseData, err := getAirServiceCore(url)
if err != nil {
return nil, err
}
if responseData.Code != 0 {
return nil, errors.New("response code error")
}
if responseData.Service == nil {
continue
}
return responseData, nil
}
}
func getAirServiceCore(url string) (*ResponseData, error) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
rsp, err := httpClient.Do(req)
if err != nil {
return nil, err
}
data, err := ioutil.ReadAll(rsp.Body)
_ = rsp.Body.Close()
if err != nil {
return nil, err
}
responseData := new(ResponseData)
err = json.Unmarshal(data, responseData)
if err != nil {
return nil, err
}
return responseData, nil
}