【问题标题】:Spring Cloud Config Pattern Matching Not Working With SVNSpring Cloud Config 模式匹配不适用于 SVN
【发布时间】:2016-05-31 21:14:56
【问题描述】:

我在为我的 Spring Cloud Config Server 定义多个基于 svn 的配置存储库时遇到问题。我已经设置了三个配置存储库。一个用于开发、单元和生产。我已将默认设置为开发(通过设置 spring.cloud.config.server.svn.uri = development repo uri)。但是,每当我向配置服务器的 REST 端点发出 GET 请求时,无论我请求哪个配置文件,我总是会获得开发配置。请参阅下面的示例...

例如:

curl -i -X GET \
   -H "Content-Type:application/json" \
 'http://localhost:8888/my-service-accounts/unit' 

结果:

{
   "name":"my-service-accounts",
   "profiles":[
      "unit"
   ],
   "label":null,
   "version":"750",
   "propertySources":[
      {
         "name":"http://PATH_TO_MY_SVN_SERVER/config-repo-development/trunk/my-service-accounts.yml",
         "source":{
            "server.port":8080,
            "hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds":3000
         }
      }
   ]
}

但我期待...

{
   "name":"my-service-accounts",
   "profiles":[
      "unit"
   ],
   "label":null,
   "version":"750",
   "propertySources":[
      {
         "name":"http://PATH_TO_MY_SVN_SERVER/config-repo-unit/trunk/my-service-accounts.yml",
         "source":{
            "server.port":7777,
            "hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds":3000
         }
      }
   ]
} 
  • 注意 propertySources[0].name 值的不同。我希望这个配置来自单元存储库,但它仍然来自开发存储库。

我的配置服务器配置:

application.yml

server:
  port: 8888
spring:
  profiles:
    include: subversion
  cloud:
    config:
      server:
        svn:
          username: configserver
          password: ************
          uri: http://PATH_TO_MY_SVN_SERVER/config-repo-development
          repos:
            development:
              pattern:  ["*/development"]
              uri: http://PATH_TO_MY_SVN_SERVER/config-repo-development
            unit:
              pattern: ["*/unit"] 
              uri: http://PATH_TO_MY_SVN_SERVER/config-repo-unit
            production:
              pattern:
                - '*/production'
              uri: http://PATH_TO_MY_SVN_SERVER/config-repo-production

      discovery:
        enabled: true
  application:
    name: my-server-config
  • 注意:我的 IDE (IntelliJ) 警告我它无法解析 spring.cloud.config.server.svn.repos.*.uri 的配置属性......但这就是 Spring Cloud Config 文档显示的方式指定存储库路径。

build.gradle

buildscript {
  ext {
    springBootVersion = "1.3.3.RELEASE"
  }
  repositories {
    mavenCentral()
    maven {url "https://plugins.gradle.org/m2/"}
  }
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    classpath("io.spring.gradle:dependency-management-plugin:0.5.5.RELEASE")
    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.1.1"
  }
}

apply plugin: "base"
apply plugin: "maven"
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'io.spring.dependency-management'

jar {
    baseName = project.ext.projectName
    version = project.ext.projectVersion
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
  mavenLocal()
  mavenCentral()
  maven { url "https://repo.spring.io/snapshot" }
  maven { url "https://repo.spring.io/milestone" }
}

dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:Brixton.RC1" 
  }
}

dependencies {
  compile("org.springframework.cloud:spring-cloud-starter-config")
  compile("org.springframework.cloud:spring-cloud-config-server")
  compile("org.springframework.cloud:spring-cloud-starter-eureka")
  compile("org.tmatesoft.svnkit:svnkit")

  testCompile("org.springframework.boot:spring-boot-starter-test")
}

eclipse {
  classpath {
    containers.remove("org.eclipse.jdt.launching.JRE_CONTAINER")
    containers "org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"
  }
}

task wrapper(type: Wrapper) {
  gradleVersion = "2.12"
}

【问题讨论】:

    标签: java spring svn spring-cloud-config


    【解决方案1】:

    我最终重新组织了我的 svn 配置存储库的目录布局并使用更灵活的“searchPaths”属性来实现我想要的功能。

    新的 SVN 回购布局:

    • /svn/config/trunk/dev/service-name.yml
    • /svn/config/trunk/prod/service-name.yml
    • /svn/config/trunk/unit/service-name.yml

    基本上,使用这种方法,您可以定义配置存储库 URI,然后定义一个 searchPaths 属性,该属性对传入路径进行模式匹配以确定要搜索配置的目录。

    新应用程序.yml

    server:
      port: 8888
    spring:
      profiles:
        include: subversion
      cloud:
        config:
          server:
            svn:
              username: configserver
              password: ************
              uri: http://PATH_TO_MY_SVN_SERVER/svn/config
              searchPaths: ["{profile}"]
          discovery:
            enabled: true
      application:
        name: my-server-config
    

    通过 HTTP Endpoint 访问配置服务器:

    curl -i -X GET \
       -H "Content-Type:application/json" \
     'http://localhost:8888/my-service-name/unit'
    

    默认情况下配置服务器似乎匹配

    svn_server/{application-name}/{pattern_defined_in_searchPaths}
    

    在我的情况下是:

    svn_server/{application-name}/{profile}
    

    【讨论】:

      【解决方案2】:

      只是为了清楚起见。我检查了代码,可以看到它们不支持多个 SVN 存储库实现。它仅适用于 GIT。

      AbstractScmEnvironmentRepository 中,他们有两个实现JGitEnvironmentRepositorySvnKitEnvironmentRepository。现在,如果你检查谁扩展了这个 JGitEnvironmentRepository,你会看到它有 2 个实现 MultipleJGitEnvironmentRepository 和 PatternMatchingJGitEnvironmentRepository。但是 SVN 存储库没有 Multi** 实现。

      【讨论】:

        猜你喜欢
        • 2016-02-27
        • 2023-02-15
        • 2021-05-23
        • 2016-02-18
        • 2019-01-11
        • 2019-10-02
        • 1970-01-01
        • 2023-02-12
        • 2019-03-20
        相关资源
        最近更新 更多