spring boot
http://tengj.top/2017/03/09/springboot3/
- 自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置
- 起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
- Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。
属性文件
属性文件是最常见的管理配置属性的方式。Spring Boot 提供的 SpringApplication 类会搜索并加载 application.properties 文件来获取配置属性值。SpringApplication 类会在下面位置搜索该文件。
- 外置:在相对于应用程序运行目录的/congfig子目录里。
- 外置,在应用程序运行的目录里
- 内置,在config包内
- 内置,在classpath根目录
src/main/resources/config下application.properties会覆盖src/main/resources下application.properties中相同的属性,此外,如果你在相同优先级位置同时有application.properties和application.yml,那么application.properties里的属性里面的属性就会覆盖application.yml
Spring Boot的配置文件还支持YAML文件,YAML 可以在一个单个文件中通过使用 spring.profiles 属性来定义多个不同的环境配置。
配置详解
Spring Boot 所提供的配置优先级顺序比较复杂。按照优先级从高到低的顺序,具体的列表如下所示。
- 命令行参数。
- 通过 System.getProperties() 获取的 Java 系统参数。
- 操作系统环境变量。
- 从 java:comp/env 得到的 JNDI 属性。
- 通过 RandomValuePropertySource 生成的“random.*”属性。
- 应用 Jar 文件之外的属性文件。
- 应用 Jar 文件内部的属性文件。
- 在应用配置 Java 类(包含“@Configuration”注解的 Java 类)中通过“@PropertySource”注解声明的属性件。
- 通过“SpringApplication.setDefaultProperties”声明的默认属性。
Spring Boot 的这个配置优先级看似复杂,其实是很合理的。比如命令行参数的优先级被设置为最高。这样的好处是可以在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。
application.properties配置自定义属性
application.properties提供自定义属性的支持,这样我们就可以把一些常量配置在这里:
com.dudu.name="嘟嘟MD"
com.dudu.want="祝大家鸡年大吉吧"
com.dudu.yearhope=${com.dudu.name}在此${com.dudu.want}
然后直接在要使用的地方通过注解@Value(value=”${config.name}”)就可以绑定到你想要的属性上面
@RestController
public class UserController {
@Value("${com.dudu.name}")
private String name;
@Value("${com.dudu.want}")
private String want;
@RequestMapping("/")
public String hexo(){
return name+","+want;
}
}
将属性绑定到一个java Bean上
有时候属性太多了,一个个绑定到属性字段上太麻烦,官方提倡绑定一个对象的bean,这里我们建一个ConfigBean.java类,顶部需要使用注解@ConfigurationProperties(prefix = “com.dudu”)来指明使用哪个
@ConfigurationProperties(prefix = "com.dudu")
public class ConfigBean {
private String name;
private String want;
// 省略getter和setter
}
这里配置完还需要在spring Boot入口类加上@EnableConfigurationProperties并指明要加载哪个bean,如果不写ConfigBean.class,在bean类那边添加
@SpringBootApplication
@EnableConfigurationProperties({ConfigBean.class})
public class Chapter2Application {
public static void main(String[] args) {
SpringApplication.run(Chapter2Application.class, args);
}
}
最后在Controller中引入ConfigBean使用即可,如下:
@RestController
public class UserController {
@Autowired
ConfigBean configBean;
@RequestMapping("/")
public String hexo(){
return configBean.getName()+configBean.getWant();
}
}
使用自定义配置文件
有时候我们不希望把所有配置都放在application.properties里面,这时候我们可以另外定义一个,这里我明取名为test.properties,路径跟也放在src/main/resources下面
@Configuration
@ConfigurationProperties(prefix = "com.md")
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
private String name;
private String want;
// 省略getter和setter
}
这里要注意哦,有一个问题,如果你使用的是1.5以前的版本,那么可以通过locations指定properties文件的位置
@ConfigurationProperties(prefix = "config2",locations="classpath:test.properties")
随机值配置
配置文件中${random} 可以用来生成各种不同类型的随机值,从而简化了代码生成的麻烦,例如 生成 int 值、long 值或者 string 字符串。
dudu.secret=${random.value}
dudu.number=${random.int}
dudu.bignumber=${random.long}
dudu.uuid=${random.uuid}
dudu.number.less.than.ten=${random.int(10)}
dudu.number.in.range=${random.int[1024,65536]}
外部配置-命令行参数配置
Spring Boot是基于jar包运行的,打成jar包的程序可以直接通过下面命令运行:
java -jar xx.jar
可以以下命令修改tomcat端口号:
java -jar xx.jar --server.port=9090
命令行中连续的两个减号--
就是对application.properties
中的属性值进行赋值的标识。
java -jar xx.jar --server.port=9090
等价于在application.properties
中添加属性server.port=9090
如果你怕命令行有风险,可以使用SpringApplication.setAddCommandLineProperties(false)禁用它
Profile-多环境配置
在 Spring Boot 中, 多环境配置的文件名需要满足 application-{profile}.properties的格式, 其中{profile}对应你的环境标识。
至于具体哪个配置文件会被加载, 需要在 application.properties文件中通过spring.profiles.active 属性来设置。
多环境的配置思路
• 在application.properties中配置通用内容,并设置spring.profiles.active=dev, 以开发环境为默认配置。
• 在application-{profile}.properties中配置各个环境不同的内容。
• 通过命令行方式去激活不同环境的配置。
- application-dev.properties:开发环境
- application-prod.properties:生产环境
java -jar xxx.jar –spring.profiles.active=dev
spring.profiles.active=dev
Spring boot测试
@SpringApplicationConfiguration(classes = HelloController.class)
//引入Spring对JUnit4的支持
@RunWith(SpringJUnit4ClassRunner.class)
//@WebAppConfigura巨on: 开启Web应用的配置, 用千模拟ServletContext
@WebAppConfiguration
public class HelloControllerTest {
@Autowired
private Book book;
//MockMvc对象: 用于模拟调用 Controller的接口发起请求,
private MockMvc mockMvc;
@Before
public void before(){
mockMvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
}
@Test
public void testHello() throws Exception {
System.out.println(book.getName()+" "+book.getAuthor()+" "+book.getDesc());
//perform函数执行一次请求调用
mockMvc.perform(MockMvcRequestBuilders.get("/hello")
//accept用于执行接收的数据类型
.accept(MediaType.APPLICATION_JSON))
//andExpect用于判断接口返回的期望值
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("hello world"));
}
}
监控与管理
在微服务架构中,我们将原本庞大的单体系统拆分成多个提供不同服务的应用。 虽然各个应用的内部逻辑因分解而得以简化,但是由于部署应用的数量成倍增长,使得系统的维护复杂度大大提升。 虽然在高可用机制的保护下,个别故障不会影响系统的对外服务,但是这些频繁出现的故障需要被及时发现和处理才能长期保证系统处于健康可用状态。 为了能对这些成倍增长的应用做到高效运维,所以我们需要实现一套自动化的监控 运维机制,而这套机制的运行基础就是不间断地收集各个微服务应用的各项 指标情况,并根据这些基础指标信息来制定监控和预警规则,更进一步甚至做到一些自动化的运维操作等。为了让运维系统能够获取各个微服务应用的相关指标以及实现一些常规操作控制,我们需要开发一套专门用于植入各个微服务应用的接口供监控 系统采集信息。 而这些接口往往有很大一部分指标都是类似的,比如环境变量、 垃圾收集信息、 内存信息、 线程池信息等。
spring-boot-starter-actuator 。引入该模块能够自动为 Spring Boot 构建的应用提供一系列用于监控的端点。 同时, SpringCloud 在实现各个微服务组件的时候,进一步为该模块做了不少扩展, 比如,为原生端点
增加了更多的指标和度量信息(比如在整合 Eureka 的时候会为/health 端点增加相关的信息),并且根据不同的组件还提供了更多有空的端点(比如,为 API 网关组件Zuul 提供了 /routes 端点来返回路由信息)。
初识actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
增加该依赖之后,重新启动应用。spring-boot-starter-actuator模块根据应用依赖和配置自动创建出来的监控和管理端点。通过这些端点,我们可以实时获取应用的各项监控指标。
原生端点
• 应用配置类:获取应用程序中加载的应用配置、 环境变量、 自动化配置报告等与Spring Boot应用密切相关的配置类信息。
• 度最指标类:获取应用程序运行过程中用于监控的度量指标, 比如内存信息、 线程池信息、 HTTP请求统计等。
• 操作控制类:提供了对应用的关闭等操作类功能。
应用配置类
由于整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上,这使得我们分析整个应用中资源和实例的各种关系变得非常的困难。而这类端点就可以帮助我们轻松的获取一系列关于Spring 应用配置内容的详细报告
/autoconfig:该端点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项。同时还列出了每个候选项自动化配置的各个先决条件是否满足。
positiveMatches
中返回的是条件匹配成功的自动化配置negativeMatches
中返回的是条件匹配不成功的自动化配置
/beans:该端点用来获取应用上下文中创建的所有Bean
/configprops:该端点用来获取应用中配置的属性信息报告
/env:该端点用来获取应用所有可用的环境属性报告。包括:环境变量、JVM属性、应用的配置配置、命令行中的参数。
/mappings:该端点用来返回所有Spring MVC的控制器映射关系报告
/info:该端点用来返回一些应用自定义的信息。默认情况下,该端点只会返回一个空的json内容。我们可以在application.properties
配置文件中通过info
前缀来设置一些属性
info.app.name=spring-boot-hello
info.app.version=v1.0.0
度量指标类
度量指标类端点提供的报告内容则是动态变化的。这些端点提供了应用程序在运行过程中的一些快照信息,比如:内存使用情况、HTTP请求统计、外部资源指标等。这些端点对于我们构建微服务架构中的监控系统非常有帮助
/metrics:该端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息等
{
"mem": 362833,
"mem.free": 269020,
"processors": 4,
"instance.uptime": 1473938,
"uptime": 1479930,
"systemload.average": -1,
"heap.committed": 312832,
"heap.init": 131072,
"heap.used": 43811,
"heap": 1840640,
"nonheap.committed": 51096,
"nonheap.init": 2496,
"nonheap.used": 50002,
"nonheap": 0,
"threads.peak": 30,
"threads.daemon": 24,
"threads.totalStarted": 56,
"threads": 26,
"classes": 7166,
"classes.loaded": 7166,
"classes.unloaded": 0,
"gc.ps_scavenge.count": 9,
"gc.ps_scavenge.time": 112,
"gc.ps_marksweep.count": 2,
"gc.ps_marksweep.time": 134,
"httpsessions.max": -1,
"httpsessions.active": 0,
"gauge.response.beans": 37,
"gauge.response.mappings": 7,
"gauge.response.env": 8,
"gauge.response.autoconfig": 16,
"gauge.response.hello": 133,
"gauge.response.configprops": 88,
"gauge.response.star-star": 7,
"gauge.response.star-star.favicon.ico": 17,
"counter.status.200.mappings": 1,
"counter.status.200.star-star.favicon.ico": 1,
"counter.status.200.beans": 1,
"counter.status.200.configprops": 1,
"counter.status.404.star-star": 1,
"counter.status.200.autoconfig": 2,
"counter.status.200.hello": 1,
"counter.status.200.env": 1
}
/health:该端点用来获取应用的各类健康指标信息
/dump:该端点用来暴露程序运行中的线程信息
/trace:该端点用来返回基本的HTTP跟踪信息
操作控制类
在原生端点中,只提供了一个用来关闭应用的端点:/shutdown
endpoints.shutdown.enabled=true