Skip to main content

Spring Boot

# 安装命令行工具
brew tap pivotal/tap
brew install springboot
# 安装 Spring Cloud 扩展
# https://cloud.spring.io/spring-cloud-cli/
spring install org.springframework.cloud:spring-cloud-cli:1.3.2.RELEASE

# 如果想用加密的功能还需要安装 jce
# http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

参考​

使用 Jetty 而不使用 Tomcat​

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

常量​

  • org.springframework.http.HttpHeaders
  • org.springframework.http.HttpStatus

重要的处理接口​

  • org.springframework.util.PathMatcher 路径的匹配格式,比如 cors 配置
  • org.springframework.boot.logging.LoggingSystem
    • 用于控制日志级别
    • 运行时会暴露 logger endpoint, 可查看和修改日志级别
      • org.springframework.boot.actuate.endpoint.LoggersEndpoint
    • 日志级别
      • TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
    • 日志属性分为 configuredLevel 和 effectiveLevel
      • 修改时使用 configuredLevel
    • Spring Boot 自带了较多的 Logback 配置
      • org.springframework.boot.logging.logback

Tips​

  • 可自定义数据类型转换 Properties conversion
  • 可使用 javax.validation 对配置的属性进行校验
  • 可通过 spring-boot-actuator 模块在 /configprops 查看属性配置

Actuator​

常用终端​

| ID | 描述 | 默认敏感 | | ----------- | --------------------------------------------------------------------------------------------------------- | -------- | ----- | | actuator | 提供基于超媒体的发现页,需要 Spring HATEOAS. | true | | autoconfig | 显示自动配置的汇报,显示所有自动配置的候选和为什么没有被使用 | true | | beans | 显示程序中的 beans 列表 | true | | configprops | 显示所有 @ConfigurationProperties | true | | docs | 显示文档,包括请求和相应的例子,需要 spring-boot-actuator-docs | false | | dump | 执行线程转储 | true | | env | 暴露 ConfigurableEnvironment 的属性 | true | | flyway | 显示 Flyway 数据库的迁移状态 | true | | health | 显示应用的监控信息,授权后请求返回详细信息 | false | | info | 显示任何信息 | | false | | liquibase | 显示 liquibase 数据库迁移状态 | true | | logfile | 返回 logfile 中的内容(如果设置了 logging.file 或 logging.path 属性).需要 MVC 支持.支持 HTTP 头的范围请求. | true | | metrics | 显示当前应用的 metrices 信息 | true | | mappings | 显示所有 @RequestMapping 路径 | true | | shutdown | 停止应用(默认未开启) | true | | trace | 显示跟踪信息(默认只显示前几个 HTTP 请求) | true |

配置​

# 修改一个终端的敏感值
endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
# 控制是否启用终端
endpoints.enabled=false
endpoints.info.enabled=true
endpoints.shutdown.enabled=true
# 控制是否启用敏感
endpoints.sensitive=true
endpoints.info.sensitive=false
# 控制 CORS
endpoints.cors.allowed-origins: http://example.com
endpoints.cors.allowed-methods: GET,POST
# 控制是否启用监控检查
management.health.defaults.enabled=false
# 控制路径和端口地址
management.context-path: /manage
management.port=8081
management.address=127.0.0.1
# 定制化通过 info 终端暴露的信息
info.app.name=MyService
info.app.description=My awesome service
info.app.version=1.0.0
# 通过 Maven 自动展开属性
# spring boot parent 使用 git 插件提供了 git.properties 文件
project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
info.build.artifact=@project.artifactId@
info.build.name=@project.name@
info.build.description=@project.description@
info.build.version=@project.version@
# 控制访问管理台需要的角色
management.security.role=SUPERUSER
# 为单独的终端指定路径
endpoints.{name}.path
# 禁用 HTTP 终端
management.port=-1
# 修改 MBean 名字
endpoints.jmx.domain=myapp
endpoints.jmx.unique-names: true

Remote shell​

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>
  • 默认端口为 2000
  • 命令扫描路径为
