在展开 Spring Cloud 的微服务架构部署之前, 我们先通过本章的内容来了解 一 下用千构建微服务的基础框架-Spring Boot。 对于 Spring Boot 已经有深入了解的读者可以直接跳过本章, 进入后续章节学习 Spring Cloud 各个组件的使用。
         在这里介绍 Spring Boot 的目的除了它是 Spring Cloud 的基础之外, 也由于其自身的各项优点, 如自动化配置、 快速开发、 轻松部署等, 非常适合用作微服务架构中各项具体微服务的开发框架。所以我们强烈推荐使用 Spring Boot 来构建微服务, 它不仅可以帮助我们快速地构建微服务, 还可以轻松简单地整合 Spring Cloud 实现系统服务化, 而如果使用了传统的 Spring 构建方式的话, 在整合过程中我们还需要做更多的依赖管理工作才能让它们完好地运行起来。
在本章中我们将介绍下面这些与后续介绍有密切联系的内容:
         • 如何构建 Spring Boot 项目
         • 如何实现 RE STfu lAPI 接口
         • 如何实现多环境的 Spring Boot 应用配置
         • 深入理解 Spring Boot 配置的启动机制
         • Spring Boot 应用的监控与管理

SpringBoot的宗旨并非要重写Spring或是替代Spring, 而是希望通过设计大量的自动化配置等方式来简化Spring原有样板化的配置,使得开发者可以快速构建应用。除了解决配置问题之外, Spring Boot还通过 一 系列StaiterPOMs的定义, 让我们整合各项功能的时候, 不需要在 Maven的pom.xml中维护那些错综复杂的依赖关系, 而是通过类似模块化的Starter模块定义来引用, 使得依赖管理工作变得更为简单。

框架简介         

         通过Spring Boot 构建的应用不再需要安装Tomcat,  将应用打包成war, 再部署到Tomcat 这样复杂的构建与部署动作, 只需将SpringBoot应用打成jar包, 并通过java -jar命令直接运行就能启动 一 个标准化的Web应用,这使得Spring Boot应用变得非常轻便。

项目构建与解析

构建地址:https://start.spring.io/

java springboot 微服务 springboot构建微服务_spring

java springboot 微服务 springboot构建微服务_spring_02

工程结构解析
         创建了 一 个最基础的Spring Boot工程:

java springboot 微服务 springboot构建微服务_jar_03

Spring Boot的基础结构有三大块:
• src/main/java:  主程序入口 HelloApp巨ca巨on, 可以通过直接运行该类来启动Spring Boot应用。
• src/main/resources:  配置目录, 该目录用来存放应用的 一 些配置信息, 比如应用名、服务端口、数据库链接等。由千我们引入了Web模块,因此产生了static目录与templates目录, 前者用于存放静态资源, 如图片、 css 、JavaScript等;后者用千存放Web页面的模板文件, 这里我们主要演示提供RESTful APL所以这两个目录并不会用到。
• src/test/: 单元测试目录, 生成的HelloApplica巨onTests通过JUnit 4实现, 可以直接用运行Spring Boot应用的测试。 后文中, 我们会演示如何在该类中测试RESTfu lAPI 。

         项目构建的 build部分, 引入了Spring Boot的Maven插件, 该插件非常实用,可以帮助我们方便地启停应用,这样在开发时就不用每次去找主类或是打包成jar来运行微服务, 只需要通过mvn spring-boot:run 命令就可以快速启动Spring Boot应用。

实现RESTfulAPI

启动Spring Boot应用

• 作为 一 个 Java 应用程序, 可以直接通过运行拥有 main 函数的类来启动。
• 在 Maven 配置中, 之前提到了 spring-boot 插件, 可以使用它来启动, 比如执行 mvn spring-boot: run 命令,或是直接单击 IDE 中对 Maven 插件的工具,例如 IntelliJ中的支待:

java springboot 微服务 springboot构建微服务_jar_04

• 在服务器上部署运行时, 通常先使用 mvn install 将应用打包成 jar 包, 再通过 java  -jar  xxx. jar

单元测试参考:SpringBoot 使用MockMvc进行Controller的测试

