우아한 해결 유지 보수 문제는 여러 환경에서 엔지니어링 application.properties을 SpringBoot

마이크로 신호 : geekoftaste, 당신과 함께 논의하기 위해 최선을 다하겠습니다!

배경

우리는 제 3 자 라이브러리와 같은 형상 항목이 프로젝트를 촉진하기 위해,이 통합 된 구성 파일에 포트, DB 구성 및 작품을 두보 프로젝트 자리에서 사용할 수 있습니다, SpringBoot 글로벌 프로파일 application.properties을 알고 모든 형상 항목의 통합 관리. 우리는, 우리가 일반적으로 사전에 기업 발전, 환경 환경에서 테스트 환경에서 개발하는 것을 알고, 프로젝트가 생산 환경에서, 각 테스트, 사전에 배포 할 필요가 있다는 것을 의미 최종 생산 환경 배포, 일부 구성 항목 (예 : 테스트 및 프로덕션 환경의 DB 구성 등)이 세 가지 환경은 종종 동일하지 않습니다, 그래서 우리가 일반적으로 각 환경에 대한 application.properties을 준비하는 데 필요한, 그들은 문제가 나올

멀티 환경에서 application.properties 파일을 관리하는 방법

방법 1 : application.properties에 의해 배포 프로젝트에서 여러 환경 유지하면 spring.profiles.active 지정 파일 application.properties을하는 등 우리가 application-pre.properties을 사용하여 미리 만들어진 프로필, 라인과 같은 환경 공학 응용, 당신이 배포 프로젝트에 진출 할 때 우리는, 구성 파일 application-prod.properties을 사용하여, 우리의 배포와 스크립트에 자바 -jar xxxxx.jar --spring.profiles.active = 미리 미리 지정된 프로젝트를 사용하여 시작할 수있는 방법 발행 application-pre.properties 프로필

이 방법은 위의 요구 사항을 충족 할 수 있지만, 더 어려운 문제가 있지만 :
현재의 환경을 향상 할 필요가 배포 스크립트에 따라 결정하는 등, 온라인 IP 여전히이

if [ "$flag" == "预发" ]; then
        java -jar xxxxx.jar --spring.profiles.active=pre
else 
        java -jar xxxxx.jar --spring.profiles.active=prod

전술 한 바와 같이, 스크립트의 배치에 따라하면 spring.profiles.active를 지정하기 위해, 플래그 사전 또는 라인을 판단 할 필요가,이 플래그는 각 시스템에 배포 환경의 유지 보수 비용이 올바르게 플래그를 설정할 수 있어야합니다 비용 값과 대형의 유지 보수

방법 두 가지가 : 그것이 우리가 현재 사용중인 프로젝트 방법입니다
제외 spring.profiles.active는 엔지니어링 환경을있는 application.properties 것과 결국 지정, 우리는 또한 사용할 수 있습니다

java -jar xxxxx.jar --spring.config.location=/opt/conf/application.properties

이 구성 파일은 지정된 파일 application.properties을 사용하는 방법의 위치를 ​​지정

유지 보수 (아래) 엔지니어링 여러 환경에서 파일을있는 application.properties만큼, 문제를 해결하기 위해이 방법을 방법을 사용하여

배포 나타나면 때 Gradle을 빌드 도입 후는, 배포 등의 고정 디렉토리 환경 대응 application.properties 통합 복사기, 각 머신 환경 앞에 것 /opt/conf시작 명령에 의해 시작시 다음에, 아래 지정 spring.config.location = / 옵션 / conf의는 / application.properties 패키지의 사용을 지정하는 방법이 될 수있다 이러한 환경에서 jar 파일을있는 application.properties

지금 조기 질문 : 어떻게 유지하는 멀티 환경에서 application.properties

그래프에서 우리는 우리가 더 많은 사전 온라인 환경을 가지고 있기 때문에, 이러한 환경으로 인해이의 결과로, 각각 application.properties로 지정된 것을 볼 수 있습니다입니다 I는 구성 파일에 application.properties를 추가해야하는 경우 다른 환경에서 application.properties 파일도했다 수동으로 이 구성을 추가,이 작업은 application.properties의 사전 플러스 구성에서 동료 일어난 플러스 온라인 잊지 만했다가 전에뿐만 아니라, 지루하고 오류가 발생하기 쉬운입니다 배포 문제로 인한 라인 실패

