可以弹出云配置管理xml文件

时间:2018-06-07 07:48:26

标签: xml spring-boot logback spring-cloud spring-cloud-config

我们现在使用的是spring boot版本是1.5.13.RELEASE,而spring cloud版本是Edgware.SR3,而spring cloud配置版本是1.4.3.RELEASE。

我们使用eureka 1.7.2作为我们的注册中心,config-server和config-client是eureka-client。

当我们认为,因为spring cloud配置是配置服务器,它应该管理我们的应用程序的任何类型的配置。所以我们把logback.xml放到github并引用spring cloud doc,我们可以通过设置

来获取config-client中的logback.xml
 logging.config=${spring.cloud.config.uri}/*/default/master/logback.xml.

但是,由于config-server和config-client是eureka-server的客户端,因此它应该使用服务名称进行通信。我们在config-client的bootstrap.properties中设置config int,如:

spring.cloud.config.name=logback
spring.cloud.config.profile=default
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=config-server-name
eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:7001/eureka/

但是,当我们启动config-client时,config-server会出现以下错误:

java.lang.IllegalStateException: Failed to load property source from location 'file:/D:/others/test/configBack/qing-cloud-m1-config/logback-spring.xml'

Caused by: java.util.InvalidPropertiesFormatException: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 16; 文档根元素 "configuration" 必须匹配 DOCTYPE 根 "null"。
    at sun.util.xml.PlatformXmlPropertiesProvider.load(PlatformXmlPropertiesProvider.java:80)
    at java.util.Properties$XmlSupport.load(Properties.java:1201)
    at java.util.Properties.loadFromXML(Properties.java:881)
    at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:136)
    at org.springframework.core.io.support.PropertiesLoaderUtils.loadProperties(PropertiesLoaderUtils.java:121)
    at org.springframework.boot.env.PropertiesPropertySourceLoader.load(PropertiesPropertySourceLoader.java:44)
    at org.springframework.boot.env.PropertySourcesLoader.load(PropertySourcesLoader.java:128)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.doLoadIntoGroup(ConfigFileApplicationListener.java:490)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadIntoGroup(ConfigFileApplicationListener.java:473)
    ... 87 common frames omitted

那么我怎样才能解决这个问题,而spring cloud配置无法存储xml或其他类型的文件? 如果是这样,它可能有很多限制

我阅读了源代码并发现它可能可以加载xml文件,但为什么会出现这些问题 public static void fillProperties(Properties props, Resource resource) throws IOException { InputStream is = resource.getInputStream(); try { String filename = resource.getFilename(); if (filename != null && filename.endsWith(XML_FILE_EXTENSION)) { props.loadFromXML(is); } else { props.load(is); } } finally { is.close(); } }

logback.xml位于下方,它将在独立的spring boot项目中执行 ```          

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${ENCODER_PATTERN}</pattern>
    </encoder>
</appender>
<appender name="FILE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>../../log/${LOG-NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
    </rollingPolicy>
    <encoder>
        <pattern>${ENCODER_PATTERN}</pattern>
    </encoder>
</appender>
<logger name="cn.jz" additivity="false" level="DEBUG">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE-APPENDER"/>
</logger>

<root level="DEBUG">
    <appender-ref ref="CONSOLE" />
</root>

```

1 个答案:

答案 0 :(得分:2)

您可以在git中存储任何文本文件,该文件用作spring-cloud-config服务器的配置存储,但是Spring只能自动解析.properties.yml。要获取其他文件格式,您应该使用“提供纯文本”功能,该功能是您在问题中所引用的。

但是,当您开始使用发现服务时,不能使用属性spring.cloud.config.uri,因为url是由eureka客户端自动发现的。因此logging.config的下一个属性无效:

logging.config=${spring.cloud.config.uri}/*/default/master/logback.xml

为了从配置服务器中获取自定义文件,我们使用了DiscoveryClient,在@PostConstruct中按名称请求了配置服务器的URL并手动下载了。但是对于记录器来说将为时已晚,因为回滚需要在引导阶段进行配置。在研究了类似的问题之后,我发现可以在Bootstrap阶段Customizing bootstrap property sources中自定义/设置属性。因此,我们通过设置config-server-uri的自定义属性来解决此问题,并且logback能够下载其配置文件。在my answer in stackOverflow中有更多实施细节。