配置详解

      src/main/resources 目录是Spring Boot的配置目录, 所以当要为应用创建个性化配置时, 应在该目录下进行。Spring  Boot 的默 认 配 置 文 件位置为 src/main/resources/application.properties 。关于SpringBoot应用的配置内容都可以集中在该文件中, 根据我们引入的不 同Starter模块, 可以在这里定义容器端口号、 数据库连接信息、 日志级别等各种配置信息。比如, 我们需要自定义Web模块的服务端口号,可以在application.properties中添加 server.port=8888 来 指 定 服 务 端口为 8888 ,  也可 以通过
spring.application.name = hello 来指定应用名(该名字在后续SpringCloud中会被注册为服务名)。

自定义参数

除了可以在 Spring Boot 的配置文件中设置各个 Starter 模块中预定义的配置属性, 也可以在配置文件中定义 一 些我们需要的自定义属性。 比如在 applica巨on.properties 中添加:
= SpringCloudinAction 
book.author = ZhaiYongchao 
然后, 在应用中可以通过@Value 注解来加载这些自定义的参数, 比如:
@Component 
public  class  Book  { 
      @Value("${}") 
      private  String  name; 
      @Value("${book.author}") 
      private  String  author; 
      //省略getter和setter
}
@Value 注解加载属性值的时候可以支持两种表达式来进行配置, 如下所示。
• 一种是上面介绍的 PlaceHolder 方式, 格式为${...}, 大括号内为 PlaceHolder。
•  另 一 种是使用 SpEL 表达式 (Spring Expression  Language),  格式为#{...}, 大括号内为 SpEL 表达式。

使用随机数 
在 一 些特殊情况下, 我们希望有些参数每次被加载的时候不是 一 个固定的值, 比如密钥、 服务端口等。 在 SpringBoot的属性配置文件中, 可以 通过 使用${random}配置来产生随机的int值、long值或者string字符串,这样我们就可以容易地通过 配置随机生成属性,而不是在程序中通过编码来实现这些逻辑。
${random}的配置方式主要有以下几种, 读者可作为参考使用。
#随机字符串
.value=${random.value} 
#随机int
.number=${} 
#随机long
.bignumber=${random.long} 
#  10以内的随机数
.tes 七 1=${(l0)}
#  10-20的随机数
.test2=${[l0,20]} 
该 配置方式可以 设置应用 端口等场景, 以避免在本地调试时出现端口冲突的麻烦。

Maven配置分析

打包形式为 jar: <packaging>jar</packaging>,  正如我们之前所介绍的, Spring Boot默认将该Web应用打包为jar 的形式, 而非war 的形式, 因为默认 的Web模块依赖 会包含嵌入式的Tomcat , 这样使得我们的应用jar自身就具备了提供Web服务的能力。在项目依赖 dependencies配置中, 包含了下面两项。
• spring-boot-starter-web:  全栈Web开发模块, 包含嵌入式Tomcat、 SpringMVC。
• spring-boot-starter-test: 通用测试模块, 包含JUnit、 Hamcrest、 Mockito 。

Spring Boot的StarterPOMs采用spring-boot-starter-*的命名方式, * 代表 一 个特别的应用功能模块, 比如 这里的web、t est。Spring Boot工程本身的结构非常简单,大量的学习要点还是将来在对这些StarterPOMs的使用之上。

mvn spring-boot:run

启动Spring Boot应用
启动Spring Boot应用的方式有很多种:
• 作为 一 个 Java 应用程序, 可以直接通过运行拥有 main 函数的类来启动。
• 在 Maven 配置中, 之前提到了 spring-boot 插件, 可以使用它来启动, 比如执行 mvnspring-boot: run 命令,或是直接单击 IDE 中对 Maven 插件的工具,例如 IntelliJ中的支待:

java springboot 微服务 springboot构建微服务_配置文件_05


• 在服务器上部署运行时, 通常先使用 mvn install 将应用打包成 jar 包, 再通过 java  -jar  xxx. jar 来启动应用。

配置文件
在快速入门示例中, 我们介绍Spring Boot 的工程结构时, 提到过 src/main/resources 目录是Spring Boot的配置目录, 所以当要为应用创建个性化配置时, 应在该目录下进行。Spring  Boot 的默 认 配 置 文 件位置为 src/main/resources/application.properties 。关于SpringBoot应用的配置内容都可以集中在该文件中, 根据我们引入的不 同Starter模块,可以在这里定义容器端口号、 数据库连接信息、 日志级别等各种配置信息。比如, 我们需要自定义Web模块的服务端口号,可以在application.properties中添加 server.port=8888 来 指 定 服 务 端口为 8888 ,  也可 以通过spring.application.name = hello 来指定应用名(该名字在后续SpringCloud中会被注册为服务名)。

