Spring Boot实战系列(7)集成Consul配置中心
<div><div class="cl-preview-section"><blockquote>
本篇主要介绍了 Spring Boot 如何与 Consul 进行集成,Consul 只是服务注册的一种实现,还有其它的例如 Zookeeper、Etcd 等,服务注册发现在微服务架构中扮演这一个重要的角色,伴随着服务的大量出现,服务与服务之间的配置管理、运维管理也变的难以维护,通过 Consul 可以解决这些问题,实现服务治理、服务监控。
关于 Consul 的更多知识点不在这里赘述,但是在学习本节之前还是希望您能先了解下,请移步我之前写的 微服务服务注册发现之 Consul 系列
快速导航
添加maven依赖
在 Spring Boot 项目的 pom.xml 文件中引入 spring-cloud-starter-consul-discovery 启动器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
使用 Consul 配置信息时需要引入 spring-cloud-starter-consul-config 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
预览
配置文件
系统级配置文件 bootstrap.yml
使用 Spring Cloud Consul Config,需要配置以下信息在 bootstrap.yml 文件
spring.cloud.consul.host:配置consul地址spring.cloud.consul.port:配置consul端口spring.cloud.consul.config.prefix:配置基本文件,默认值configspring.cloud.consul.config.enabled:启动consul配置中心spring.cloud.consul.config.format:consul上面文件的格式 YAML、FILES、PROPERTIES、默认 KEY-VALUEspring.cloud.consul.config.data-key:表示 consul 上面的 KEY 值(或者说文件的名字),默认是 data
bootstrap.yml
spring:
cloud:
consul:
host: 192.168.6.128
port: 8500
config:
prefix: config
enabled: true
format: YAML
data-key: user
预览
应用级配置文件 application.yml
定义应用级别的配置在 bootstrap.yml 之后加载,例如搭配 spring-cloud-config 使用。
spring.cloud.consul.host:配置consul地址spring.cloud.consul.port:配置consul端口spring.cloud.consul.discovery.enabled:启用服务发现spring.cloud.consul.discovery.register:启用服务注册spring.cloud.consul.discovery.deregister:服务停止时取消注册spring.cloud.consul.discovery.prefer-ip-address:表示注册时使用IP而不是hostnamespring.cloud.consul.discovery.health-check-interval:健康检查频率spring.cloud.consul.discovery.health-check-path:健康检查路径spring.cloud.consul.discovery.health-check-critical-timeout:健康检查失败多长时间后,取消注册spring.cloud.consul.discovery.instance-id:服务注册标识
server:
port: 8082
spring:
application:
name: consul-service
profiles:
active: dev
cloud:
consul:
host: 192.168.6.128
port: 8500
discovery: # 服务发现配置
enabled: true
register: true
deregister: true
prefer-ip-address: true
health-check-interval: 10s
health-check-critical-timeout: 30s
health-check-path: /health
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} # 应用名称+服务器IP+端口
预览
配置Consul管理控制台
Consul 提供了 Key/Value 存储用于存储配置数据,在 Spring Cloud Consul 中配置默认存储于 /config 文件夹下,根据应用程序名和模拟 Spring Cloud Config 顺序解析属性的规则来配置文件。
在本例中操作 Consul 管控台建立以下路径配置:
config:为配置基本文件,这里默认为config。consul-service:为application.yml中配置的spring.application.name值。dev:为application.yml中配置的spring.profiles.active值,也是本程序设置环境变量意为开发环境。user.yml:为配置的文件名,格式为yml格式。
config/consul-service.dev/user.yml
预览
最终为 Consul 管控台建立的配置数据如下图所示:

