引言:Spring Cloud 所有的服务构建都是基础Spring Boot进行快速搭建的,本章节带你快速了解Spring Boot的相关知识和配置。
1. Spring Boot快速入门
本章节会快速搭建一个Spring Boot的基础项目,并实现一个RESTFULL API。Spring Boot的特点简单,快速,我们只需要几行代码就可以提供一个RESTFULL API接口。
点击finish就建了一个基础的springboot工程,工程目录如下所示
Spring Boot的基础结构有三大块如上图所示
lsrc/main/java: 主程序入口DemoApplication, 可以通过直接运行该类来
启动Spring Boot应用。
- src/main/resources: 配置目录, 该目录用来存放应用的一些配置信息, 比如应用名、服务端口、数据库链接等。static目录与templates目录, 前者用于存放静态资源, 如图片、 css、JavaScript等;后者用千存放Web页面的模板文件。
- src/test: 单元测试目录。
2. Maven配置分析
我们可以再pom.xml中看到生成了一些依赖如下所示。
<?xml version="1.0" encoding="UTF-8"?>4.0.0org.springframework.boot spring-boot-starter-parent 2.1.4.RELEASEcom.springbootfast demo 0.0.1-SNAPSHOTdemoDemo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
我们之前构建web项目时,基本上都是需要把项目打成war包,然后在扔到Tomcat等web服务器上,才能运行,但是在spring boot中默认是直接讲项目打成jar包,这是因为默认的web模块内嵌了一个Tomcat,这使得jar本身具备了web服务的能力。
在项目依赖 dependencies配置中,包含了下面两项。
- spring-boot-starter-web: 全栈Web开发模块,包含嵌入式Tomcat、 Spring MVC。
- spring-boot-starter-test: 通用测试模块,包含JUnit、 Hamcrest、 Mockito。
这里需要注意,在Spring Boot的Starter POMS采用spring-boot-starter-*的命名方式,*号代表要引用的模块,如上所使用的web和test功能模块。
最后,在项目构建的build部分,引入spring-boot-maven-plugin插件,我们可以通过mvn spring-boot:run 名来来启动springboot。
3. 一个简单的RESTful API接口
首先我们新建一个package:com.springbootfast.demo.web,在web下新建HelloWordController控制类,内容如下:
package com.springbootfast.demo.web;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloWordController { @RequestMapping("/say") public String say(){ return "hello word"; }}
注意的:我本地的8080端口由于被占用了,因此我在application.properties修改了默认端口配置:
server.port=8088
现在来运行程序:
打开浏览器输入:http://localhost:8088/say 会看到右 hello word 输出在页面。如下图:
其实启动spring boot的方式有很多种:
- 作为java应用程序,我们可以直接运行main函数去运行它,上面我就是通过这种方式去运行的。
- 前面我们已经提到了在pom.xml中加入了一个spring boot的maven插件,因此我们也可以通过mvn:spring-boot:run 命令去运行。
- 还有一种就是在服务器上部署运行,需要我们先将应用打包成jar包,然后执行java -jar xxx.jar l来启动应用。
不做测试的程序员是不合格的程序员,在spring boot体系中如何做单元测试呢?
直接贴测试代码:
package com.springbootfast.demo;import com.springbootfast.demo.web.HelloWordController;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.SpringApplicationConfiguration;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import static org.hamcrest.Matchers.equalTo;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = DemoApplication.class)@WebAppConfigurationpublic class DemoApplicationTests { private MockMvc mvc; @Before public void setUp() throws Exception { mvc = MockMvcBuilders.standaloneSetup(new HelloWordController()).build(); } @Test public void say() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/say") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect( content().string(equalTo("hello word"))); }}
运行say方法单元测试通过,如下图所示。
测试代码中的解析如下:
- @RunWith(SpringJUnit4ClassRunner.class):引入JUnit4
- @SpringApplicationConfiguration(classes = DemoApplication.class):指定启动类
- @WebAppConfiguration:开启Web应用配置,用来模拟servletcontext
- MockMvc对象:该对象是用来模拟对controller发起的请求,在say()方法中,perform函数用来发起一次请求,accept用来指定接收的数据类型,andExpect用来判断接口返会值是否和期望的一致。
- @Before:从字面上也很好理解,就是执行@test的方法之前需要处理的事情,我们上述对模拟控制层的对象进行的一个初始化的操作,要不然,直接运行say(),会抛异常的。
4. 有关配置的详细说明
其实上边我已经遇到了一个配置上的问题,由于我自己电脑的上8080端口一直在占用着(具体原因因为工作需要),springboot启动默认又是8080端口,因此我开始启动的时候是没启动成功的,上述也提到了我把端口改到了8088上,就启动成功了。说到配置,相比大家应该都遇到过很繁琐的问题,就是可能会有多个环境,来回切换,配置需要复制了复制去,一不小气复制错了,还有可能会凉凉,小编之前都是根据环境变量去读配置的,我们一个系统因为工作需要,配置环境居然有十几个,看的头都炸了,就先撤到这里,接下来我们看看spring boot的配置是如何减轻我们的负担的。
在此之前,先说下YAML,它是一个可读性高,用来表达资料序列的格式,接下来我们都采用此方式来进行配置,原始的配置文件在这里就不多说了。
上边就是我把默认端口8080改成了8088之后的配置。
如果我们想要在一个文件中配置两个环境的配置,该如何搞?看下图!!!
这里需要注意一下:通过YAML配置的不能通过@PropertySOurce注解去加载配置,不过,YAML将属性加载到内存中保存的时候是有序的。
命令行参数:比如我们通过 java -jar xxx.jar --server.port=6666 的方式可以指定端口去启动应用,这种方式和修改配置能起到一样的效果。
多环境配置:
我们知道有个默认的配置文件application.yaml,除此之外我们可以增加application-test.yaml,application-prod.yaml,application-dev.yaml,我们可以分别指定不同的端口以及不能环境的参数内容,可以通过spring.profiles.action来指定应用去使用哪一份配置文件,通过参数命令去触发:java -jar xxx.jar --spring.profiles.action=test。
Spring boot配置文件的加载顺序从上到下如下:
- 命令行中传入的参数
- SPRING_APPLICATION_JSON中的属性、
- JAVA:comp/env中的JNDI属性
- Java系统属性,通过System.getProperties()获得的
- 操作系统的环境变量
- 通过random.*配置的随机属性
- 位于当前应用jar包之外,针对不同{profile}环境的配置文件内容
- 位于当前jar包之类,spring.profiles.action
- 位于当前jar包之外的默认配置内容
- 位于当前jar包之内的默认配置内容
- @Configuration注解注释的类中,通过@PropertySource注解定义的属性
- 在应用默认属性,使用SpringApplication.setDefaultProperties定义的内容
5. 监控和管理ACTUATOR
在pom.xml中添加spring-boot-starter-actuator依赖,然后重启应用。
我们可以访问上边的地址,获取对应的信息,比如/health
Spring boot监控端点包括三大类:
- 应用配置类:获取应用程序中加载的应用配置、 环境变量、 自动化配置报告等与Spring Boot应用密切相关的配置类信息。
- 度最指标类:获取应用程序运行过程中用于监控的度量指标, 比如内存信息、 线程池信息、 HTTP请求统计等。
- 操作控制类:提供了对应用的关闭等操作类功能
在这里就不做过多的讲解。关于spring boot的讲解在此就告一段落,后续会更新spring cloud的组件,希望持续关注。
看完了,记得收藏,空时就翻翻。