고란 청결 설정 관리

10233 단어 devopsgoconfiguration
이미지
현대 응용 프로그램에는 설정을 처리하는 좋은 방법이 많다.이제 우리는 프로필, 환경 변수, 명령행 매개 변수, CI 프로필 모드와 동적 프로필 구축, 원격 프로필 서버, 특정 맵과 귀속 서비스, 심지어 더 복잡한 것을 사용합니다.
그러나 목표는 같다. - 응용 프로그램에 설정을 제공하는데 이것은 신속하게 얻고 사용하기 쉽다.근데 어떻게 하지?

우리의 응용 프로그램은 어떻게 설정을 사용합니까


우수한 개발자로서 나는 항상 함축적으로 그것과 항쟁한다.나는 전역 변수를 사용하지 않는다. 나는 읽을 수 있는 방식으로 나의 코드를 구성하고, 나의 코드 흐름은 확실하고 명확하다.나는 환경 변수를 정말 좋아하지 않는다. 왜냐하면 그것들은 전체 변수와 마찬가지로 나쁘기 때문이다.하지만 처음에 한 번 읽으면 정확한 방식으로 처리할 수 있다.
따라서 응용 프로그램 설정이 있는 위치(파일, 환경, 원격 서버 등)에서 응용 프로그램 설정을 가져오고 응용 프로그램을 통해 필요한 곳에서 사용할 수 있도록 분배하는 것이 주된 생각이다.간단한 임무, 응?하지만 여전히 이 정도는 할 수 있는 방법이 많다.

많은 방법, 심지어 더 많은 도구


