首页 文章

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

提问于
浏览
1

我们现在使用的是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 config不能存储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 回答

  • 2

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

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

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

    为了从config-server获取自定义文件,我们在@PostConstruct中按名称使用了discoveryClient,config-server请求的URL并手动下载 . 但对于logger来说,为时已晚,因为logback需要在bootstrap阶段进行配置 . 在研究了类似的问题之后,我发现可以在Bootstrap阶段定制/设置属性:Customizing bootstrap property sources . 所以我们通过设置config-server-uri的自定义属性来解决这个问题,并且logback能够下载其配置文件 . my answer in stackOverflow中的更多实现细节 .

相关问题