SpringCloud学习笔记(2)—— 微服务构建:SpringBoot

   在展开Spring Cloud的微服务架构部署之前,我们需要先了解一下用于构建微服务的基础框架——Spring Boot.这里介绍SpringBoot的目的除了它是Spring Cloud的基础之外,也由于其自身的各项优点,如自动化配置、快速开发、轻松部署等,非常适合用作微服务架构中各项具体微服务的开发框架。

   我们将从下面这些内容来学习了解SpringBoot:

  • 如何构建Spring Boot 项目
  • 如何实现RESTful API 接口
  • 如何实现多环境的 Spring boot 应用配置
  • 深入理解Spring Boot 配置的启动机制
  • Spring Boot 应用的监控与管理
一、框架简介

JavaEE仅仅使用Spring逐渐变得笨重起来,大量的XML文件存在与项目中,繁琐的配置,整合第三方框架的配置问题,低下的开发效率和部署效率等等问题。

1.Spring Boot解决的问题

(1) Spring Boot使编码变简单
(2) Spring Boot使配置变简单
(3) Spring Boot使部署变简单
(4) Spring Boot使监控变简单
(5) Spring的不足

2.Spring Boot 主要特性

(1)使用Spring Boot只需要很少的配置,大部分的时候我们直接使用默认的配置即可;
(2)项目快速搭建,可以无需配置的自动整合第三方的框架;
(3)可以完全不使用XML配置文件,只需要自动配置(注解)和Java Config;
(4)内嵌Servlet容器,降低了对环境的要求;
(5)提供starter简化Manen配置,Spring Boot提供了一系列的starter pom用来简化我们的Maven依赖;
(6)运行中应用状态的监控;

二、快速入门
1.项目构建与解析

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 工程

2、工程结构解析

完成以上步骤,我们就创建了一个最基础的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。

3、Maven配置分析
<?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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.gildata</groupId>
	<artifactId>springboot-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot-demo</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<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>

可以看到,Spring Boot 默认将该Web应用打包为jar的形式,而不是war的形式,因为默认的Web模块依赖会包含嵌入式的Tomcat,这样使得我们的应用jar自身就具备了提供Web服务的的能力。

父项目parent配置指定为 spring-boot-starter-parent的2.1.1 版本, 该父项 目中定义了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相关技术的解决方案。 开发者在使用和整合模块时, 不必再去搜寻样例代码中的依赖配置来复制使用, 只需要引入对应的模块包即可 。

三、实现RESTful API

在Spring Boot中创建一个RESTfulAPI的实现代码同SpringMVC应用一样, 只是不 需要像SpringMVC那样先做很多配置, 而是像下面这样直接开始编写Controller内容:

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String index(){
        return "Hello World !";
    }
}

启动该应用后,通过浏览器访问 http://localhost:8080/hello ,我们可以看到返回了预期结果 Hello World !

四、配置详解
1、配置文件

Spring Boot 的默认配置文件位置为 src/main/resources/application.properties
Spring Boot的配置文件除了可以使用传统的 properties文件之外,还支持现在被广泛推 荐使用的YAML文件。
YAML 采用的配置格式不像 properties 的配置那样以单纯的键值对形式来表示,而是以 类似大纲的缩进形式来表示。 下面是一段 YAML 配置信息:

server:
  port: 8080
spring:
  profiles:
    active: prod 
2、自定义参数

除了可以在 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 表达式。

3、参数引用

在application.properties 中的各个参数之间可以直接通过使用PlaceHolder的方式来进行引用,就像下面的设置:

book.name=SpringCloud
book.author=ZhaiYongchao
book.desc=${book.author} is writing 《${book.name}》
4、使用随机数

在 一些特殊情况下, 我们希望有些参数每次被加载的时候不是 一个固定的值, 比如密 钥、 服务端口等。 在 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]}

5、命令行参数

在用命令行方式 启 动 Spring Boot 应用时, 连续的两个减号–就 是对 application.properties 中的属性值进行赋值 的标识。 所以 , java -jar xxx.jar–server.port=8888命令, 等价千在 application.properties 中添加 属性server.port= 8888。

6、多环境配置

在 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配置文件内容.

7、加载顺序

为了能够更合理地重写各属性的值,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}环境的配置文件内容,例如 application-{profile}.properties或是YAML定义的配置文件。

  8. 位于当前应用 jar 包之内 ,针对不同{profile}环境的配置文件内容,例如 application-{profile}.properties或是YAML定义的配置文件。

  9. 位于当前应用jar包之外的application.properties和YAML配置内容。

  10. 位于当前应用jar包之内的application.properties和YAML配置内容。

  11. 在@Configuration注解修改的类中,通过@PropertySource注解定义的属性。

  12. 应用默认属性,使用SpringApplication.setDefaultProperties 定义的 内容。

