- 推荐序一
- 推荐序二
- 推荐序三
- 推荐语
- 前言
- 第1章 基础知识
- 第2章 微服务构建:Spring Boot
- 第3章 服务治理:Spring Cloud Eureka
- 第4章 客户端负载均衡:Spring Cloud Ribbon
- 第5章 服务容错保护:Spring Cloud Hystrix
- 第6章 声明式服务调用:Spring Cloud Feign
- 第7章 API网关服务:Spring Cloud Zuul
- 第8章 分布式配置中心:Spring Cloud Config
- 第9章 消息总线:Spring Cloud Bus
- 第10章 消息驱动的微服务:Spring Cloud Stream
- 附录 A Starter POMs
- 后记
快速入门
在本节中,我们将逐步指引读者创建一个Spring Boot的基础项目,并且实现一个简单的RESTful API,通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单、开发迅速的特性。
项目构建与解析
系统及工具版本要求
- Java 7及以上版本
- Spring Framework 4.2.7及以上版本
- Maven 3.2及以上版本 /Gradle 1.12及以上版本
本书内容均采用Java 1.8.0_73、Spring Boot 1.3.7调试通过。
构建Maven项目
1.通过官方的Spring Initializr工具来产生基础项目。
2.访问http://start.spring.io/,如下图所示,该页面提供了以 Maven 或Gradle构建Spring Boot项目的功能。
3.选择构建工具 Maven Project、Spring Boot 版本选择1.3.7,填写 Group 和Artifact信息,在Search for dependencies中可以搜索需要的其他依赖包,这里我们要实现RESTful API,所以可以添加Web依赖。
4.单击Generate Project按钮下载项目压缩包。
5.解压项目包,并用IDE以Maven项目导入,以IntelliJ IDEA 14为例。
6.从菜单中选择File-->New-->Project from Existing Sources...。
7.选择解压后的项目文件夹,单击OK按钮。
8.单击Import project from external model并选择Maven,一直单击Next按钮。
9.若你的环境中有多个版本的JDK,选择Java SDK的时候请选择Java 7以上的版本。
工程结构解析
在完成了上面的步骤之后,我们就创建了一个最基础的Spring Boot工程。
如上图所示,Spring Boot的基础结构有三大块(具体路径根据用户生成项目时填写的Group和Artifact有所差异)。
- src/main/java:主程序入口 HelloApplication,可以通过直接运行该类来启动Spring Boot应用。
- src/main/resources:配置目录,该目录用来存放应用的一些配置信息,比如应用名、服务端口、数据库链接等。由于我们引入了Web模块,因此产生了static目录与templates目录,前者用于存放静态资源,如图片、CSS、JavaScript等;后者用于存放Web页面的模板文件,这里我们主要演示提供RESTful API,所以这两个目录并不会用到。
- src/test/:单元测试目录,生成的HelloApplicationTests通过JUnit 4实现,可以直接用运行Spring Boot应用的测试。后文中,我们会演示如何在该类中测试RESTful API。
Maven配置分析
打开当前工程下的 pom.xml 文件,看看生成的项目都引入了哪些依赖来构建 Spring Boot工程,内容大致如下所示。
<? xml version="1.0" encoding="UTF-8"? >
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.didispace</groupId>
<artifactId>spring-boot-hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-boot-hello</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.7.RELEASE</version>
<relativePath/> <!--lookup parent from repository-->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在基础信息部分,groupId和artifactId对应生成项目时页面上输入的内容。另外,我们还可以注意到,打包形式为jar:<packaging>jar</packaging>,正如我们之前所介绍的,Spring Boot默认将该Web应用打包为jar的形式,而非war的形式,因为默认的Web模块依赖会包含嵌入式的Tomcat,这样使得我们的应用jar自身就具备了提供Web服务的能力,后续我们会演示如何启动它。
父项目parent配置指定为spring-boot-starter-parent的1.3.7版本,该父项目中定义了 Spring Boot 版本的基础依赖以及一些默认配置内容,比如,配置文件application.properties的位置等。
在项目依赖dependencies配置中,包含了下面两项。
- spring-boot-starter-web:全栈Web开发模块,包含嵌入式Tomcat、Spring MVC。
- spring-boot-starter-test:通用测试模块,包含JUnit、Hamcrest、Mockito。
这里所引用的web和test模块,在Spring Boot生态中被称为Starter POMs。Starter POMs是一系列轻便的依赖包,是一套一站式的Spring相关技术的解决方案。开发者在使用和整合模块时,不必再去搜寻样例代码中的依赖配置来复制使用,只需要引入对应的模块包即可。比如,开发Web应用的时候,就引入spring-boot-starter-web,希望应用具备访问数据库能力的时候,那就再引入 spring-boot-starter-jdbc 或是更好用的spring-boot-starter-data-jpa。在使用Spring Boot构建应用的时候,各项功能模块的整合不再像传统Spring应用的开发方式那样,需要在pom.xml中做大量的依赖配置,而是通过使用Starter POMs定义的依赖包,使得功能模块整合变得非常轻巧,易于理解与使用。
Spring Boot的Starter POMs采用spring-boot-starter-*的命名方式,*代表一个特别的应用功能模块,比如这里的web、test。Spring Boot工程本身的结构非常简单,大量的学习要点还是将来在对这些Starter POMs的使用之上。在本书中,由于主要讲述Spring Cloud的微服务组件内容,因此对各个Spring Boot的模块内容不做详尽讲解。对于初学者来说,我们也不必一次性地将所有模块的详细用法都掌握牢固,只需了解每个模块能做什么即可。对于本书所使用的Spring Boot 1.3.7版本的所有Starter POMs的功能索引可以参见附录 A,可以根据自身的需要来查询能够支持的模块,再去搜索这个模块的使用方法来实现我们的需求。
最后,项目构建的build部分,引入了Spring Boot的Maven插件,该插件非常实用,可以帮助我们方便地启停应用,这样在开发时就不用每次去找主类或是打包成jar来运行微服务,只需要通过mvn spring-boot:run命令就可以快速启动Spring Boot应用。
实现RESTful API
在Spring Boot中创建一个RESTful API的实现代码同Spring MVC应用一样,只是不需要像Spring MVC那样先做很多配置,而是像下面这样直接开始编写Controller内容:
- 新建package,命名为com.didispace.web,可根据实际的构建情况修改成自己的路径。
- 新建HelloController类,内容如下所示。
@RestController
public class HelloController {
}
@RequestMapping("/hello")
public String index(){
return "Hello World";
}
- 启动该应用,通过浏览器访问http://localhost:8080/hello,我们可以看到返回了预期结果:Hello World。
启动Spring Boot应用
启动Spring Boot应用的方式有很多种:
- 作为一个Java应用程序,可以直接通过运行拥有main函数的类来启动。
- 在Maven配置中,之前提到了spring-boot插件,可以使用它来启动,比如执行mvn spring-boot:run命令,或是直接单击IDE中对Maven插件的工具,例如IntelliJ中的支持:
- 在服务器上部署运行时,通常先使用mvn install将应用打包成jar包,再通过java-jar xxx.jar来启动应用。
编写单元测试
功能实现之后,我们要养成随手写配套单元测试的习惯,这在微服务架构中尤为重要。通常,我们实施微服务架构的时候,已经实现了前后端分离的项目与架构部署。那么在实现后端服务的时候,单元测试是在开发过程中用来验证代码正确性非常好的手段,并且这些单元测试将会很好地支持我们未来可能会进行的重构。
在Spring Boot中实现单元测试同样非常方便,下面我们打开src/test/下的测试入口 com.didispace.HelloApplicationTests 类,编写一个简单的单元测试来模拟HTTP请求,测试之前实现的/hello接口,该接口应返回Hello World字符串。
具体代码实现如下所示。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=HelloApplication.class)
@WebAppConfiguration
public class HelloApplicationTests {
private MockMvc mvc;
@Before
public void setUp()throws Exception {
mvc=MockMvcBuilders.standaloneSetup(new HelloController()).build();
}
@Test
public void hello()throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Hello World")));
}
}
代码解析如下。
- @RunWith(SpringJUnit4ClassRunner.class):引入Spring对JUnit4的支持。
- @SpringApplicationConfiguration(classes=HelloApplication.class):指定Spring Boot的启动类。
- @WebAppConfiguration:开启Web应用的配置,用于模拟ServletContext。
- MockMvc对象:用于模拟调用Controller的接口发起请求,在@Test定义的hello测试用例中,perform函数执行一次请求调用,accept用于执行接收的数据类型,andExpect用于判断接口返回的期望值。
- @Before:JUnit中定义在测试用例@Test内容执行前预加载的内容,这里用来初始化对HelloController的模拟。
注意引入下面的静态引用,让status、content、equalTo函数可用:
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;
快速入门总结
在本节中,我们通过Spring官方的项目构建工具Spring Initializr生成了一个Spring Boot 的基础项目,并详细介绍了该基础项目的依赖结构以及 Maven 的 spring-boot插件,接着在该项目中实现一个输出“Hello World”的RESTful接口以及针对该接口的单元测试用例,完成了一个虽然简单,但涵盖了项目构建、服务开发、单元测试的全套开发内容。由于我们在后续使用Spring Cloud的时候会构建多个Spring Boot的项目来实现微服务架构中的基础设施以及微服务应用,所以通过本节的学习,我们已经具备了通过使用Spring Boot来构建简单微服务项目的基本能力。
在下一节中,我们将对后续在Spring Cloud组件使用过程中会涉及的配置内容做一些介绍和解释。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论