在展开Spring Cloud的微服务架构部署之前,我们需要先了解一下用于构建微服务的基础框架——Spring Boot.这里介绍SpringBoot的目的除了它是Spring Cloud的基础之外,也由于其自身的各项优点,如自动化配置、快速开发、轻松部署等,非常适合用作微服务架构中各项具体微服务的开发框架。
我们将从下面这些内容来学习了解SpringBoot:
JavaEE仅仅使用Spring逐渐变得笨重起来,大量的XML文件存在与项目中,繁琐的配置,整合第三方框架的配置问题,低下的开发效率和部署效率等等问题。
(1) Spring Boot使编码变简单
(2) Spring Boot使配置变简单
(3) Spring Boot使部署变简单
(4) Spring Boot使监控变简单
(5) Spring的不足
(1)使用Spring Boot只需要很少的配置,大部分的时候我们直接使用默认的配置即可;
(2)项目快速搭建,可以无需配置的自动整合第三方的框架;
(3)可以完全不使用XML配置文件,只需要自动配置(注解)和Java Config;
(4)内嵌Servlet容器,降低了对环境的要求;
(5)提供starter简化Manen配置,Spring Boot提供了一系列的starter pom用来简化我们的Maven依赖;
(6)运行中应用状态的监控;
1、首先进入spring的网站https://start.spring.io/ ,如下图所示,该页面提供了以Maven构建spring boot 项目的功能.
2、选择构建工具 Maven Project,Spring Boot 版本选择 2.1.1,填写 Group 和 Artifact 信息,在Search for dependencies 中可以搜索需要的其他依赖包,这里我们需要实现 RESTful API,所以可以添加 Web 依赖。
3、点击 Generate Project 按钮下载项目的压缩包,并且解压项目包
4、使用 IDE 导入项目,以 Intellij IDEA 14 为例,从菜单中选择 File->New->Project from Existing Sources…,选择解压的项目文件夹 的 POM.xml 文件,并点击 OK 按钮,一直点击 Next ,这样我们就创建了一个最基础的Spring Boot 工程
完成以上步骤,我们就创建了一个最基础的Spring Boot 工程
src/main/java: 主程序入口 SpringbootDemoApplication, 可以通过直接运行该类来 启动Spring Boot应用。
src/main/resources: 配置目录, 该目录用来存放应用的一些配置信息, 比如 应用名、服务端口、数据库链接等。由千我们引入了Web模块,因此产生了static 目录与templates目录, 前者用于存放静态资源, 如图片、 css、JavaScript等; 后者用千存放Web页面的模板文件, 这里我们主要演示提供RESTful APL所以这 两个目录并不会用到。
src/test/: 单元测试目录, 生成的SpringbootDemoApplicationTests通过JUnit 4实 现, 可以直接用运行Spring Boot应用的测试。 后文中, 我们会演示如何在该类中测 试RESTfulAPI。
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.1.RELEASE
com.gildata
springboot-demo
0.0.1-SNAPSHOT
springboot-demo
Demo 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
可以看到,Spring Boot 默认将该Web应用打包为jar的形式,而不是war的形式,因为默认的Web模块依赖会包含嵌入式的Tomcat,这样使得我们的应用jar自身就具备了提供Web服务的的能力。
父项目parent配置指定为 spring-boot-starter-parent的2.1.1 版本, 该父项 目中定义了Spring Boot版本的基础依赖以及 一 些默认配置内容 , 比如,配置文件application.properties的位置等。 在项目依赖 dependencies配置中, 包含了下面两项。
这里所引用的web和test模块,在Spring Boot生态中被称为Starter POMs,Starter POMs 是一系列轻便的依赖 包, 是一套一站式的Spring相关技术的解决方案。 开发者在使用和整合模块时, 不必再去搜寻样例代码中的依赖配置来复制使用, 只需要引入对应的模块包即可 。
在Spring Boot中创建一个RESTfulAPI的实现代码同SpringMVC应用一样, 只是不 需要像SpringMVC那样先做很多配置, 而是像下面这样直接开始编写Controller内容:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index(){
return "Hello World !";
}
}
启动该应用后,通过浏览器访问 http://localhost:8080/hello ,我们可以看到返回了预期结果 Hello World !
Spring Boot 的默认配置文件位置为 src/main/resources/application.properties
Spring Boot的配置文件除了可以使用传统的 properties文件之外,还支持现在被广泛推 荐使用的YAML文件。
YAML 采用的配置格式不像 properties 的配置那样以单纯的键值对形式来表示,而是以 类似大纲的缩进形式来表示。 下面是一段 YAML 配置信息:
server:
port: 8080
spring:
profiles:
active: prod
除了可以在 Spring Boot 的配置文件中设置各个 Starter 模块中预定义的配置属性, 也可 以在配置文件中定义一些我们需要的自定义属性。 比如在 application.properties 中添加: book.name=SpringCloudinAction
book.author=ZhaiYongchao
然后, 在应用中可以通过@Value 注解来加载这些自定义的参数,比如:
@Component
public class Book{
@Value("${book.name}")
private String name;
}
一种是上面介绍的 PlaceHolder 方式, 格式为${...}, 大括号内为 PlaceHolder。
另一种是使用SpEL 表达式 (Spring Expression Language), 格式为#{...}, 大括号 内为 SpEL 表达式。
在application.properties 中的各个参数之间可以直接通过使用PlaceHolder的方式来进行引用,就像下面的设置:
book.name=SpringCloud
book.author=ZhaiYongchao
book.desc=${book.author} is writing 《${book.name}》
在 一些特殊情况下, 我们希望有些参数每次被加载的时候不是 一个固定的值, 比如密 钥、 服务端口等。 在 SpringBoot的属性配置文件中, 可以 通过 使用${random}配置来产 生随机的int值、long值或者string字符串,这样我们就可以容易地通过 配置随机生成属性, 而不是在程序中通过编码来实现这些逻辑。
随机字符串 com.didispace.blog.value=${random.value}
随机int com.didispace.blog.number=${random.int}
随机long com.didispace.blog.bignumber=${random.long}
10以内的随机数 com.didispace.blog.test1=${random.int(l0)}
10-20的随机数 com.didispace.blog.test2=${random.int[l0,20]}
在用命令行方式 启 动 Spring Boot 应用时, 连续的两个减号–就 是对 application.properties 中的属性值进行赋值 的标识。 所以 , java -jar xxx.jar–server.port=8888命令, 等价千在 application.properties 中添加 属性server.port= 8888。
在 Spring Boot 中, 多环境配置的文件名需要满足 application-{profile}. properties的格式, 其中{profile}对应你的环境标识,
如下所示。
applicaction-dev.properties: 开发环境。
applicaction-test.properties: 测试环境。
application-prod.properties: 生产环境。
具体的再application.properties 文件中通过 spring.profiles.active属性来设置,其值对应配置文件中的{profile}值。如spring.profiles.active=test 就会加载application-test.properties配置文件内容.
为了能够更合理地重写各属性的值,SpringBoot使用了下面这种较为特别的属性加载 顺序:
在命令行中传入的参数。
SPRING APPLICATION JSON中的属性。 SPRING_APPLICATION—JSON是以 JSON格式配置在系统环境变量中的内容。
java:comp/env中的JNDI 属性。
Java的系统属性, 可以通过System.getProperties()获得的内容。
操作系统的环境变量 。
通过random.*配置的随机属性。
位于当前应用 jar 包之外,针对不同{profile}环境的配置文件内容,例如 application-{profile}.properties或是YAML定义的配置文件。
位于当前应用 jar 包之内 ,针对不同{profile}环境的配置文件内容,例如 application-{profile}.properties或是YAML定义的配置文件。
位于当前应用jar包之外的application.properties和YAML配置内容。
位于当前应用jar包之内的application.properties和YAML配置内容。
在@Configuration注解修改的类中,通过@PropertySource注解定义的属性。
应用默认属性,使用SpringApplication.setDefaultProperties 定义的 内容。
优先级按上面的顺序由高到低,数字越小优先级越高。
我们之所以用Spring Boot来作为微服务框架,除了它强大的快速开发功能之外,还因为它在Starter POMs中提供了一个特殊依赖模块spring-boot-starter-actuator 。引入该模块能够自动为 Spring Boot 构建的应用提供 一系列用千监控的端点。 同时, Spring Cloud 在实现各个微服务组件的时候, 进 一步为该模块做了不少扩展,比如,为原生端点 增加了更多的指标和度量信息(比如在整合 Eureka 的时候会为/health 端点增加相关的信息), 并且根据不同的组件还提供了更多有空的端点(比如, 为 API 网关组件 Zuul 提供 了 /routes 端点来返回路由信息)。
在现有的SpringBoot应用中添加spring-boot-starter-actuator模块
org.springframework.boot
spring-boot-starter-actuator
增加以上依赖,重新启动应用,控制台打印如下:
上图显示的端点定义是由spring-boot-starter-actuator模块根据应用依赖和配置自动创建出来的监控和管理端点,通过这些端点我们可以实时获取应用的各项监控指标,比如访问/health 端点:http://localhost:8080/actuator/health 我们可以获得如下信息:
{"status":"UP"}
① 应用配置类
此类端点可以帮助我们轻松获取一系列关于Spring 应用配置内容的详细报告,比如自动化配置的报告、Bean创建的报告、环境属性的报告等.
② 度量指标类–>上面我们所介绍的应用配置类端点所提供的信息报告在应用启动的时候就已经基本确 定了其返回内容, 可以说是一个静态报告。 而度量指标类端点提供的报告内容则是动态变 化的,这些端点提供了应用程序在运行过程中的一些快照信息,比如内存使用情况、 HTTP 请求统计、外部资源指标等。这些端点对于我们构建微服务架构中的监控系统非常有帮助, 由于 Spring Boot 应用自身实现了这些端点,所以我们可以很方便地利用它们来收集我们想 要的信息, 以制定出各种自动化策略。