我一直在尝试掌握位于此处的spring boot config服务器: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;
}
最后这做了我想要的。现在我很想知道这是我应该做的,还是我仍然错过了什么,这已经被处理了,我只是错过了。
*****编辑Dave要求的信息******
如果我取出文件属性源加载程序并更新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
这就是为什么我认为需要额外的课程。就测试用例而言,我相信您谈论的是SpringApplicationEnvironmentCentrepositoryTests。java和我都同意创建环境是可行的,但当uri协议为“file”时,整个应用程序似乎并没有按预期运行。
******附加编辑*******
这就是我对其工作原理的理解:示例项目依赖于spring cloud config客户端工件,因此对spring cloud config server工件具有可传递的依赖性。ConfigServiceBootstrapConfiguration。客户端构件中的java创建了ConfigServicePropertySourceLocator类型的属性源定位器bean。ConfigServicePropertySourceLocator。配置客户端工件中的java具有注释@ConfigurationProperties(“spring.cloud.config”),并且属性uri存在于所述类中,因此设置了spring。云配置。引导程序中的uri。yml文件。
我相信这是通过快速启动中的以下语句重新实现的。adoc:
当它运行时,如果它正在运行,它将从端口8888上的默认本地配置服务器获取外部配置。要修改启动行为,可以使用引导更改配置服务器的位置。属性(如应用程序。属性,但用于应用程序上下文的引导阶段),例如。
此时,了解JgitenEnvironmentRepository bean是如何使用的,并寻找到github的连接。我假设,由于uri是在ConfigServicePropertySourceLocator中设置的属性,因此任何有效的uri协议都可以用于指向位置。这就是为什么我使用“file://”协议,认为服务器将获取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)
我想我有最后的解决方案的基础上你最后的意见在configserver.yml我补充
spring.profiles.active: file
spring.cloud.config.server.uri: file://${user.home}/resources
在我添加的ConfigServerConfiguration.java
@Configuration
@Profile("file")
protected static class SpringApplicationConfiguration {
@Value("${spring.cloud.config.server.uri}")
String locations;
@Bean
public SpringApplicationEnvironmentRepository repository() {
SpringApplicationEnvironmentRepository repo = new SpringApplicationEnvironmentRepository();
repo.setSearchLocations(locations);
return repo;
}
}
我可以查看以下属性:
curl localhost:8888/bar/default
curl localhost:8888/foo/development
我刚遇到同样的问题。我希望配置服务器从本地文件系统而不是git存储库加载属性。以下配置适用于windows上的我。
spring:
profiles:
active: native
cloud:
config:
server:
native:
searchLocations: file:C:/springbootapp/properties/
假设属性文件在C:/springbootapp/Properties/下
有关更多信息,请参阅Spring云文档并进行全面配置
我昨天读了这篇文章,它遗漏了一条重要信息
如果不想使用git作为存储库,那么需要将spring云服务器配置为具有spring。配置文件。活动=本机
签出spring配置服务器代码以了解it组织。springframework。云配置。服务器NativeEnvironment存储库
spring:
application:
name: configserver
jmx:
default_domain: cloud.config.server
profiles:
active: native
cloud:
config:
server:
file :
url : <path to config files>
我试图实现一个Spring boot云配置服务器。 我的application.properties文件: 主类: 问题是,当我试图从浏览器url(如http://localhost:8888/client-config/test)点击client config属性时,我被重定向到登录页面。 SpringBootVersion='2.1.6.Release' springcloudversion=
我们来看看如何配置服务器端的 SSH 访问。 本例中,我们将使用 authorized_keys 方法来对用户进行认证。 同时我们假设你使用的操作系统是标准的 Linux 发行版,比如 Ubuntu。 首先,创建一个操作系统用户 git,并为其建立一个 .ssh 目录。 $ sudo adduser git $ su git $ cd $ mkdir .ssh && chmod 700 .ssh
服务器配置 当你需要一台服务器的时候,首先需要向你的leader 提出申请,你的 leader 会利用公司的阿里云账户购买服务器实例,并且会把服务器的公网IP以及账号密码发送给你。 以下章节就叙述了当拿到一台全新的阿里云服务器实例时,我们需要怎样的工具以及我们需要经历哪些步骤对服务器进行配置。
介绍常用的服务配置。 云联壹云 平台支持基于climc命令修改常用服务配置。 说明 请确保First Node节点已正确初始化climc工具,配置步骤请参考CLIMC工具 通用配置命令如下 目前支持配置的服务有keystone、glance、region2、yunionapi、common等。 命令模式 在命令行下输入climc并带额定的参数获取相应的结果。 # 查看服务的配置信息 $ climc
我得到的错误消息:文件“c://users/peter/pycharmprojects/test/helloworld.py”,第8行,在Results中记录:文件“c:\python34\lib\site-packages\pymongo\cursor.py”,第1097行,在next if len(self.__data)或self._refresh():File“c:\python34\li
以前我们在windows上共享文件的话,只需右击要共享的文件夹然后选择共享相关的选项设置即可。然而如何实现windows和linux的文件共享呢?这就涉及到了samba服务了,这个软件配置起来也不难,使用也非常简单。 【samba配置文件smb.conf】 一般你装系统的时候会默认安装samba,如果没有安装,只需要运行这个命令安装(CentOS): “yum install -y samba s
配置HTTPS主机,必须在server配置块中打开SSL协议,还需要指定服务器端证书和密钥文件的位置: server { listen 443; server_name www.example.com; ssl on; ssl_certificate www.example.com.
【什么是squid】 Squid是比较知名的代理软件,它不仅可以跑在linux上还可以跑在windows以及Unix上,它的技术已经非常成熟。目前使用Squid的用户也是十分广泛的。Squid与Linux下其它的代理软件如Apache、Socks、TIS FWTK和delegate相比,下载安装简单,配置简单灵活,支持缓存和多种协议。 Squid的缓存功能相当好用,不仅可以减少带宽的占用,同样也大