classpath*:/commands/**
classpath*:/crash/commands/**
  • 可通过 shell.command-path-patterns 来修改命令路径
  • 继承自 org.crsh.plugin.CRaSHPlugin 的 Bean 会自动注册

配置​

shell.auth.simple.user.name
shell.auth.simple.user.password

Metrics​

监控信息​

系统监控

键描述单位
mem总内存KB
mem.free空闲内存KB
processors进程数
uptime系统运行时间 ms
instance.uptime程序运行时间ms
systemload.average系统平均负载
heap
heap.committed
heap.init
heap.used
堆信息KB
threads
thread.peak
thread.daemon
线程信息
classes
classes.loaded
classes.unloaded
类加载信息
gc.xxx.count
gc.xxx.time
垃圾回收信息

数据源监控

键描述
datasource.xxx.active激活链接数
datasource.xxx.usage当前线程池的使用情况
  • datasource.primary 表示 @Primary 的数据源
  • 如果一个数据源 bean 的名字是以 DataSource 结尾的,那么 metric 里只会显示之前的,例如 myDataSource 显示为 datasource.my
  • 否则都是用 bean 名作为 metric 名
  • 可通过注册 DataSourcePublicMetrics 来修改部分默认配置.
  • 默认情况下会显示所有支持的元数据,可通过 DataSourcePoolMetadataProvider Bean 添加额外的. 请查看DataSourcePoolMetadataProvidersConfiguration.

缓存监控

键描述
cache.xxx.size缓存大小
cache.xxx.hit.ratio命中率
cache.xxx.miss.ratio未命中率

TOMCAT SESSION

  • httpsessions.active
  • httpsessions.max

自定义​

可通过注入 CounterService 或 GaugeService 来提供应用监控, 虽然任何字符串都可以作为名字,但建议参考 该指南.

可通过注册 PublicMetrics 来做通过计算得出的统计.可通过 MetricsEndpoint 来定制处理方式.

输出监控信息​

spring.metrics.export
.send-latest
.delay-millis
.includes
.excludes
# 也可为每个 bean 设置
spring.metrics.export.triggers.<name>.*

输出到 Redis​

@Bean
@ExportMetricWriter
MetricWriter metricWriter(MetricExportProperties export) {
return new RedisMetricRepository(connectionFactory,
export.getRedis().getPrefix(), export.getRedis().getKey());
}
spring.metrics.export.redis.prefix: metrics.mysystem.${spring.application.name:application}.${random.value:0000}
spring.metrics.export.redis.key: keys.metrics.mysystem

输出到 statd​

@Value("${spring.application.name:application}.${random.value:0000}")
private String prefix = "metrics";

@Bean
@ExportMetricWriter
MetricWriter metricWriter() {
return new StatsdMetricWriter(prefix, "localhost", "8125");
}

导出到 JMX​

@Bean
@ExportMetricWriter
MetricWriter metricWriter(MBeanExporter exporter) {
return new JmxMetricWriter(exporter);
}

获取 XmlMapper​

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html

<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
@Autowired
public void init(MappingJackson2XmlHttpMessageConverter xmlConverter){
XmlMapper mapper = (XmlMapper) xmlConverter.getObjectMapper();
}

获取请求体文本​

@RequestMapping(path = "/echo", method = RequestMethod.POST)
public Object echo(HttpServletRequest request) throws IOException {
String content = CharStreams.toString(new InputStreamReader(request.getInputStream()));
return content;
}

去除错误白板页​

@RestController
public class IndexController implements ErrorController{

private static final String PATH = "/error";

private final ErrorAttributes errorAttributes;

// 也可以自己处理错误
@Autowired
public IndexController(ErrorAttributes errorAttributes) {
Assert.notNull(errorAttributes, "ErrorAttributes must not be null");
this.errorAttributes = errorAttributes;
}

@RequestMapping(value = PATH)
public String error() {
return "Error handling";
}

@Override
public String getErrorPath() {
return PATH;
}
}
// 默认的错误控制器为 ErrorMvcAutoConfiguration#basicErrorController

创建自定义的自动配置​