2.5 Spring Boot生产级特性
2.5.1 应用监控
Spring Boot大部分模块都是用于开发业务功能或连接外部资源的。除此之外,Spring Boot还为我们提供了spring-boot-starter-actuator模块,该模块主要用于管理和监控应用。这是一个用于暴露自身信息的模块。spring-boot-starter-actuator模块可以有效地减少监控系统在采集应用指标时的开发量。spring-boot-starter-actuator模块提供了监控和管理端点以及一些常用的扩展和配置方式,具体如表2-1所示。
表2-1 监控和管理端点
在Spring Boot中使用监控,首先需要在pom.xml文件中引入所需的依赖spring-boot-starter-actuator,具体代码如下所示:
在pom.xml文件引入spring-boot-starter-actuator依赖包之后,需要在application.properties文件中添加如下的配置信息:
### 应用监控配置 #指定访问这些监控方法的端口 management.server.port=8099
management.port用于指定访问这些监控方法的端口。spring-boot-starter-actuator依赖和配置都添加成功之后,重新启动my-spring-boot项目,项目启动成功之后,在浏览器测试各个端点。比如在浏览器中输入:http://localhost:8099/actuator/health,可以看到如图2-16所示的应用健康信息。
图2-16 应用健康信息
比如在浏览器中输入:http://localhost:8099/actuator/env,可以查看所有环境变量,具体如图2-17所示。
图2-17 应用环境变量
其他端点测试可以按照表2-2所示的访问路径依次访问测试。
表2-2 监控和管理端点
在浏览器中可以把返回的数据格式化成JSON格式,因为笔者的Google Chrome浏览器安装了JsonView插件,具体安装步骤如下:
浏览器中输入链接:https://github.com/search?utf8=%E2%9C%93&q=jsonview,在弹出的页面中单击gildas-lormeau/JSONView-for-Chrome,具体如图2-18所示。
图2-18 JsonView-for-Chrome界面
单击【Download Zip】,插件下载完成,解压缩到相应目录。
在浏览器右上角单击【更多工具】→【扩展程序】→【加载已解压的扩展程序】,选择插件目录。
安装完成,重新启动浏览器(快捷键:Ctrl+R)。
除了spring-boot-starter-actuator提供的默认端点外,我们还可以定制端点,定制端点一般通过“management.endpoint+端点名+属性名”来设置。比如,我们可以在配置文件application.properties中把端点名health的更多详细信息打印出来,具体代码如下所示:
management.endpoint.health.show-details=always
配置添加完成之后,重新启动my-spring-boot项目,在浏览器中输入访问地址:http://localhost:8099/actuator/health,可以获得应用健康更多详细信息。如果想关闭端点beans,那么可以在配置文件application.properties中添加如下代码:
management.endpoint.beans.enabled=false
配置添加完成之后,重新启动my-spring-boot项目,在浏览器输入访问地址:http://localhost:8099/actuator/beans,返回404错误信息,具体代码如下所示:
如果想知道Spring Boot提供了哪些端点,那么可以引入hateoas依赖,具体代码如下所示:
hateoas是一个超媒体技术,通过它可以汇总端点信息,包含各个端点的名称与链接。hateoas依赖添加完成之后,在浏览器输入访问地址:http://localhost:8099/actuator,将看到所有的端点及其访问链接,如图2-19所示。
图2-19 端点信息汇总
2.5.2 健康检查
在浏览器中输入访问地址:http://localhost:8099/actuator/health,将可以看到如图2-20所示的图片。
图2-20 端点信息汇总
health端点用于查看当前应用的运行状况,即应用的健康状况,我们简称“健康检查”。status:"UP"代表应用正处于运行状态。diskSpace表示磁盘空间的使用情况。默认端点health的信息是从HealthIndicator的bean中收集的,Spring中内置了一些HealthIndicator,如表2-3所示。
表2-3 监控和管理端点
我们可以利用Spring Boot的健康检查特性开发一个微服务系统监控平台,用于获取每个微服务的运行状态和性能指标。也可以使用现有的解决方案,比如spring-boot-admin,这是一款基于Spring Boot的开源监控平台。
2.5.3 跨域访问
对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现。针对跨域问题,我们可能第一个想到的解决方式就是JSONP,但是JSONP方式有一些不足,JSONP方式只能通过Get请求方式来传递参数,当然还有其他的不足之处。在Spring Boot中通过CORS(Cross-Origin Resource Sharing,跨域资源共享)协议解决跨域问题。CORS是一个W3C标准,它允许浏览器向不同源的服务器发出xmlHttpRequest请求,我们可以继续使用Ajax进行请求访问。Spring MVC 4.2版本增加了对CORS的支持,具体做法如下所示:
我们可以在addMapping方法中配置路径,/**代表所有路径。当然也可以修改其他属性,例如:
以上两种方式都是针对全局配置的。如果想做到更细致的控制,那么可以使用@CrossOrigin注解在Controller类中使用。
@CrossOrigin(origins = "http://192.168.1.97:8080", maxAge = 3600) @RequestMapping("rest_index") @RestController public class AyController{}
这样就可以指定AyController中所有方法都能处理来自http:19.168.1.97:8080的请求。
2.5.4 外部配置
Spring Boot支持通过外部配置覆盖默认配置项,具体优先级如下:
(1)Java命令行参数。
(2)JNDI属性。
(3)Java系统属性(System.getProperties())。
(4)操作系统环境变量。
(5)RandomValuePropertySource配置的random.*属性值。
(6)JAR包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件。
(7)JAR包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件。
(8)JAR包外部的application.properties或application.yml(不带spring.profile)配置文件。
(9)JAR包内部的application.properties或application.yml(不带spring.profile)配置文件。
(10)@Configuration注解类上的@PropertySource。
(11)通过SpringApplication.setDefaultProperties指定的默认属性。
以Java命令行参数为例,运行Spring Boot jar包时,指定如下参数:
### 参数用--xxx=xxx的形式传递 java -jar app.jar --name=spring-boot --server.port=9090
应用启动的时候,就会覆盖默认的Web Server 8080端口,改为9090。