项目构建
注意:以下只贴核心代码,源码参见:Github chapter7-1
建立Config获取Consul配置数据
- 获取student配置数据
注意以下属性名要与在 Consul 管控台中配置的一一对应。
@ConfigurationProperties 进行属性注入
config/StudentConfig.java
@ConfigurationProperties(prefix = "student")
public class StudentConfig {
private String name;
private int age;
<span class="token keyword">public</span> String <span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> name<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setName</span><span class="token punctuation">(</span>String name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> age<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setAge</span><span class="token punctuation">(</span><span class="token keyword">int</span> age<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>age <span class="token operator">=</span> age<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> String <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string">"大家好我是"</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">",今年"</span> <span class="token operator">+</span> age <span class="token operator">+</span> <span class="token string">"岁,我是一名在校大学生!"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
预览
- 获取teach配置数据
同以上 student 配置,我们可以将不同类型的配置分文件进行配置定义
@ConfigurationProperties(prefix = "teach")
public class TeachConfig {
private String name;
private String course;
<span class="token keyword">public</span> String <span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> name<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setName</span><span class="token punctuation">(</span>String name<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> String <span class="token function">getCourse</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> course<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setCourse</span><span class="token punctuation">(</span>String course<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>course <span class="token operator">=</span> course<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> String <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string">"大家好我是"</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">",是一名大学老师!教同学们学习"</span> <span class="token operator">+</span> course<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
预览
编写启动类调用配置
注解说明:
EnableDiscoveryClient:让注册中心进行服务发现,将服务注册到服务组件上。RestController:是@ResponseBody和@Controller注解的组合,注明该注解后整个类所有的方法返回值为json格式。SpringBootApplication:SpringBoot 的启动注解。EnableConfigurationProperties:属性配置的 class 添加到 SpringBoot 的属性配置注解里,否则不能通过@Autowired注解注入我们定义的属性配置类。
接口说明:
/health:健康检查接口/user/description:@Value 注解获取用户信息描述接口/user/student/intro:@ConfigurationProperties 获取学生简介信息接口/user/teach/intro:@ConfigurationProperties 获取教师简介信息接口
@EnableDiscoveryClient
@RestController
@SpringBootApplication
@EnableConfigurationProperties({ StudentConfig.class, TeachConfig.class })
public class ConsulApplication {
<span class="token annotation punctuation">@Value</span><span class="token punctuation">(</span><span class="token string">"${description}"</span><span class="token punctuation">)</span>
<span class="token keyword">private</span> String description<span class="token punctuation">;</span>
<span class="token annotation punctuation">@Autowired</span>
<span class="token keyword">private</span> StudentConfig studentConfig<span class="token punctuation">;</span>
<span class="token annotation punctuation">@Autowired</span>
<span class="token keyword">private</span> TeachConfig teachConfig<span class="token punctuation">;</span>
<span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span><span class="token string">"/health"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> String <span class="token function">Health</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"health"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token string">"OK"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span><span class="token string">"/user/description"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> String <span class="token function">Description</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> description<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span><span class="token string">"/user/student/intro"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> String <span class="token function">StudentIntro</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> studentConfig<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span><span class="token string">"/user/teach/intro"</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> String <span class="token function">TeachIntro</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> teachConfig<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
SpringApplication<span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span>ConsulApplication<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
预览
接口测试
- 健康检查接口
该接口在服务启动后且向 Consul 配置中心注册后,根据 application.yml 文件配置的 health-check-interval 和 health-check-path属性进行自动调用。
$ curl http://127.0.0.1:8082/health
OK!
注册成功后展示我们服务的名称及健康检查结果如下:


- 获取教师简介配置接口
$ curl http://127.0.0.1:8082/user/teach/intro
大家好我是Teach Li,是一名大学老师!教同学们学习Java软件开发!
预览
- 获取学生简介配置接口
$ curl http://127.0.0.1:8082/user/student/intro
大家好我是Jack,今年18岁,我是一名在校大学生!
预览
- 采用 @Value 注解获取项目描述接口
$ curl http://127.0.0.1:8082/user/description
用户信息描述
预览
总结
这里我们只介绍了 Consul 在 Spring Boot 的配置功能,关于 Consul 做为注册中心在下一章节中介绍,本篇中需要注意通过 @Value 注入的属性,修改 Consul 后需要重启服务才能生效,通过 @ConfigurationProperties 注入的属性,在 Consul 管控台修改属性之后可立即生效。
如遇到其他什么可在SpringBoot-Course issues中提问
资料
- 个人博客: Node.js技术栈
- Spring Boot 实战系列:https://github.com/Q-Angelo/SpringBoot-Course
- 项目源码: Github查看本文完整示例 chapter7-1
Spring Boot实战系列(7)集成Consul配置中心的更多相关文章
- Spring Boot实战系列-----------邮件发送
快速导航 添加Maven依赖 配置文件增加邮箱相关配置 Service.Test项目代码构建 五种邮件发送类型讲解 文本邮件 html邮件 附件邮件 html内嵌图片邮件 模板邮件 问题汇总 添加ma ...
- spring boot实战(第十三篇)自动配置原理分析
前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...
- Python微服务实践-集成Consul配置中心
A litmus test for whether an app has all config correctly factored out of the code is whether the co ...
- Spring Boot实战三:集成RabbitMQ,实现消息确认
Spring Boot集成RabbitMQ相比于Spring集成RabbitMQ简单很多,有兴趣了解Spring集成RabbitMQ的同学可以看我之前的<RabbitMQ学习笔记>系列的博 ...
- Spring Boot实战二:集成Mybatis
Spring Boot集成Mybatis非常简单,在之前搭建好的项目中加入Mybatis依赖的jar,在配置文件中加入数据库配置即可,如下图所示: 创建对应的Controller.Service.Da ...
- 携程Apollo(阿波罗)配置中心Spring Boot迁移日志组件,使用配置中心进行管理的思路
说明: 1.Spring Boot项目默认使用logback进行日志管理 2.logback在启动时默认会自动检查是否有logback.xml文件,如果有时会有限加载这个文件. 3.那么如果是用配置中 ...
- Spring Boot进阶系列一
笔者最近在总结一个 Spring Boot实战系列,以方便将来查找和公司内部培训用途. 1.Springboot从哪里来 SpringBoot是由Pivotal团队在2013年开始研发.2014年4月 ...
- Spring Cloud 系列之 Consul 配置中心
前面我们已经学习过 Spring Cloud Config 了: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) Spr ...
- Spring Boot干货系列:(七)默认日志框架配置
Spring Boot干货系列:(七)默认日志框架配置 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候, ...
随机推荐
- 搞大数据,你不懂这三大数据处理趋势就OUT了
搞大数据,你不懂这三大数据处理趋势就OUT了 企业数据每年以PB级甚至上百PB爆炸式增长,越来越大的数据量正为扩大分析策略在企业应用软件领域的拓展提供了数据基础,但数据的价值是有时效性的,越早分析越能 ...
- MongoDB后台运行
文章目录 命令方式(推荐) 命令行和配置文件方式 命令行: 配置文件: 命令方式(推荐) 如果想在后台运行,启动时只需添加 --fork函数即可. fork: 以守护进程的方式运行MongoDB. 指 ...
- selector是在文件夹drawable中进行定义的xml文件转载 https://www.cnblogs.com/fx2008/p/3157040.html
获取Drawable对象: Resources res = mContext.getResources(); Drawable myImage = res.getDrawable(R.drawable ...
- element表单验证
rules: { name:[{ required: true, message: '请输入用户名', trigger: 'blur' },{ min: 2, max: 5, message: '长度 ...
- BCD Code ZOJ - 3494 AC自动机+数位DP
题意: 问A到B之间的所有整数,转换成BCD Code后, 有多少个不包含属于给定病毒串集合的子串,A,B <=10^200,病毒串总长度<= 2000. BCD码这个在数字电路课上讲了, ...
- .net core模糊查询及分页
在项目文件夹中,创建 PaginatedList类,然后用以下代码替换模板代码. using Microsoft.EntityFrameworkCore; using System; using Sy ...
- 大半宿,封装了一个MP3播放器的类,写了个简陋的播放器
用 winmm.lib 写的 封装不是很好,而且没有优化,效率可能有问题,但是现在几乎没有什么大问题 我用我封装的类,写了一个小播放器,界面上的所有功能都实现了,包括双击列表中的文件名,直接播放文件 ...
- iOS开发系列-iOS签名机制
概述 想要了解iOS的签名机制需要有一定密码学有一定的了解.下面依次介绍的数据的加密解密.单向散列函数.数字签名.证书.iOS签名机制. 数据加密解密 在网络通信中想要防止数据被攻击者拦截,我们通常对 ...
- 现代软件工程HW1:词频统计
作业详细要求:http://www.cnblogs.com/denghp83/p/8627840.html 基本功能 1. 统计文件的字符数(只需要统计Ascii码,汉字不用考虑,换行符不用考虑,'\ ...
- JAVA数据结构之数组
接下来的几篇博文会在最近仔细研读数据结构与算法的书籍后会摘录一些要点和总结一些自己的心得体会,帮助大家更深入地理解java中的数据结构和一些基本的算法,同时巩固自己数据结构和算法这些最基础的计算机知识 ...