xframe/vendor/github.com/nacos-group/nacos-sdk-go/v2/util/common.go

142 lines
3.6 KiB
Go

/*
* Copyright 1999-2020 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package util
import (
"encoding/json"
"net"
"net/http"
"net/url"
"strconv"
"time"
"github.com/nacos-group/nacos-sdk-go/v2/common/constant"
"github.com/nacos-group/nacos-sdk-go/v2/common/logger"
"github.com/nacos-group/nacos-sdk-go/v2/model"
)
func CurrentMillis() int64 {
return time.Now().UnixNano() / 1e6
}
func JsonToService(result string) *model.Service {
var service model.Service
err := json.Unmarshal([]byte(result), &service)
if err != nil {
logger.Errorf("failed to unmarshal json string:%s err:%+v", result, err)
return nil
}
if len(service.Hosts) == 0 {
logger.Warnf("instance list is empty,json string:%s", result)
}
return &service
}
func ToJsonString(object interface{}) string {
js, _ := json.Marshal(object)
return string(js)
}
func GetGroupName(serviceName string, groupName string) string {
return groupName + constant.SERVICE_INFO_SPLITER + serviceName
}
func GetServiceCacheKey(serviceName string, clusters string) string {
if clusters == "" {
return serviceName
}
return serviceName + constant.SERVICE_INFO_SPLITER + clusters
}
func GetConfigCacheKey(dataId string, group string, tenant string) string {
return dataId + constant.CONFIG_INFO_SPLITER + group + constant.CONFIG_INFO_SPLITER + tenant
}
var localIP = ""
func LocalIP() string {
if localIP == "" {
netInterfaces, err := net.Interfaces()
if err != nil {
logger.Errorf("get Interfaces failed,err:%+v", err)
return ""
}
for i := 0; i < len(netInterfaces); i++ {
if ((netInterfaces[i].Flags & net.FlagUp) != 0) && ((netInterfaces[i].Flags & net.FlagLoopback) == 0) {
addrs, err := netInterfaces[i].Addrs()
if err != nil {
logger.Errorf("get InterfaceAddress failed,err:%+v", err)
return ""
}
for _, address := range addrs {
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
localIP = ipnet.IP.String()
break
}
}
}
}
if len(localIP) > 0 {
logger.Infof("Local IP:%s", localIP)
}
}
return localIP
}
func GetDurationWithDefault(metadata map[string]string, key string, defaultDuration time.Duration) time.Duration {
data, ok := metadata[key]
if ok {
value, err := strconv.ParseInt(data, 10, 64)
if err != nil {
logger.Errorf("key:%s is not a number", key)
return defaultDuration
}
return time.Duration(value)
}
return defaultDuration
}
func GetUrlFormedMap(source map[string]string) (urlEncoded string) {
urlEncoder := url.Values{}
for key, value := range source {
urlEncoder.Add(key, value)
}
urlEncoded = urlEncoder.Encode()
return
}
// get status code by response,default is NA
func GetStatusCode(response *http.Response) string {
var statusCode string
if response != nil {
statusCode = strconv.Itoa(response.StatusCode)
} else {
statusCode = "NA"
}
return statusCode
}
func DeepCopyMap(params map[string]string) map[string]string {
result := make(map[string]string, len(params))
for k, v := range params {
result[k] = v
}
return result
}