gpt4 book ai didi

Spring Boot 配置服务器

转载 作者:行者123 更新时间:2023-12-04 06:36:53 31 4
gpt4 key购买 nike

我一直在尝试掌握位于此处的 Spring Boot 配置服务器:https://github.com/spring-cloud/spring-cloud-config在更彻底地阅读了文档之后,我能够解决我的大部分问题。但是,我确实必须为基于文件的 PropertySourceLocator 编写一个附加类

/*
* Copyright 2013-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");


* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.springframework.cloud.config.client;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.util.StringUtils;

/**
* @author Al Dispennette
*
*/
@ConfigurationProperties("spring.cloud.config")
public class ConfigServiceFilePropertySourceLocator implements PropertySourceLocator {
private Logger logger = LoggerFactory.getLogger(ConfigServiceFilePropertySourceLocator.class);

private String env = "default";

@Value("${spring.application.name:'application'}")
private String name;

private String label = name;

private String basedir = System.getProperty("user.home");

@Override
public PropertySource<?> locate() {
try {
return getPropertySource();
} catch (IOException e) {
logger.error("An error ocurred while loading the properties.",e);
}

return null;
}

/**
* @throws IOException
*/
private PropertySource getPropertySource() throws IOException {
Properties source = new Properties();
Path path = Paths.get(getUri());
if(Files.isDirectory(path)){
Iterator<Path> itr = Files.newDirectoryStream(path).iterator();
String fileName = null!=label||StringUtils.hasText(label)?label:name+".properties";
logger.info("Searching for {}",fileName);
while(itr.hasNext()){
Path tmpPath = itr.next();
if(tmpPath.getFileName().getName(0).toString().equals(fileName)){
logger.info("Found file: {}",fileName);
source.load(Files.newInputStream(tmpPath));
}
}
}
return new PropertiesPropertySource("configService",source);
}

public String getUri() {
StringBuilder bldr = new StringBuilder(basedir)
.append(File.separator)
.append(env)
.append(File.separator)
.append(name);

logger.info("loading properties directory: {}",bldr.toString());
return bldr.toString();
}


public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEnv() {
return env;
}

public void setEnv(String env) {
this.env = env;
}

public String getLabel() {
return label;
}

public void setLabel(String label) {
this.label = label;
}

public String getBasedir() {
return basedir;
}

public void setBasedir(String basedir) {
this.basedir = basedir;
}

}

然后我将它添加到 ConfigServiceBootstrapConfiguration.java
@Bean
public PropertySourceLocator configServiceFilePropertySource(
ConfigurableEnvironment environment) {
ConfigServiceFilePropertySourceLocator locator = new ConfigServiceFilePropertySourceLocator();
String[] profiles = environment.getActiveProfiles();
if (profiles.length==0) {
profiles = environment.getDefaultProfiles();
}
locator.setEnv(StringUtils.arrayToCommaDelimitedString(profiles));
return locator;
}

最后,这做了我想要的。
现在我很想知道这是否是我应该做的,或者我是否仍然缺少某些东西并且这已经被处理并且我只是错过了它。

*****编辑戴夫要求的信息******

如果我取出文件属性源加载器并更新 bootstrap.yml
uri: file://${user.home}/resources

示例应用程序在启动时引发以下错误:
ConfigServiceBootstrapConfiguration : Could not locate PropertySource: Object of class [sun.net.www.protocol.file.FileURLConnection] must be an instance of class java.net.HttpURLConnection

这就是为什么我认为需要额外的类(class)。就测试用例而言,我相信您正在谈论 SpringApplicationEnvironmentRepositoryTests.java 并且我同意创建环境是可行的,但总的来说,当 uri 协议(protocol)为"file"时,应用程序似乎没有按预期运行。

******其他编辑********

这就是我理解这是如何工作的:
示例项目依赖于 spring-cloud-config-client 工件,因此对 spring-cloud-config-server 工件具有传递依赖。
客户端工件中的 ConfigServiceBootstrapConfiguration.java 创建一个 ConfigServicePropertySourceLocator 类型的属性源定位器 bean。
配置客户端工件中的 ConfigServicePropertySourceLocator.java 有注解 @ConfigurationProperties("spring.cloud.config")
并且属性 uri 存在于所述类中,因此在 bootstrap.yml 文件中设置了 spring.cloud.config.uri。

我相信 quickstart.adoc 中的以下声明强化了这一点:

When it runs it will pick up the external configuration from the default local config server on port 8888 if it is running. To modify the startup behaviour you can change the location of the config server using bootstrap.properties (like application.properties but for the bootstrap phase of an application context), e.g.

---- spring.cloud.config.uri: http://myconfigserver.com



在这一点上,JGitEnvironmentRepository bean 是如何被使用并寻找到 github 的连接的。
我假设由于 uri 是在 ConfigServicePropertySourceLocator 中设置的属性,因此任何有效的 uri 协议(protocol)都可以用于指向某个位置。
这就是为什么我使用 'file://' 协议(protocol)认为服务器会获取 NativeEnvironmentRepository。

所以在这一点上,我确定我要么缺少某些步骤,要么需要添加文件系统属性源定位器。

我希望这更清楚一点。

全栈:
java.lang.IllegalArgumentException: Object of class [sun.net.www.protocol.file.FileURLConnection] must be an instance of class java.net.HttpURLConnection
at org.springframework.util.Assert.isInstanceOf(Assert.java:339)
at org.springframework.util.Assert.isInstanceOf(Assert.java:319)
at org.springframework.http.client.SimpleClientHttpRequestFactory.openConnection(SimpleClientHttpRequestFactory.java:182)
at org.springframework.http.client.SimpleClientHttpRequestFactory.createRequest(SimpleClientHttpRequestFactory.java:140)
at org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:76)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:541)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:506)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:448)
at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.locate(ConfigServicePropertySourceLocator.java:68)
at org.springframework.cloud.bootstrap.config.ConfigServiceBootstrapConfiguration.initialize(ConfigServiceBootstrapConfiguration.java:70)
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:572)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
at sample.Application.main(Application.java:20)

最佳答案

我昨天读了这个帖子,它错过了一个重要的信息

如果不想用git作为repository,那么需要配置spring cloud server有spring.profiles.active=native

查看 spring-config-server 代码以了解它
org.springframework.cloud.config.server.NativeEnvironmentRepository

 spring:
application:
name: configserver
jmx:
default_domain: cloud.config.server
profiles:
active: native
cloud:
config:
server:
file :
url : <path to config files>

关于Spring Boot 配置服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549471/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com