해결 방법

사실 구성 미리 라인이 동일한 구성의 대부분의 파일로 통합되는에 우리가 할 수 있도록하려면, 그래서 작은 부분 만이 동일하지 않습니다, 대부분 동일 (의이 application-common.properties 부르 자) 이 속성을 구성하려면 유지 보수, 그래서 당신은 단지 크게 유지 보수 비용을 절감이 하나 개의 파일에 통합 구성해야

우리는 어떻게 통일 라인을 전화, 온라인 사전, 예를 들어, 다음 다른 구성 문제의 다른 상황의 일부를 해결하고 우리는 주제 이름 MQ의 통일 된 사양을 가지고 있고, 우리의 통합 콜 주제 사전-XXX를 진행하기 위해 주제-자극-XXX.

서로 다른 환경에서 다른 문제에 대한이 구성에서, 우리는 미리 만들어진 호출 application-pre.properties, 온라인이라고 application-prod.properties, 각 환경의 고유 한 구성으로 별도의 파일을 구축하기 위해 온라인으로 발전 할 수 각각이 두 문서에 배치하는 것은 될 수 있습니다

application-common.properties, 2 개의 환경 프로필 : 자, 이제 우리는 세 개의 파일, 공개 프로필이, application-pre.properties을 application-prod.properties ,, 최종 각 환경을 다음 응용 프로그램을 생성하는 방법 .properties 파일은 파일

물론 공개 프로필은 다양한 환경 프로필과 함께

合并工作的思路很简单,我们以生成预发环境的 application.properties为例,如下

  1. 遍历 application-common.properties 文件中的每一行,然后取出每一行的 key,value(以等号分割),将其存储到 map中

  2. 遍历 application-pre.properties 的每一行,然后取出每一行的 key,value(以等号分割),取出的同时拿 key 到上一步的 map去查找, 如果存在则覆盖,如果不存在则在上一步的 map 中新增 key, value

  3. 遍历步骤 2 最终的 map将每个键值对以 key=value 的形式写入 pre 中的 applicaton.properties 文件

还有一个问题,这个合并工作写在哪里呢,答案是 gradle 的 task 里,我们的工程是基于 gradle 构建的,一般我们是通过 gradle build 来编译打包工程的,我们可以在 gradle build 打包之后再执行这个 task ,假设这个 task 名为 regeneratePropertyFile ,则可写成如下形式

build.finalize(regeneratePropertyFile)

最后我们来看看最终的合并生成各个环境 application.properties 的 task

task regeneratePropertyFile(type:Exec){
 ["pre", "prod"].each { env ->
                def envMap = [:]    
              // 取出公共文件的键值对
        def destFileName = "src/main/resources/META-INF/spring/properties/application-common.properties"
        def destFile = file(destFileName)
        String content = destFile.text
        def commonLines = destFile.readLines()
        for (line in commonLines) {
            Integer equalSignLoc = line.indexOf("=")
            if (equalSignLoc == -1) {
                continue
            }

            String key = line.substring(0, equalSignLoc)
            String value = line.substring(equalSignLoc + 1)
            envMap.put(key, value)
        }

        // 取出环境配置文件 application.properties 的键值对,写入envMap中
        File envFile = file("src/main/resources/META-INF/spring/properties/application-${env}.properties")
        def envLines = envFile.readLines()
        for (line in envLines) {
            Integer equalSignLoc = line.indexOf("=")
            if (equalSignLoc == -1) {
                continue
            }

            String key = line.substring(0, equalSignLoc)
            String value = line.substring(equalSignLoc + 1)
            envMap.put(key, value)
        }

        content = ""
        envMap.each { key, val ->
            content = "${content}\n"
        }
                // 写入最终环境的 application.properties 文件
        destFile = file("${rootProject.projectDir}/bb_conf/${env}/application.properties")
        destFile.text = content       
    }
}

搞定!妈妈再也不用担心我在多环境下维护多个 application.properties 的噩梦了

公众号:「码农蜕变之路」,欢迎关注哦

추천

출처www.cnblogs.com/xiekun/p/11441380.html