Spring Cloud Config 模式匹配不适用于 SVN
Spring Cloud Config Pattern Matching Not Working With SVN
我在为我的 Spring 云配置服务器定义多个基于 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
}
}
]
}
- 注意 属性Sources[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"
}
我最终重新组织了我的 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 属性,它在传入路径上进行模式匹配以确定要在哪个目录中搜索配置。
新建application.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 端点访问配置服务器:
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}
只是为了清楚起见。我检查了代码,发现它们不支持多个 SVN 存储库实现。仅供 GIT.
在AbstractScmEnvironmentRepository they have 2 implementzation JGitEnvironmentRepository and SvnKitEnvironmentRepository。现在,如果你检查谁扩展了这个 JGitEnvironmentRepository,你会看到它有 2 个实现 MultipleJGitEnvironmentRepository 和 PatternMatchingJGitEnvironmentRepository。但是没有针对 SVN 存储库的 Multi** 实现。
我在为我的 Spring 云配置服务器定义多个基于 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
}
}
]
}
- 注意 属性Sources[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"
}
我最终重新组织了我的 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 属性,它在传入路径上进行模式匹配以确定要在哪个目录中搜索配置。
新建application.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 端点访问配置服务器:
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}
只是为了清楚起见。我检查了代码,发现它们不支持多个 SVN 存储库实现。仅供 GIT.
在AbstractScmEnvironmentRepository they have 2 implementzation JGitEnvironmentRepository and SvnKitEnvironmentRepository。现在,如果你检查谁扩展了这个 JGitEnvironmentRepository,你会看到它有 2 个实现 MultipleJGitEnvironmentRepository 和 PatternMatchingJGitEnvironmentRepository。但是没有针对 SVN 存储库的 Multi** 实现。