基于Spring Cloud的微服务构建学习-二 Spring Boot配置详解

基于Spring Cloud的微服务构建学习-2 Spring Boot配置详解

SpringBoot配置详解

 SpringBoot自动化配置

        在上一节中我们使用Spring Boot实现了一个简单的RESTful API应用,在实现过程中,除了Maven的pom文件的一些配置,我们没有做任何其他的配置,这就是Spring Boot的自动化配置带来的好处,但是,我们还需要了解如何在Spring Boot中修改这些自动化配置的内容,以应对一些特殊的场景需求。

配置文件—Spring Boot支持YAML配置文件和properties配置文件

        Spring Boot的默认配置文件位置在:src/main/resources/application.properties。关于Spring Boot的配置内容都可以集中在该文件中。

        Spring Boot的配置文件除了可以使用传统的properties文件之外,还可以使用非常流行的YAML文件。

YAML简介

        YAML是一个可读性高,用来表达资料序列的格式。

        YAML以数据为中心,而不是以标记语言为重点。

        YAML和其他高阶语言类似,并且可以简单表达清单、散列表、标量等形态。它使用空白符号缩排和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种设定文档、文件大纲。

        YAML也可以表示关联性的资料。

 YAML与properties的不同     

        YAML的配置文件格式例如:

environments:

    dev:

          url: http://dev.bar.com

          name: Developer Setup

    prod:

          url: http://foo.bar.com

          name: My Cool App

        与其等价的properties:

environments.dev.url=http://dev.bar.com

environments.dev.name=Develop Setup

environments.prod.url=http://foo.bar.com

environments.prod.name=My Cool App

        通过YAML的配置方式我们可以看出,配置字符量比properties少了很多,且结构变得更清晰。

        YAML还可以在一个单个文件中通过使用spring.profiles属性来定义多个不同的环境配置。例如:

server:

    port:8881

---

spring:

    profiles:test

server:

    port:8882

----

spring:

    profiles: prod

server:

    port:8883

当指定为test环境时,server.port将使用8882端口;prod环境时,server.port将使用8883端口;没有指定时使用8881端口。

        YAML将属性加载到内存中保存的是有序的,所以当配置文件中的信息需要具备顺序含义时,YAML的配置方式比起properties配置文件更有优势。

 自定义参数

        除了可以在Spring Boot的配置文件中设置各个starter模块中预定义的配置属性,我们还可以在配置文件中定义一些我们需要的自定义属性。比如在application.properties中添加:

book.name=SpringCloudInAction

book.author=ZhaiYongchao

然后,在应用中可以通过@Value注解来加载这些自定义的参数,比如:

@Component

public class Book{

    @Value(“${book.name}”)

    private String name;

    @Value(“${book.author}”)

    private String author;

    //省略getter和setter

}

然后再Spring Boot的主类中指出该类所在包即可。

@Value注解加载属性时可以支持两种表达式来进行配置:

  • 一种是上面介绍的PlaceHolder方式,格式为${…},大括号内为PlaceHolder.
  • 另一种是使用SpEL表达式,格式为#{…},大括号内为SpEL表达式。

参数引用

book.name=Spring Cloud

book.author=ZhaiYongchao

book.desc=${book.author} is writing 《${book.name}》

这样,book.desc的值为:ZhaiYongchao is writing 《Spring Cloud》。

使用随机数

        在配置文件中使用${random.int}即可获得一个随机的int型数据。

名称

描述

${random.value}

取得随机字符串

${random.int} 取得随机int型数据
${random.long} 取得随机long型数据
${random.int(10)} 取得10以内的随机数
${random.int[10,20]} 取得10~20的随机数

 命令行参数

        我们使用java -jar命令来启动一个spring boot应用,启动时,可以设置参数,例如:

java –jar xxx.jar --server.port=8081

该命令直接以命令行的方式指定了spring boot应用启动的端口号为8081.

        以命令行的方式启动spring boot应用时,连续的--就是对application.properties中的属性进行赋值的标识。

多环境配置

        上面通过命令行的方式修改应用的配置文件,当应用特别多时,这样的方式也许并不太好。因此需要多环境配置。

        在spirng boot中,多环境配置的文件名需要满足 application-{profile}.properties的格式,比如:

  • application-dev.properties 开发环境
  • application-test.properties 测试环境
  • application-prod.properties 生产环境

        具体哪个配置文件会被加载,需要在application.properties文件中通过string.profiles.active属性来设置,其值对应配置文件中的{profile}值(也可以使用java -jar xxx.jar --spring.profiles.active命令指定需要加载的配置文件)。如spring.profiles.active=test就会加载application-test.properties配置文件内容。

加载顺序

基于Spring Cloud的微服务构建学习-二 Spring Boot配置详解

基于Spring Cloud的微服务构建学习-二 Spring Boot配置详解

 监控与管理

        简短的前言

              在为服务架构中,通过将庞大的单体系统拆分成多个提供不同服务的应用。虽然各个应用的内部逻辑因分解而得以简化,但由于部署应用的数量成倍增长,使得系统的维护复杂度大大提升。

        随着应用的不断增加,系统集群中出现故障的次数也越来越多,虽然在高可用机制的保护下,个别故障不会影响系统的对外服务,但是这些频繁出现的鼓掌需要被及时发现和处理才能长期保证系  统处于健康可用状态。为了达到这个目的,我们需要一套自动化的监控运维机制,该机制要能够不间断地收集各个微幅务应用的各项指标情况,并根据这些基础指标信息来制定监控和预警规则。

初始actuator

        引入该模块能够自动为spring boot构建的应用提供一系列用于监控的端点。Spring Cloud在实现各个为服务组件的时候,进一步为该模块做了不少扩展。比如,为原生端点增加了更多的指标和度量信息。

 引入actuator

  1. 在现有的spring boot应用的pom.xml文件中引入spring-boot-starter-actuator依赖即可。

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
</dependency> 

    2.增加该依赖后重新启动应用。此时可以在控制台中看到如下所示:

基于Spring Cloud的微服务构建学习-二 Spring Boot配置详解

上图显示了一批端点定义,这些端点并非我们在程序中定义的,而是由spring-boot-starter-actuator模块根据应用依赖和配置自动创建出来的监控和管理端点。端点具体还以不再说明,可以自行百度。