自定义参数
除了可以在 Spring Boot 的配置文件中设置各个 Starter 模块中预定义的配置属性, 也以在配置文件中定义 一 些我们需要的自定义属性。 比如在 application.properties 中添加:
= SpringCloudinAction 
book.author = ZhaiYongchao 
然后, 在应用中可以通过@Value 注解来加载这些自定义的参数, 比如:
@Component 
public  class  Book  { 
@Value("${}") 
private  String  name; 
@Value("${book.author}") 
private  String  author; 
//省略getter和setter
@Value 注解加载属性值的时候可以支持两种表达式来进行配置, 如下所示。
• 一种是上面介绍的 PlaceHolder 方式, 格式为${...}, 大括号内为 PlaceHolder。
•  另 一 种是使用 SpEL 表达式 (Spring Expression  Language),  格式为#{...}, 大括号内为 SpEL 表达式。

命令行参数
其中提到了使用命令 java -jar 来启动的方式。 该命令除了启动应用之外, 还可以在命令行中指定应用的参数, 比如java -jar  xxx.jar  --server.par七 = 8888, 直接以命令行的方式来设置server.port属性, 并将启动应用的端口设为8888。在用命 令 行 方 式 启 动 Spring Boot 应 用 时, 连续的两个减号--就 是对app让ca巨on.proper巨es 中 的 属 性 值 进 行赋值 的标识。 所以 , java -jar xxx.jar --server.port=8888命令, 等价于在application.properties 中添加属性server.port = 8888。

多环境配置
在 Spring Boot 中, 多环境配置的文件名需要满足 application-{profile}.properties的格式, 其中{profile}对应你的环境标识, 如下所示。
• application-dev.properties 开发环境。
• application-test.properties 测试环境。
• application-prod.properties 生产环境。
至于具体哪个配置文件会被加载, 需要在 application.properties 文件中通过spring.profiles.active

• 执行java -jar  xxx.jar,  可以观察到服务端口被设置为1111 , 也就是默认的开发环境(dev)。
• 执行java -jar  xxx.jar  --spring.profiles.active = test, 可以观察到服务端口被设置为2222, 也就是测试 环境的配置C test)。
• 执行java -jar  xxx.jar  --spring.profiles.active = prod,  可以观察到服务端口被设置为3333, 也就是生产环境的配置(prod)。
按照上面的实验, 可以如下总结多环境的配置思路:
• 在application.properties中配置通用内容,并设置spring.profiles.active =dev,  以开发环境为默认配置。
• 在application-{profile}.properties中配置各个环境不同的内容。
• 通过命令行方式去激活不同环境的配置。

为了能够更合理地重写各属性的值,SpringBoot使用了下面这种较为特别的属性加载顺序:
1  在命令行中传入的参数。
2. SPRING  APPLICATION JSON中的属性。 SPRING_APPLICATION—JSON是以JSON格式配置在系统环境变量中的内容。
3. java:comp/env中的JNDI 属性。
4. Java的系统属性, 可以通过System.getProperties()获得的内容。
5  操作系统的环境变量 。
6  通过random.*配置的随机属性。
7  位于当前应用 jar 包之外,针对不同{profile}环境的配置文件内容,例如applicatin-{profile}.properties或是YAML定义的配置文件。
8  位于当前应用 jar 包之内,针对不同{profile}环境的配置文件内容,例如applicatin-{profile}.properties或是YAML定义的配置文件。
9  位于当前应用jar包之外的application.properties和YAML配置内容。
10位于当前应用jar包之内的application.properties和YAM L配置内容。
11在@Configuration注解修改的类中,通过@PropertySource注解定义的属性。
12应用默认属性,使用SpringApplication.setDefaultProperties 定义的内容。
优先级按上面的顺序由高到低, 数字越小优先级越高。

 spring-boot-starter-actuator模块中已经实现的 一 些原生端点。 根据端点的作用, 可以将原生端点分为以下三大类。
• 应用配置类:获取应用程序中加载的应用配置、 环境变量、 自动化配置报告等与Spring Boot应用密切相关的配置类信息。
• 度最指标类:获取应用程序运行过程中用于监控的度量指标, 比如内存信息、 线程池信息、 HTTP请求统计等。
• 操作控制类:提供了对应用的关闭等操作类功能。