【SpringCloud微服务实战学习系列】配置详解
前言
Spring Boot针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板化配置内容。
一、配置文件
Spring Boot的默认配置文件位置为src/main.resources/application.properties。关于Spring Boot应用的配置内容都可以集中在该文件中,根据我们引入的不太Starter模块,我们解压在这里定义容器端口号、数据库连接信息、日志级别等各种配置信息。eg:我们需要自定义Web模块的服务端口号可以在application.properties中添加server.port=8888来指定服务端口为8888,也可以通过spring.application.name=hello来指定应用名(该名字在后续Spring Cloud中会被注册为服务名)
Spring Boot的配置文件除了可以使用传统的properties文件之外,还支持现在被广泛推荐使用的YAML文件。
YAML是一个可读性高,用来表达资料序列的格式。YAML参考了其他多种语言,包括C语言、Python、Perl、并从XML电子邮件的数据格式中获得两个它使用空白符号缩排和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种设定文档、文件大纲。
YAML采用的配置格式不像properties的配置那样以单纯的键值对形式来表示,而是以类似大纲的缩进形式来表示:
environments:
dev:
url:http://dev.bar.com
name=Developer Setup
prod:
url:http://foo.bar.com
name:My Cool App
等价于
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
可以看到YAML的配置方式结构清晰易读,同时配置内容字符量减少。除此之外,YAML还可以在一个单独文件中通过使用spring.profiles属性来定义多个不同的环境配置。例如下面表示在指定为test环境时,server.port将使用8882端口;在prod环境中,server.port将使用8883端口;如果没有指定环境,server.port将使用8881端口。
server:
port:8881
---
spring:
profiles:test
server:
port:8882
---
spring:
profiles:prod
server:
port:8883
注:YAML无法通过@PropertySource注解来加载配置,但是YAML将属性加载到内存中保存的时候是有序的,所以当配置文件中的信息需要具备顺序含义时,YAML的配置方式比起properties配置文件更有优势。
二、自定义参数
除了可以在Spring Boot的配置文件中设置各个Starter模块中预定义的配置属性,也可以在配置文件中定义一些我们需要的自定义属性。比如在application.properties中添加
book.name=SpringCloudInAction
book.author=Slp
然后在应用中可以通过@Value注解来加载这些自定义参数,比如
@Component
public class Book{
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
//省略getter和setter
}
@Value注解加载属性值的时候可以支持两种表达式来进行配置
1、PlaceHolder方式,格式为${...},{}内未PlaceHolder
2、使用SpEL表达式,格式为#{...},{}内为SpEL表达式
三、参数引用
在application.properties中的各个参数之间可以直接使用PlaceHolder的方式来应用,如:
book.name=SpringCloud
book.author=Slp
book.desc=${book.author} is read <${book.name}>
四、使用随机数
在一些特殊情况下,我们希望有些参数每次被加载的时候不是一个固定的值,比如秘钥、服务端口等。在Spring Boot的配置文件中,可用通过用${random}配置来生成随机的int值,long值,或者String字符串。这样就不用通过编码来实现这些逻辑。
#随机字符串
com.slp.blog.value=${random.value}
#随机int
com.slp.blog.number=${random.int}
#随机long
com.slp.blog.bignumber=${random.long}
#10以内的随机数
com.slp.blog.test1=${random.int(10)}
#10-20的随机数
com.slp.blog.test2=${random.int[10,20]}
五、命令行参数
用命令行凡是启动Spring Boot应用时,连续的2个--就是对application.properties中的属性值进行赋值的标识。所以java -jar xxx.jar --server.port=8888,等价于在application.propertirs中添加属性server.port=8888
六、多环境配置
在Spring Boot中多环节配置的文件名需要满足application-[profile].properties的格式,其中{profile}对应你的环境标识,如下所示
- application-dev.properties:开发环境
- application-test.properties:测试环境
- application-prod.properties:生产环境
至于哪个配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应配置文件中的{profile}值,如spring.profiles.active=tst就会加载application-test.properties配置文件内容、
以不同环境配置不同的服务端口为例,进行样例实验:
- 针对各环境新建不同的配置文件application-dev.properties、application-test.properties、applicatiom-prod.properties
- 针对三个文件中均设置不同的server.port属性,例如dev设置1111.test设置2222、prod设置3333
- application.properties中设置spring.profiles.active=dev,意为默认以dev环境设置
- 测试不同配置的加载
- 执行java -jar xxx.jar 可以观察到服务端口被设置为1111,也就是默认的开发环境。
- 执行java -jar xxx.jar --spring-profiles-active=test可以观察到服务端口被设置为2222,也就是测试换季的配置(test)
- 执行java -jar xxx.jar --spring-profiles.activr=prod ,可以观察到服务端口被设置为3333,也就是生产的配置
总结:
- 在application.properties中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置
- 在application-{profile}.properties中配置各个环境不同的内容
- 通过命令行方式去激活不同环境的配置。
七、加载顺序
为了让QA或者运维来统一维护配置信息,而 不是开发人员来自己维护,因为这本身也是一种安全隐患,对此,出现了很多配置内容外部化的框架的工具,后续将要介绍的Spring Cloud Config就是其中之一,为了更好的掌握Spring Cloud Config的加载机制,我们需要对Spring Boot对数据文件的加载机制有一定的了解。
Spring Boot使用了下面这种较为特别的属性加载顺序:
- 在命令行中传入的参数
- SPRING_APPLICATION_JAON中的属性、SPRING_APPLICATION_JAON是以JSON格式配置在系统环境变量中的内容
- java:comp/env中的JNDI属性
- Java的系统属性,可以通过System.getProperties()获得的内容
- 操作系统的环境变量
- 通过random.*配置的随机属性
- 位于当前应用jar包之外,针对不同{profile}环境的配置文件被人,例如application-{profile}.properties或是YAML定义的配置文件
- 位于当前应用jar包之内,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties或是YAML定义的配置文件
- 位于当前应用jar包之外的application.properties和YAML配置内容
- 位于当前应用jar包之内的application.properties和YAML配置内容
- 在@Configuration注解修改的类中,通过@ProeprtySource注解定义的属性
- 应用默认属性。使用SpringApplication.setDefaultProperties定义的内容
越往前优先级越高。
第7和第9都是从应用jar包之外读取配置文件,可以,实现外部化配置的原理由此切入,为其指定外部配置文件的加载位置来取代jar包纸杯的配置内容。
八、监控与管理
Spring Boot为此提供了一个Starter POMs依赖:spring-boot-starter-actuator。引入该模块能够自动为Spring Boot构建的应用提供一系列用于监控的端点,同时Spring Cloud在实现各个微服务组件的时候,进一步为该模块做了不少扩展,比如,为原生端点增加了更多的指标和度量信息(比如在整合Eureka的时候会为/health端点增加相关的信息),并且根据不同的组件还提供了更多的有空的端点(比如,为API网关组件Zuul提供了/routes端点来返回路由信息)。
1、初识actuator
在Spring Boot应用中引入该模块,在pom.xml的dependency节点中增加spring-boot-starter-actuator的依赖
<dependency>
<!--监控模块-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、原生端点
通过使用spring-boot-starter-actuator模块,我们已经对其有了一个初步的认识,接下来我们了解一下原生端点,根据端点的作用,可以将原生端点分为以下3大类
- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与SpringBoot应用模切相关的配置类信息。
- 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息,HTTP请求统计
- 操作控制类:提供了对应用的关闭等操作类功能
应用配置类
由于Spring Boot为了改善传统Spring应用繁杂的配置内容,采用了包扫描和自动化配置的机制来加载原本集中于XML文件中的各项内容,虽然这样的想法让我们的代码变得简洁,但是整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上,这使我们分析整个应用中资源和实例的各种关系变得非常困难,而这类端点可以帮助我们轻松获取一系列关于Spring应用配置内容的详细报告,比如自动化配置的报告、bean创建的报告、环境属性的报告等。
/auticonfig:该端点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项。同时还列出了每个候选项是否满足自动化配置的各个先决条件。所以,改该短信可以帮助我们方便地找到一些自动化配置为什么没有生效的具体原因,
positiveMatches中返回的是条件匹配成功的自动化配置
negativeMatches/中返回的是条件不匹配的自动化配置
/beans:该端点用来获取应用上下文中创建的所有Bean
每个Bean都包含了:
bean:bean的名称
scope:bean的作用域
type:bean的java类型
resource:class文件的具体路径
dependencies:依赖的bean名称
/configprops:该端点用来获取应用中配置的属性信息报告,从下面端点返回示例的片段中,我, 看到返回了关于该短信的配置信息,prefix属性代表了属性的配置前缀,properties代表了各个属性的名称和值,所以我们可以通过该报告来看到各个属性的配置路径,比如我们需要关闭该端点,就可以通过使用endpoints.configprops.enabled=false来完成设置。
/env:该端点与/configprops不同,它用来获取应用所有可用的环境属性报告。包括环境变量、JVM属性,应用的配置属性、命令行的参数。
/mappings:该端点用来返回所有Spring MVCde 控制器映射关系报告。
/info:该端点用来返回一些应用自定义的信息,默认情况下,该端点只会返回一个空的JSON内容,可以在application.properties配置文件中通过info前缀来设置一些属性。eg:info.app.name=spring-boot-hello info.app.version=v1.0.0
度量指标类
应用配置类端点提供的是静态报告,而度量指标类提供的报告内容则是动态变化的,这些端点提供了应用程序在运行中的一些快照信息,比如内存使用情况、HTTP请求统计、外部资源指标等。
/metrics:该端点用来返回当前应用的各类重要度量指标,比如内存信息、线程信息、垃圾回收信息等。
/health:它用来获取应用的各类健康指标信息。在spring-boot-starter-actuator模块中自带实现了一些常用西苑的健康指标检测器。这些检测器都通过HealthIndicator接口实现,并且会根据依赖关系的引入实现自动化装配。
| 检测器 | 功能 |
| DiskSpaceHealthIndicator | 低磁盘空间检测 |
| DataSourceHealthIndicator | 检测DataSource的连接是否可用 |
| MongoHealthIndicator | 检测Mongo数据库是否可用 |
| RabbitHealthIndicator | 检测Rabbit服务器是否可用 |
| RedisHealthIndicator | 检测Reis服务器是否可用 |
| SolrHealthIndicator | 检测Solr服务器是否可用 |
有时候,我们可能会用到一些Spring Boot的Starter POMS中还没有封装的产品来进行开发,比如,当使用RocketMQ作为消息代理时,由于没有自动化配置的检测器,所以我们需要自己来实现一个用来采集健康信息的检测器。我们可以在Spring Boot的应用中为org.springframework.boot.actuator.health.HealthIndicator接口实现一个对RocketMQ的检测类:
【SpringCloud微服务实战学习系列】配置详解的更多相关文章
- 【SpringCloud微服务实战学习系列】客户端负载均衡Spring Cloud Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的RES模板 ...
- 【SpringCloud微服务实战学习系列】服务治理Spring Cloud Eureka
Spring Cloud Eureka是Spring Cloud Netflix微服务中的一部分,它基于NetFlix Sureka做了二次封装,主要负责完成微服务架构中的服务治理功能. 一.服务治理 ...
- 【SpringCloud微服务实战学习系列】创建应用及解析
一.创建应用 使用官方Spring Initializr工具生成基础项目(http://start.spring.io/) 导入Intellij idea中 目录结构如下: 二.目录结构说明: src ...
- SpringCloud学习(SPRINGCLOUD微服务实战)一
SpringCloud学习(SPRINGCLOUD微服务实战) springboot入门 1.配置文件 1.1可以自定义参数并在程序中使用 注解@component @value 例如 若配置文件为a ...
- springcloud微服务实战--笔记
目前对Springcloud对了解仅限于:“用[注册服务.配置服务]来统一管理其他微服务” 这个水平.有待提高 Springcloud微服务实战这本书是翟永超2017年5月写的,时间已经过去了两年,略 ...
- SpringCloud微服务实战——第二章Springboot
Spring Boot项目工程 src/main/java:主程序入口HelloApplication,可以通过直接运行该类来启动Spring Boot应用. src/main/resources:配 ...
- SpringCloud微服务实战——第三章服务治理
Spring Cloud Eureka 服务治理 是微服务架构中最核心最基本的模块.用于实现各个微服务实例的自动化注册与发现. 服务注册: 在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中 ...
- SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集与分析系统
一套好的日志分析系统可以详细记录系统的运行情况,方便我们定位分析系统性能瓶颈.查找定位系统问题.上一篇说明了日志的多种业务场景以及日志记录的实现方式,那么日志记录下来,相关人员就需要对日志数据进行 ...
- Java并发包源码学习系列:详解Condition条件队列、signal和await
目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...
随机推荐
- Unity--------------------万向锁的概念
万向锁 一直困惑我很久....原因出在这里,我以为欧拉角旋转是以模型坐标(齐次坐标系)为旋转轴.问题就来了,无论旋转那个轴,其它两个轴也会相应的变化,下面看图: 根据上面的说明两个旋转面(圆圈)怎么会 ...
- svn -- 数据备份,版本回退,版本冲突,多仓库配置
数据备份 差异存储法: 版本回退 版本冲突 原理图: 解决办法: 三种方案: 1)合理分配项目开发模块 wangcai:文章,邮件,会员 xiaoqiang:静态化,缓存,前台 2)合理分配项目开发时 ...
- 联想服务器X3850 X6 配置RAID5
实验环境: 1. 服务器型号 联想 System X3850 X6 2. 四块300G SAS硬盘 实验目的: 配置RAID 5 ,搭建公司重要文件共享服务器使用. 标注:本教程四块硬盘全做RA ...
- MySQL谨慎使用"replace into"
From: http://blog.xupeng.me/2013/10/11/mysql-replace-into-trap/ MySQL 对 SQL 有很多扩展,有些用起来很方便,但有一些被误用之后 ...
- 精选10款超酷的HTML5/CSS3菜单
今天向大家精选了10款超酷的HTML5/CSS3菜单,给你的网页添加不一样的精彩,一起来围观一下吧. 1.CSS3手风琴菜单 下拉展开带弹性动画 利用CSS3技术可以实现各种各样的网页菜单,我们之前也 ...
- 关于HTTP Message
HTTP Message包括JS, HTML等Resource.这些都是相对来说有代码可以写的东西,但是原理的东西是没有代码的.coding只是很少的一部分工作内容. Browser的流程.比如con ...
- .net网站建设页面提交后css失效的问题
问题描述:.net网站建设在提交后出现css部分失效,如div位置,字体大小. 问题解决:原因是,过去的提示语句我们一律使用了Response.write("<script>al ...
- 【Intel AF 2.1 学习笔记一】AF程序结构
Intel App Framework(原jqMobi)是用来开发hybrid app的开源免费框架,被intel收编之后发布了最新的2.1版本,最近正在学习.af的所谓程序结构,就是AF网页的架构, ...
- UNIX环境编程学习笔记(17)——进程管理之进程的几个基本概念
lienhua342014-10-05 1 main 函数是如何被调用的? 在编译 C 程序时,C 编译器调用链接器在生成的目标可执行程序文件中,设置一个特殊的启动例程为程序的起始地址.当内核执行 C ...
- Oauth2.0(一):为什么需要 Oauth2.0 协议?
假设有两家互联网企业 A 和 B,其中 B 是一家提供相片云存储的公司.即 B 的用户可以把相片上传到 B 网站上长期保存,然后可以在不同的设备上查看.某一天,A 和 B 谈成了一项合作:希望 B 用 ...