github.com/nacos-group/nacos-sdk-go@v1.1.4/clients/cache/disk_cache.go (about)

     1  /*
     2   * Copyright 1999-2020 Alibaba Group Holding Ltd.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *      http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package cache
    18  
    19  import (
    20  	"encoding/json"
    21  	"fmt"
    22  	"io/ioutil"
    23  	"os"
    24  	"runtime"
    25  	"strconv"
    26  	"strings"
    27  
    28  	"github.com/go-errors/errors"
    29  	"github.com/nacos-group/nacos-sdk-go/common/constant"
    30  	"github.com/nacos-group/nacos-sdk-go/common/file"
    31  	"github.com/nacos-group/nacos-sdk-go/common/logger"
    32  	"github.com/nacos-group/nacos-sdk-go/model"
    33  	"github.com/nacos-group/nacos-sdk-go/util"
    34  )
    35  
    36  func GetFileName(cacheKey string, cacheDir string) string {
    37  
    38  	if runtime.GOOS == constant.OS_WINDOWS {
    39  		cacheKey = strings.ReplaceAll(cacheKey, ":", constant.WINDOWS_LEGAL_NAME_SPLITER)
    40  	}
    41  
    42  	return cacheDir + string(os.PathSeparator) + cacheKey
    43  }
    44  
    45  func WriteServicesToFile(service model.Service, cacheDir string) {
    46  	file.MkdirIfNecessary(cacheDir)
    47  	sb, _ := json.Marshal(service)
    48  	domFileName := GetFileName(util.GetServiceCacheKey(service.Name, service.Clusters), cacheDir)
    49  
    50  	err := ioutil.WriteFile(domFileName, sb, 0666)
    51  	if err != nil {
    52  		logger.Errorf("failed to write name cache:%s ,value:%s ,err:%+v", domFileName, string(sb), err)
    53  	}
    54  
    55  }
    56  
    57  func ReadServicesFromFile(cacheDir string) map[string]model.Service {
    58  	files, err := ioutil.ReadDir(cacheDir)
    59  	if err != nil {
    60  		logger.Errorf("read cacheDir:%s failed!err:%+v", cacheDir, err)
    61  		return nil
    62  	}
    63  	serviceMap := map[string]model.Service{}
    64  	for _, f := range files {
    65  		fileName := GetFileName(f.Name(), cacheDir)
    66  		b, err := ioutil.ReadFile(fileName)
    67  		if err != nil {
    68  			logger.Errorf("failed to read name cache file:%s,err:%+v ", fileName, err)
    69  			continue
    70  		}
    71  
    72  		s := string(b)
    73  		service := util.JsonToService(s)
    74  
    75  		if service == nil {
    76  			continue
    77  		}
    78  
    79  		serviceMap[f.Name()] = *service
    80  	}
    81  
    82  	logger.Info("finish loading name cache, total: " + strconv.Itoa(len(files)))
    83  	return serviceMap
    84  }
    85  
    86  func WriteConfigToFile(cacheKey string, cacheDir string, content string) {
    87  	file.MkdirIfNecessary(cacheDir)
    88  	fileName := GetFileName(cacheKey, cacheDir)
    89  	err := ioutil.WriteFile(fileName, []byte(content), 0666)
    90  	if err != nil {
    91  		logger.Errorf("failed to write config  cache:%s ,value:%s ,err:%+v", fileName, content, err)
    92  	}
    93  }
    94  
    95  func ReadConfigFromFile(cacheKey string, cacheDir string) (string, error) {
    96  	fileName := GetFileName(cacheKey, cacheDir)
    97  	b, err := ioutil.ReadFile(fileName)
    98  	if err != nil {
    99  		return "", errors.New(fmt.Sprintf("failed to read config cache file:%s,err:%+v ", fileName, err))
   100  	}
   101  	return string(b), nil
   102  }