그래서 어떻게 설정을 얻는지 잘 알고 있습니다.모든 방법에는 자신의 최선의 실천이 있다.그런데 이제 어떡하지?흔한 답이 없다.
일부 라이브러리(예: viper는 구성을 글로벌 영역에 설정된 키 값으로 저장합니다.매우 유용하지만 매우 함축적이다.대형 프로젝트에서, 때때로 당신은 한 변수나 다른 변수가 어떻게 이런 상태에 도달했는지 잃을 수도 있다.
다른 라이브러리는 모든 내용을 하나의 버킷에 넣습니다. 환경, 파일, 명령행 옵션입니다.설령 모든 설정 값을 포함하는 아름다운 구조가 있다 하더라도 나에게는 여전히 분명하지 않고 소용없다.일반적으로 프로그램은 명령줄 방법 (CLI 도구) 이나 프로필 + 환경 방법 (웹 서비스, 용기화 응용 프로그램 등) 을 사용합니다.
매우 좋은 명령행 매개 변수 처리 라이브러리가 많다. 예를 들어 go-flags 나는 모든 것을 하나의 도구에 넣을 이유가 없다고 생각한다.
그러나 이 두 가지 방법은 모두 같은 문제가 있다. 마법이 많다.

마술


바둑은 모든 사람이 할 수 있는 언어가 아니다.그것은 많은 샘플 파일이 있기 때문에 유형 시스템이 쉽게 받아들일 수 없고 대상을 대상으로 프로그래밍할 가능성이 매우 제한적이다.하지만 마법이 없는 바로 읽을 수 있는 가치가 있다.나는 이런 것을 좋아한다.
그러나 반대로 설정을 사용하는 것은 종종 까다롭다.안전하지 않은 맵을 사용하지 않고 구조를 정의하더라도 어떤 환경 변수를 사용했는지 설명해야 한다.전 세계에서 사용되는 환경 변수로서 최악의 일은 없다.그러나 이 구조에 각 환경 변수의 현식 맵이 포함되어 있어도 응용 프로그램 밖에서 환경을 설정하기는 어렵다.어떤 사람(당신, 다른 개발자, DevOps, 또는 강요에 못 이겨 이렇게 하는 사람)은 사용하는 환경 변수 목록을 찾아서 정확하게 사용해야 합니다.
좋습니다. 문서나 원본 코드에 열거할 수 있습니다.둘 다 안 좋아요.문서가 유행이 지났을 수도 있습니다. 원본 코드는 시간과 기술이 필요합니다.
내가 보기에 유일한 정확한 방법은 완전한 환경 변수 목록을 도움말 출력에 추가하는 것이다. 설명, 기본값, 그리고 다른 의미 있는 정보를 포함한다.
나는 아직 복잡하지 않지만 여전히 유용한 것을 발견하지 못했다. 명확한 설정 설정과 깨끗하고 정보가 풍부한 도움말 출력이 있기 때문에 나는 스스로 그것을 구축했다.

그들을 깨끗하게 통치하는 방법


그래서 나는 많은 유행하는 설정 관리 라이브러리를 분석하고 자신의 설정 관리 라이브러리를 구축하기로 결정했다.왜?몇 가지 이유가 있습니다.
명령줄 매개 변수가 아닌 구성 파일과 환경 변수를 처리합니다.
마술이 없고 명확한 방식으로 설정을 읽고 사용하기;
스텔스 이름이 없으면 모든 맵은 표시를 사용해야 합니다.
양호하고 정보가 풍부한 도움말 출력;
다른 라이브러리와 쉽게 통합할 수 있습니다.
현재 우리: cleanenv 이 라이브러리는 이미 발표되었고 생산 과정에서 검증되었다.
우리 그것의 주요 특징을 이야기합시다.

명시적 구성 구조


cleanenv 라이브러리 뒤의 주요 사상은 모든 것을 현저하고 깨끗하게 하는 것이다.전역 상태도, 봉인된 지도도, 신기한 배경 업데이트도, 다른 숨겨진 작업도 없다.
모든 것이 뚜렷하게 보인다.이것이 바로 구조화된 형식을 설정의 기초로 선택한 이유다.구성 파일과 환경 변수의 구조를 분석하는 데 사용됩니다(원하는 깊이와 복잡성).그것도 설정 문서를 작성하기에 좋은 곳이다.

명시적 이름 지정 및 옵션


다음'마력이 없다'는 단계는 변수 이름을 명확하게 하는 것이다.중첩된 구조 이름을 기반으로 하는 복잡한 환경 이름 생성기가 없습니다. 검색을 통해 쉽게 찾을 수 있도록 이름을 원래대로 설정해야 합니다.
파일 해석에 대해 우리는 해당 라이브러리와 같은 방법을 사용한다. - JSON, YAML, TOML 등이다.
다음은 간단한 서버 구성 구조의 예입니다.
type ConfigDatabase struct {
    Port     string `yml:"port" env:"PORT" env-default:"5432"`
    Host     string `yml:"host" env:"HOST" env-default:"localhost"`
    Name     string `yml:"name" env:"NAME" env-default:"postgres"`
    User     string `yml:"user" env:"USER" env-default:"user"`
    Password string `yml:"password" env:"PASSWORD"`
}
이 구조는 YAML 구성 파일을 분석한 다음 환경에서 데이터를 읽을 수 있습니다.먼저 파일을 읽고 env 태그의 이름을 사용하여 환경 변수를 찾습니다.파일과 환경에서 데이터를 찾지 못하면 env-default 의 상수를 사용합니다.
지원되는 데이터 유형은 다음과 같습니다.
  • 개 정수;
  • 부동점수;
  • 열;
  • 블;
  • 패턴(사용자 정의 가능한 구분자 포함);
  • 지도(맞춤형 구분자 포함);
  • 읽기 가능 도움말 출력


    현대 컨테이너화 응용 프로그램은 환경 변수를 주요 설정으로 사용한다.따라서 응용 프로그램은 수백 개의 변수에 의존할 수 있다.흔히 볼 수 있는 문제는 변수의 정확한 목록이 종종 확실하지 않거나 유행이 지났다는 것이다. (심지어는 응용 프로그램을 통해 나누어지고 예상치 못한 곳에서 읽힌다는 것까지)
    cleanenv 라이브러리에 설명된 구조가 좋은 환경 변수 목록을 도움말 출력에 추가할 가능성을 복구하려면 다음과 같이 하십시오.
    import github.com/ilyakaznacheev/cleanenv
    
    type ConfigServer struct {
        Port     string `env:"PORT" env-description:"server port"`
        Host     string `env:"HOST" env-description:"server host"`
    }
    
    var cfg ConfigRemote
    
    help, err := cleanenv.GetDescription(&cfg, nil)
    if err != nil {
        ...
    }
    
    다음과 같은 정보를 얻을 수 있습니다.
    Environment variables:
      PORT  server port
      HOST  server host
    
    이것은 문서를 응용 프로그램과 동기화하는 데 도움을 줄 것입니다. 추가 파일이 필요하지 않습니다.

    통합


    간단함이 전부다.그러나 나는 간단한 도구를 제공할 뿐만 아니라 다른 코드와 함께 사용하기 쉽도록 해야 한다.
    라이브러리 도움말flag과 쉽게 연결할 수 있습니다.
    type config struct {
        Port     string `env:"PORT" env-description:"server port" env-default:"5432"`
        Host     string `env:"HOST" env-description:"server host" env-default:"localhost"`
        Name     string `env:"NAME" env-description:"server name" env-default:"postgres"`
        User     string `env:"USER" env-description:"server username" env-default:"user"`
        Password string `env:"PASSWORD" env-description:"server password"`
    }
    
    var (
        cfg     config
        cfgPath string
    )
    
    fset := flag.NewFlagSet("My app", flag.ContinueOnError)
    fset.StringVar(&cfgPath, "cfg", "", "path to config file")
    
    fset.Usage = cleanenv.FUsage(fset.Output(), &cfg, nil, fset.Usage)
    
    fset.Parse(os.Args[1:])
    
    go run your_app.go -h를 실행하면 출력은 다음과 같습니다.
    & go run your_app.go -h
    Usage of My app:
      -cfg string
            path to config file
    
    Environment variables:
      PORT string
            server port (default "5432")
      HOST string
            server host (default "localhost")
      NAME string
            server name (default "postgres")
      USER string
            server username (default "user")
      PASSWORD string
            server password
    

    더 많이 할 수 있는 가능성.


    이것은 매우 좋지만, 너는 아마 더 필요로 할 것이다.예를 들어 원격 서버나 다른 도구에서 설정을 가져오거나 업데이트할 수 있습니다.이를 위해 라이브러리의 강화 기능을 사용할 수 있습니다.자신의 원본에서 데이터를 읽기 위해 자신의 논리를 작성할 수 있는 방법이 있다.자세한 내용은 documentation 을 참조하십시오.

    결론


    그래서 cleanenv 라이브러리는 자물쇠마다 열쇠가 아니다.그것은 절대로 만능의 도구가 아니다.그러나 그 목적은 간단하고 깨끗하며 읽을 수 있지만 유연성이 충분하다. 만약 당신이 이렇게 해야 한다면.

    일리야 카즈나체프 / 청결한 환경


    ✨Golang의 깔끔한 환경 구성 리더


    그래서 만약 그것이 너를 도울 수 있다면 나는 매우 기쁘다.나는 지금 나의 프로젝트에서 그것을 적극적으로 사용하고 있기 때문에 그것은 효과가 풍부하다.
    또한 언제든지 유용하다고 생각하는 모든 기능을 요청하십시오.
    깨끗이 하세요!

    좋은 웹페이지 즐겨찾기