优先级按上面的顺序由高到低,数字越小优先级越高。

五、监控与管理

我们之所以用Spring Boot来作为微服务框架,除了它强大的快速开发功能之外,还因为它在Starter POMs中提供了一个特殊依赖模块spring-boot-starter-actuator 。引入该模块能够自动为 Spring Boot 构建的应用提供 一系列用千监控的端点。 同时, Spring Cloud 在实现各个微服务组件的时候, 进 一步为该模块做了不少扩展,比如,为原生端点 增加了更多的指标和度量信息(比如在整合 Eureka 的时候会为/health 端点增加相关的信息), 并且根据不同的组件还提供了更多有空的端点(比如, 为 API 网关组件 Zuul 提供 了 /routes 端点来返回路由信息)。

1、初识actuator

在现有的SpringBoot应用中添加spring-boot-starter-actuator模块

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

增加以上依赖,重新启动应用,控制台打印如下:
在这里插入图片描述
上图显示的端点定义是由spring-boot-starter-actuator模块根据应用依赖和配置自动创建出来的监控和管理端点,通过这些端点我们可以实时获取应用的各项监控指标,比如访问/health 端点:http://localhost:8080/actuator/health 我们可以获得如下信息:

{"status":"UP"}
2、原生端点
  • 应用配置类:获取应用程序中加载的应用配置、 环境变量、 自动化配置报告等与 Spring Boot应用密切相关的配置类信息。
  • 度最指标类:获取应用程序运行过程中用于监控的度量指标, 比如内存信息、 线程池信息、HTTP请求统计等。
  • 操作控制类:提供了对应用的关闭等操作类功能。

① 应用配置类

此类端点可以帮助我们轻松获取一系列关于Spring 应用配置内容的详细报告,比如自动化配置的报告、Bean创建的报告、环境属性的报告等.

  • /autoconfig:该端点用来获取应用的自动化配置报告, 其中包括所有自动化配置的候选项。 同时还列出了每个候选项是否满足自动化配置的各个先决条件。 所以, 该端点可以帮助我们方便地找到一些自动化配置为什么没有生效的具体原因。
  • /configprops:该端点用来获取应用中配置的属性信息报告。 从下面该端点返回示例 的片段中, 我们看到返回了关于该短信的配置信息, prefix 属性代表了属性的配 置前缀, properties 代表了各个属性的名称和值。 所以, 我们可以通过该报告来 看 到各个属性的 配 置路 径, 比如我们要关闭该端点, 就可 以 通过使用 endpoints.configprops.enabled=false 来完成设置。
  • /env: 该端点与/configprops不同它用来获取应用所有可用的环境属性报告。 包括 环境变量、NM属性、应用的配置属性、命令行中的参数。 从下面该端点返回的示 例片段中, 可以看到它不仅返回了应用的配置属性, 还返回了系统属性、环境变量 等丰富的配置信息, 其中还包括了应用还没有使用的配置, 所以它可以帮助我们方 便地看到当前应用可以加载的配置信息, 并配合@ConfigurationProperties 注解将它们引入到我们的应用程序中来进行使用。 另外, 为了配置属性的安全, 对 于一些类似密码等敏感信息, 该端点都会进行隐私保护, 但是我们需要让属性名中 包含password、secret、key这些关键词, 这样该端点在返回它们的时候会使用*来替代实际的属性值。
  • /mappings: 该端点用来返回所有Spring MVC的控制器映射关系报告。 从下面的示 例片段中, 我们可以看到该报告的信息与我们在启用Spring MVC的Web应用时输 出的日志信息类似, 其中bean属性标识了该映射关系的请求处理器, method属 性标识了该映射关系的具体处理类和处理函数。
  • /info: 该端点用来返回一些应用自定义的信息。 默认清况下, 该瑞点只会返回 一个 空的JSON内容。我们可以在application.properties配置文件中通过info 前缀来设置一些属性

② 度量指标类–>上面我们所介绍的应用配置类端点所提供的信息报告在应用启动的时候就已经基本确 定了其返回内容, 可以说是一个静态报告。 而度量指标类端点提供的报告内容则是动态变 化的,这些端点提供了应用程序在运行过程中的一些快照信息,比如内存使用情况、 HTTP 请求统计、外部资源指标等。这些端点对于我们构建微服务架构中的监控系统非常有帮助, 由于 Spring Boot 应用自身实现了这些端点,所以我们可以很方便地利用它们来收集我们想 要的信息, 以制定出各种自动化策略。

  • /metrics: 该端点用来返回当前应用的各类重要度量指标,比如内存信息、线程信息、 垃圾回收信息等。
  • /health: 应用健康信息,会根据依赖关系自动装配,比如磁盘,dataSource,Mongo,redis,rabbit,solr等,也可以自己实现
  • /dump: 运行中的线程信息
  • /trace: HTTP跟踪信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值