SpringCloud使用Consul作为分布式配置中心
</div>
<!--一个博主专栏付费入口-->
<!--一个博主专栏付费入口结束-->
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
<div id="content_views" class="markdown_views">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<h2 id="一简介"><strong>一、简介</strong></h2>
1、 Consul提供了用于存储配置和其他元数据的键/值存储。Spring Cloud Consul Config是Config Server和Client的替代方案。在特殊的“引导”阶段,配置被加载到Spring环境中。默认情况下,配置存储在/config文件夹中。根据应用程序的名称和模拟Spring Cloud Config顺序解析属性的活动配置文件,创建多个PropertySource实例。引用自官网:https://springcloud.cc/spring-cloud-consul.html
2、consul中的k/v操作
添加key/value,下面命令在终端中输入,在consul中存储一个data的key为redis/config/minconns,value为timeout=3000
consul kv put redis/config/minconns timeout=3000
根据key获取value
consul kv get redis/config/minconns
删除key
consul kv delete redis/config/minconns
‘redis/config/‘可以看作文件系统的路径,‘minconns‘相当于文件,‘timeout=3000‘可以看作是文件中的配置项。也可以通过web-ui去操作。
二、创建maven项目consulservice2
注意:不同版本的Spring boot和Spring cloud之间会存在差异,每个项目之间的pom.xml中的依赖也有所不同
1、引入依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--用于监控与管理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--config server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul</artifactId>
</dependency>
<!--服务发现依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--用于consul配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
</dependencies>
2、创建bootstrap.properties和application.properties两个配置文件
bootstrap.properties:在程序引导期间加载,应用于更加早期配置信息读取,可以配置application.properties相关属性,相当于系统级别的配置,优先加载。
#bootstrap.properties
spring.application.name=consul-service2
server.port=8080
application.properties:应用程序的配置,可以配置程序中各个模块需要的变量。
#application.properties
jdbc.username=root
jdbc.password=123456
3、创建应用程序启动类
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulService2App implements CommandLineRunner {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
public static void main(String[] args){
SpringApplication.run(ConsulService2App.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("username:" + username);
System.out.println("password:" + password);
}
}
4、运行程序
可以看到正确的读取了我们本地的配置,但是在一般情况下,Spring cloud都会远程加载配置文件,默认情况下,Spring Cloud都会自动使用远程配置覆盖本地配置。配置加载策略是,首先从远程加载,远程存在则覆盖本地,远程不存在,在从本地配置查找,如果本地也不存在,则抛出异常。
5、在bootstrap.properties中添加consul作为配置中心的的配置
5.1 、添加配置
spring.application.name=consul-service2
server.port=8080
# 指定consul配置的文件夹前缀为config
spring.cloud.consul.config.prefix=config
# 指定consul配置的配置文件为configuration
spring.cloud.consul.config.data-key=configuration
# 指定consul配置的配置文件格式properties(maven),gradle为(YAML)
spring.cloud.consul.config.format=properties
#指定consul配置的配置文件父路径
spring.cloud.consul.config.defaultContext=${spring.application.name}
5.2 、在consul server中存储我们的配置项
通过命令行添加配置: jdbc.username=yyh
通过consul的web-ui查看我们的配置,也可以通过consul的web-ui添加配置:
5.3 、再次此运行程序
我们会发现,username已经被远程配置替换
5.4 、使用本地配置覆盖远程配置
下面一段引用官网原文,地址是:https://springcloud.cc/spring-cloud-dalston.html#overriding-bootstrap-properties
通过引导上下文添加到应用程序的属性源通常是“远程”(例如从配置服务器),并且默认情况下,不能在本地覆盖,除了在命令行上。如果要允许您的应用程序使用自己的系统属性或配置文件覆盖远程属性,则远程属性源必须通过设置spring.cloud.config.allowOverride=true(在本地设置本身不起作用)授予权限。一旦设置了该标志,就会有一些更精细的设置来控制远程属性与系统属性和应用程序本地配置的位置:spring.cloud.config.overrideNone=true覆盖任何本地属性源.
注意:一般情况下在较新的版本中spring.cloud.config.allowOverride默认是true,spring.cloud.config.overrideNone为false
接下来添加远程配置:spring.cloud.config.overrideNone=true,在运行程序,会发现,本地属性覆盖了远程属性。此时,假如本地没有jdbc.username=root,Spring cloud就会使用远程的配置jdbc.username=yyh
**6、后续
关于Spring cloud config和Spring cloud consul的配置还有很多,中文官网:https://springcloud.cc/spring-cloud-dalston.html#overriding-bootstrap-properties
源码:https://github.com/NapWells/spring_cloud_learn/tree/master/discover_server_with_consul/springcloudlearn/consulservice2