前言

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使用了下面这种较为特别的属性加载顺序:

  1. 在命令行中传入的参数
  2. SPRING_APPLICATION_JAON中的属性、SPRING_APPLICATION_JAON是以JSON格式配置在系统环境变量中的内容
  3. java:comp/env中的JNDI属性
  4. Java的系统属性,可以通过System.getProperties()获得的内容
  5. 操作系统的环境变量
  6. 通过random.*配置的随机属性
  7. 位于当前应用jar包之外,针对不同{profile}环境的配置文件被人,例如application-{profile}.properties或是YAML定义的配置文件
  8. 位于当前应用jar包之内,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties或是YAML定义的配置文件
  9. 位于当前应用jar包之外的application.properties和YAML配置内容
  10. 位于当前应用jar包之内的application.properties和YAML配置内容
  11. 在@Configuration注解修改的类中,通过@ProeprtySource注解定义的属性
  12. 应用默认属性。使用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微服务实战学习系列】配置详解的更多相关文章

  1. 【SpringCloud微服务实战学习系列】客户端负载均衡Spring Cloud Ribbon

    Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的RES模板 ...

  2. 【SpringCloud微服务实战学习系列】服务治理Spring Cloud Eureka

    Spring Cloud Eureka是Spring Cloud Netflix微服务中的一部分,它基于NetFlix Sureka做了二次封装,主要负责完成微服务架构中的服务治理功能. 一.服务治理 ...

  3. 【SpringCloud微服务实战学习系列】创建应用及解析

    一.创建应用 使用官方Spring Initializr工具生成基础项目(http://start.spring.io/) 导入Intellij idea中 目录结构如下: 二.目录结构说明: src ...

  4. SpringCloud学习(SPRINGCLOUD微服务实战)一

    SpringCloud学习(SPRINGCLOUD微服务实战) springboot入门 1.配置文件 1.1可以自定义参数并在程序中使用 注解@component @value 例如 若配置文件为a ...

  5. springcloud微服务实战--笔记

    目前对Springcloud对了解仅限于:“用[注册服务.配置服务]来统一管理其他微服务” 这个水平.有待提高 Springcloud微服务实战这本书是翟永超2017年5月写的,时间已经过去了两年,略 ...

  6. SpringCloud微服务实战——第二章Springboot

    Spring Boot项目工程 src/main/java:主程序入口HelloApplication,可以通过直接运行该类来启动Spring Boot应用. src/main/resources:配 ...

  7. SpringCloud微服务实战——第三章服务治理

    Spring Cloud Eureka 服务治理 是微服务架构中最核心最基本的模块.用于实现各个微服务实例的自动化注册与发现. 服务注册: 在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中 ...

  8. SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集与分析系统

      一套好的日志分析系统可以详细记录系统的运行情况,方便我们定位分析系统性能瓶颈.查找定位系统问题.上一篇说明了日志的多种业务场景以及日志记录的实现方式,那么日志记录下来,相关人员就需要对日志数据进行 ...

  9. Java并发包源码学习系列:详解Condition条件队列、signal和await

    目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...

随机推荐

  1. win10 UWP Markdown 含源码

    Windows下没有比較好的Markdown编辑器 我就自己写一个 csdn的Markdown非常好,就是我须要截图保存有麻烦 须要把我的截图保存在本地,然后上传 这个过程比較麻烦 csdn的图没法外 ...

  2. RNAcentral 数据库简介

    RNAcentral 是EBI 开发的一个非编码RNA的数据库. 网址如下: http://rnacentral.org/ RNAcentral 整合了包括 Ensembl, GENCODE,Gree ...

  3. windows下Nginx与tomcat组合简单使用

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中瓦片资源越来越多,如果提高瓦片的访问效率是一个需要解决的 ...

  4. PHP上传原理及操作实现

    关于PHP上传文件的函数类库,网上有许多封装很完善,大家直接拿来用就可以. 本文章只是说下关于上传原理和简单的上传操作,老鸟就无视了哈^_^~ 还有一些安全性判断比如:服务端限制能接收图片类型的文件, ...

  5. json字符串使用注意问题

    json本身是字符串,即 json字符串 js使用 要把 json字符串 转为  javascript对象 json字符串转为js对象的方法:jquery的parseJSON var str='[{& ...

  6. Node.js之操作Mongodb

    // mongoose 链接 var mongoose = require('mongoose'); var db = mongoose.createConnection('mongodb://127 ...

  7. JWT全面解读、使用步骤

    JWT全面解读JWT全面解读前言JWT基本使用在pom.xml引入java-jwt示例如下概念介绍JWT消息构成头部playload标准中注册的声明 (建议但不强制使用)自定义数据签名signatur ...

  8. InstallShield 制作MSI

    1.  click [project Assistant] 2. select [Build Installation], open this tab asfollow: 3.whenbuild ok ...

  9. 开启apache的server-status辅助分析工具

    在Apache的调优过程中,可以通过查看Apache提供的server-status(状态报告)来验证当前所设置数值是否合理,在httpd.conf文件中做如下设置来打开: #加载mod_status ...

  10. lua 注释

    1. 单行注释 --  功能等同于C++中的// 2. 多行注释  --[[  注释的内容  ]]   功能等同于C++中的 /**/ 3. 多行注释   --[====[   注释和内容  ]=== ...