SpringCloud Git后端

2023-06-16 16:05 更新

?EnvironmentRepository?的默認實現(xiàn)使用Git后端,這對于管理升級和物理環(huán)境以及審核更改非常方便。要更改存儲庫的位置,可以在Config Server中設置?spring.cloud.config.server.git.uri?配置屬性(例如,在?application.yml?中)。如果您使用?file:?前綴進行設置,則它應在本地存儲庫中運行,以便無需服務器即可快速輕松地開始使用。但是,在那種情況下,服務器直接在本地存儲庫上運行而無需克隆它(如果它不是裸露的,這并不重要,因為Config Server從不對“遠程”存儲庫進行更改)。要擴展Config Server并使其高度可用,您需要使服務器的所有實例都指向同一存儲庫,因此僅共享文件系統(tǒng)可以工作。即使在那種情況下,最好對共享文件系統(tǒng)存儲庫使用?ssh:?協(xié)議,以便服務器可以克隆它并將本地工作副本用作緩存。

此存儲庫實現(xiàn)將HTTP資源的?{label}?參數(shù)映射到git標簽(提交ID,分支名稱或標記)。如果git分支或標記名稱包含斜杠(?/?),則應使用特殊字符串?(?_)?在HTTP URL中指定標簽(以避免與其他URL路徑產生歧義)。例如,如果標簽為?foo/bar?,則替換斜杠將產生以下標簽:?foo(_)bar?。特殊字符串?(_)?的包含內容也可以應用于?{application}?參數(shù)。如果您使用命令行客戶端(例如curl),請注意URL中的括號-您應使用單引號('')將其從外殼中移出。

跳過SSL證書驗證

可以通過將?git.skipSslValidation?屬性設置為?true?(默認值為?false?)來禁用配置服務器對Git服務器的SSL證書的驗證。

spring:
  cloud:
    config:
      server:
        git:
          uri: https://example.com/my/repo
          skipSslValidation: true

設置HTTP連接超時

您可以配置配置服務器將等待獲取HTTP連接的時間(以秒為單位)。使用?git.timeout?屬性。

spring:
  cloud:
    config:
      server:
        git:
          uri: https://example.com/my/repo
          timeout: 4

Git URI中的占位符

Spring Cloud Config服務器支持帶有?{application}?和?{profile}?(如果需要的話還有?{label}?)占位符的git存儲庫URL,但是請記住該標簽始終用作git標簽。因此,您可以使用類似于以下的結構來支持“ 每個應用程序一個存儲庫 ”策略:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/myorg/{application}

您也可以使用類似的模式(?{profile}?)來支持“ 每個配置文件一個存儲庫 ”策略。

此外,在?{application}?參數(shù)中使用特殊字符串“(_)”可以啟用對多個組織的支持,如以下示例所示:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/{application}

其中在請求時以以下格式提供?{application}?:?organization(_)application?。

模式匹配和多個Repositories

Spring Cloud Config還通過在應用程序和概要文件名稱上進行模式匹配來支持更復雜的需求。模式格式是以逗號分隔的?{application}/{profile}?名稱列表,帶有通配符(請注意,以通配符開頭的模式可能需要加引號),如以下示例所示:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            simple: https://github.com/simple/config-repo
            special:
              pattern: special*/dev*,*special*/dev*
              uri: https://github.com/special/config-repo
            local:
              pattern: local*
              uri: file:/home/configsvc/config-repo

如果?{application}/{profile}?與任何模式都不匹配,它將使用在?spring.cloud.config.server.git.uri?下定義的默認URI。在上面的示例中,對于“ 簡單 ”存儲庫,模式為?simple/*?(在所有配置文件中僅匹配一個名為?simple?的應用程序)。在“ 本地 ”庫匹配,在所有配置文件(該?/*?后綴會自動添加到沒有檔案資料匹配的任何模式)?local?開頭的所有應用程序名稱。

“ 單行 ”中所使用的短切“ 簡單 ”的例子可以只用于如果唯一的屬性被設置為URI。如果您需要設置其他任何內容(憑證,模式等),則需要使用完整表格。

回購中的?pattern?屬性實際上是一個數(shù)組,因此您可以使用YAML數(shù)組(或屬性文件中的?[0]?,?[1]?等后綴)綁定到多個模式。如果要運行具有多個配置文件的應用程序,則可能需要這樣做,如以下示例所示:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          repos:
            development:
              pattern:
                - '*/development'
                - '*/staging'
              uri: https://github.com/development/config-repo
            staging:
              pattern:
                - '*/qa'
                - '*/production'
              uri: https://github.com/staging/config-repo
Spring Cloud猜測一個包含不以*結尾的配置文件的模式表示您實際上要匹配以該模式開頭的配置文件列表(因此*/staging["*/staging", "*/staging,*"]的快捷方式,等等)。例如,這很普遍,例如,您需要在本地的“ 開發(fā) ”配置文件中運行應用程序,而又需要在遠程的“ 云 ”配置文件中運行應用程序。

每個存儲庫還可以選擇將配置文件存儲在子目錄中,用于搜索這些目錄的模式可以指定為?searchPaths?。以下示例在頂層顯示了一個配置文件:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          searchPaths: foo,bar*

在前面的示例中,服務器在頂層和?foo/?子目錄中以及名稱以?bar?開頭的任何子目錄中搜索配置文件。

默認情況下,首次請求配置時,服務器會克隆遠程存儲庫。可以將服務器配置為在啟動時克隆存儲庫,如以下頂級示例所示:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://git/common/config-repo.git
          repos:
            team-a:
                pattern: team-a-*
                cloneOnStart: true
                uri: https://git/team-a/config-repo.git
            team-b:
                pattern: team-b-*
                cloneOnStart: false
                uri: https://git/team-b/config-repo.git
            team-c:
                pattern: team-c-*
                uri: https://git/team-a/config-repo.git

在前面的示例中,服務器在接受任何請求之前會在啟動時克隆team-a的config-repo。在請求從存儲庫進行配置之前,不會克隆所有其他存儲庫。

設置要在Config Server啟動時克隆的存儲庫有助于在Config Server啟動時快速識別配置錯誤的配置源(例如無效的存儲庫URI)。在未為配置源啟用?cloneOnStart?的情況下,Config Server可能會以配置錯誤或無效的配置源成功啟動,并且直到應用程序從該配置源請求配置時才檢測到錯誤。

認證方式

要在遠程存儲庫上使用HTTP基本認證,請分別添加?username?和?password?屬性(不在URL中),如以下示例所示:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          username: trolley
          password: strongpassword

如果您不使用HTTPS和用戶憑據(jù),則在將密鑰存儲在默認目錄(?~/.ssh?)中且URI指向SSH位置(例如?git@github.com:configuration/cloud-configuration?)時,SSH也應立即可用。重要的是,?~/.ssh/known_hosts?文件中應包含Git服務器的條目,并且其格式應為?ssh-rsa?。不支持其他格式(例如?ecdsa-sha2-nistp256?)。為避免意外,您應確保Git服務器的?known_hosts?文件中僅存在一個條目,并且該條目與您提供給配置服務器的URL匹配。如果在URL中使用主機名,則要在?known_hosts?文件中完全使用該主機名(而不是IP)。使用JGit訪問存儲庫,因此您找到的任何文檔都應該適用。HTTPS代理設置可以在?~/.git/config?中設置,也可以(使用與其他JVM進程相同的方式)使用系統(tǒng)屬性(?-Dhttps.proxyHost?和?-Dhttps.proxyPort?)進行設置。

 如果您不知道?~/.git?目錄在哪里,請使用?git config --global?來操縱設置(例如,?git config --global http.sslVerify false?)。

使用AWS CodeCommit進行身份驗證

Spring Cloud Config服務器還支持AWS CodeCommit身份驗證。從命令行使用Git時,AWS CodeCommit使用身份驗證幫助程序。該幫助程序未與JGit庫一起使用,因此,如果Git URI與AWS CodeCommit模式匹配,則會為AWS CodeCommit創(chuàng)建一個JGit CredentialProvider。AWS CodeCommit URI遵循以下模式://git-codecommit.${AWS_REGION}.amazonaws.com/${repopath}。

如果您提供帶有AWS CodeCommit URI的用戶名和密碼,則它們必須是提供對存儲庫訪問權限的AWS accessKeyId和secretAccessKey。如果您未指定用戶名和密碼,則使用AWS Default Credential Provider鏈檢索accessKeyId和secretAccessKey 。

如果您的Git URI與CodeCommit URI模式(如前所示)匹配,則必須在用戶名和密碼或默認憑據(jù)提供商鏈支持的位置之一中提供有效的AWS憑據(jù)。AWS EC2實例可以將IAM角色用于EC2實例。

aws-java-sdk-core jar是可選的依賴項。如果aws-java-sdk-core jar不在您的類路徑中,則無論git服務器URI如何,都不會創(chuàng)建AWS Code Commit憑證提供程序。

使用屬性進行Git SSH配置

默認情況下,當使用SSH URI連接到Git存儲庫時,Spring Cloud Config服務器使用的JGit庫使用SSH配置文件,例如?~/.ssh/known_hosts?和?/etc/ssh/ssh_config?。在Cloud Foundry之類的云環(huán)境中,本地文件系統(tǒng)可能是臨時的,或者不容易訪問。在這種情況下,可以使用Java屬性設置SSH配置。為了激活基于屬性的SSH配置,必須將?spring.cloud.config.server.git.ignoreLocalSshSettings?屬性設置為?true?,如以下示例所示:

  spring:
    cloud:
      config:
        server:
          git:
            uri: git@gitserver.com:team/repo1.git
            ignoreLocalSshSettings: true
            hostKey: someHostKey
            hostKeyAlgorithm: ssh-rsa
            privateKey: |
                         -----BEGIN RSA PRIVATE KEY-----
                         MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
                         IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF
                         ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud
                         1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
                         oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
                         DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
                         fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
                         BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG
                         EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
                         5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
                         +AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe
                         pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG
                         ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
                         xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW
                         dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
                         PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
                         VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
                         FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R
                         gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
                         VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV
                         cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
                         KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N
                         CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs
                         q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J
                         69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
                         -----END RSA PRIVATE KEY-----

下表描述了SSH配置屬性。

表5.1  SSH配置Properties

Property名稱 備注

ignoreLocalSshSettings

如果為true,請使用基于屬性的SSH配置而不是基于文件的SSH配置。必須設置為spring.cloud.config.server.git.ignoreLocalSshSettings,而不是在存儲庫定義中。

私鑰

有效的SSH私鑰。如果ignoreLocalSshSettings為true并且Git URI為SSH格式,則必須設置。

hostKey

有效的SSH主機密鑰。如果還設置了hostKeyAlgorithm,則必須設置。

hostKeyAlgorithm

ssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521之一。如果還設置了hostKey,則必須設置。

strictHostKeyChecking

truefalse。如果為false,請忽略主機密鑰錯誤。

knownHostsFile

自定義.known_hosts文件的位置。

preferredAuthentications

覆蓋服務器身份驗證方法順序。如果服務器在publickey方法之前進行了鍵盤交互式身份驗證,則應該可以避免登錄提示。


Git搜索路徑中的占位符

Spring Cloud Config服務器還支持帶有?{application}?和?{profile}?(如果需要的話還有?{label}?)占位符的搜索路徑,如以下示例所示:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          searchPaths: '{application}'

上面的清單導致在存儲庫中搜索與目錄(以及頂層)同名的文件。通配符在帶有占位符的搜索路徑中也有效(搜索中包括任何匹配的目錄)。

強制拉動Git Repositories

如前所述,Spring Cloud Config服務器會復制遠程git存儲庫,以防本地副本變臟(例如,操作系統(tǒng)進程更改了文件夾內容),使得Spring Cloud Config服務器無法從遠程更新本地副本。資料庫。

要解決此問題,有一個?force-pull?屬性,如果本地副本臟了,則可以使Spring Cloud Config服務器從遠程存儲庫強制拉出,如以下示例所示:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          force-pull: true

如果您有多個存儲庫配置,則可以為每個存儲庫配置?force-pull?屬性,如以下示例所示:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://git/common/config-repo.git
          force-pull: true
          repos:
            team-a:
                pattern: team-a-*
                uri: https://git/team-a/config-repo.git
                force-pull: true
            team-b:
                pattern: team-b-*
                uri: https://git/team-b/config-repo.git
                force-pull: true
            team-c:
                pattern: team-c-*
                uri: https://git/team-a/config-repo.git

force-pull屬性的默認值為false

刪除Git Repositories中未跟蹤的分支

由于Spring Cloud Config服務器在檢出分支到本地存儲庫(例如,通過標簽獲取屬性)后具有遠程git存儲庫的克隆,因此它將永久保留該分支,直到下一個服務器重新啟動(這將創(chuàng)建新的本地存儲庫)。因此,可能會刪除遠程分支,但仍可獲取其本地副本。而且,如果Spring Cloud Config服務器客戶端服務以?--spring.cloud.config.label=deletedRemoteBranch,master?開頭,它將從?deletedRemoteBranch?本地分支獲取屬性,而不是從?master?獲取屬性。

為了使本地存儲庫分支保持整潔并保持遠程狀態(tài)-可以設置?deleteUntrackedBranches?屬性。這將使Spring Cloud Config服務器從本地存儲庫中強制刪除未跟蹤的分支。例:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/spring-cloud-samples/config-repo
          deleteUntrackedBranches: true

 deleteUntrackedBranches屬性的默認值為false

Git刷新率

您可以使用?spring.cloud.config.server.git.refreshRate?控制配置服務器多久從Git后端獲取更新的配置數(shù)據(jù)。以秒為單位指定此屬性的值。默認情況下,該值為0,這意味著配置服務器將在每次請求時從Git存儲庫中獲取更新的配置。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號