提交 4f528ea8 编写于 作者: W wizardforcel

2021-10-05 22:17:37

上级 4fe334eb
......@@ -2,13 +2,13 @@
在本章中,我们将介绍以下配方:
* 创建一个简单的 Spring 引导应用程序
* 创建一个简单的 SpringBoot应用程序
* 与数据库交互
* 创建 RESTful Web 服务
* 为 Spring Boot 创建多个配置文件
* 将 RESTful Web 服务部署到 Heroku
* 使用 Docker 容器化 RESTful Web 服务
* 使用千分尺和Prometheus监控 Spring Boot 2 应用程序
* 使用Micrometer和Prometheus监控 Spring Boot 2 应用程序
# 介绍
......@@ -16,15 +16,15 @@
在本章中,我们将介绍**Spring Boot**框架,它提供了一种使用 Spring 库创建生产就绪微服务的便捷方法。使用 SpringBoot,我们将开发一个简单的 RESTfulWeb 服务并将其部署到云中。
# 创建一个简单的 Spring 引导应用程序
# 创建一个简单的 SpringBoot应用程序
Spring Boot 有助于轻松创建生产就绪、基于 Spring 的应用程序。它支持使用几乎所有的 Spring 库,而无需显式配置它们。提供了自动配置类,以便与最常用的库、数据库和消息队列轻松集成。
在本教程中,我们将介绍如何创建一个简单的 Spring 引导应用程序,该应用程序带有一个控制器,当在浏览器中打开时,该控制器将打印一条消息。
在本教程中,我们将介绍如何创建一个简单的 SpringBoot应用程序,该应用程序带有一个控制器,当在浏览器中打开时,该控制器将打印一条消息。
# 准备
SpringBoot 支持 Maven 和 Gradle 作为其构建工具,我们将在我们的食谱中使用 Maven。[以下 URL](http://start.spring.io/) 提供了一种方便的方法来创建具有所需依赖项的空项目。我们将使用它下载一个空项目。按照以下步骤创建并下载空的基于 Spring 引导的项目:
SpringBoot 支持 Maven 和 Gradle 作为其构建工具,我们将在我们的食谱中使用 Maven。[以下 URL](http://start.spring.io/) 提供了一种方便的方法来创建具有所需依赖项的空项目。我们将使用它下载一个空项目。按照以下步骤创建并下载空的基于 SpringBoot的项目:
1. 导航至[这里](http://start.spring.io/)查看与以下截图类似的内容:
......@@ -33,7 +33,7 @@ SpringBoot 支持 Maven 和 Gradle 作为其构建工具,我们将在我们的
2. 您可以选择依赖项管理和构建工具,在**生成**文本后的下拉列表中选择适当的选项。
3. Spring Boot 支持 Java、Kotlin 和 Groovy。您可以通过更改**文本后的下拉列表**来选择语言。
4. 通过从和 Spring 引导文本后的下拉列表中选择其值来选择 Spring 引导版本。对于这个配方,我们将使用 SpringBoot2 的最新稳定版本,即 2.0.4。
4. 通过从和 SpringBoot文本后的下拉列表中选择其值来选择 SpringBoot版本。对于这个配方,我们将使用 SpringBoot2 的最新稳定版本,即 2.0.4。
5. 在左侧,在项目元数据下,我们必须提供与 Maven 相关的信息,即组 ID 和工件 ID。我们将使用组作为`com.packt`,工件作为`boot_demo`
6. 在右侧的“依赖项”下,可以搜索要添加的依赖项。对于这个配方,我们需要 Web 和 Thymeleaf 依赖项。这意味着我们希望创建一个使用 Thymeleaf UI 模板的 Web 应用程序,并希望所有依赖项(如 Spring MVC 和 Embedded Tomcat)都成为应用程序的一部分。
7. 单击 Generate Project 按钮下载空项目。您可以在您选择的任何 IDE 中加载这个空项目,就像任何其他 Maven 项目一样。
......@@ -109,7 +109,7 @@ public class SimpleViewController{
# 与数据库交互
在此配方中,我们将了解如何与数据库集成以创建、读取、修改和删除数据。为此,我们将使用所需的表设置一个 MySQL 数据库。随后,我们将从 Spring 引导应用程序更新表中的数据。
在此配方中,我们将了解如何与数据库集成以创建、读取、修改和删除数据。为此,我们将使用所需的表设置一个 MySQL 数据库。随后,我们将从 SpringBoot应用程序更新表中的数据。
我们将使用 Windows 作为该配方的开发平台。您也可以在 Linux 上执行类似的操作,但首先必须设置 MySQL 数据库。
......@@ -175,7 +175,7 @@ insert into person(first_name, last_name, place)
values('David', 'John', 'Delhi');
```
现在我们已经准备好了数据库,我们将继续实用以下选项[下载空的 Spring 引导项目](http://start.spring.io/)
现在我们已经准备好了数据库,我们将继续实用以下选项[下载空的 SpringBoot项目](http://start.spring.io/)
![](img/6f336164-f3e0-4bb5-8fe4-439252c7baf0.png)
......@@ -676,7 +676,7 @@ Spring Boot 可以通过多种方式读取应用程序的配置。此处按相
* 应用程序属性,`application.properties``application.yml`在打包的 JAR 之外定义。
* 应用程序属性,`application.properties``application.yml`打包在 JAR 中。
* 配置类(即用`@Configuration`注释)作为属性源(用`@PropertySource`注释)。
* Spring 引导的默认属性。
* SpringBoot的默认属性。
在我们的配方中,我们在`application.properties`文件中指定了所有通用属性,如以下,并且在特定于配置文件的应用程序属性文件中指定了任何特定于配置文件的属性:
......@@ -1082,15 +1082,15 @@ ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar /restapp.jar" ]
Docker 是 Docker 集装箱化平台背后的公司,它创建了一组基本图像,可用于创建集装箱。有 MySQL DB、Couchbase、Ubuntu 和其他操作系统的映像。您可以在[这里](https://store.docker.com/)浏览软件包。
# 使用千分尺和Prometheus监控 Spring Boot 2 应用程序
# 使用Micrometer和Prometheus监控 Spring Boot 2 应用程序
监视和收集性能指标是应用程序开发和维护的一个重要部分。人们可能会对内存使用、各种端点的响应时间、CPU 使用、机器负载、垃圾收集频率和暂停等指标感兴趣。有不同的方法来启用捕获度量,例如使用 [Dropwizard 度量](https://metrics.dropwizard.io/4.0.0/) 或 Spring Boot 的度量框架。
使用一个名为测微计的库[对SpringBoot 2 中的代码进行检测](https://micrometer.io/) 。测微计提供了一个供应商中立的代码工具,以便您可以使用任何监控工具,并让测微计以该工具可以理解的格式提供度量数据。这类似于用于日志记录的 SLF4J。它是度量端点上的一个门面,以供应商中立的方式生成输出。
使用一个名为Micrometer的库[对SpringBoot 2 中的代码进行检测](https://micrometer.io/) 。Micrometer提供了一个供应商中立的代码工具,以便您可以使用任何监控工具,并让Micrometer以该工具可以理解的格式提供度量数据。这类似于用于日志记录的 SLF4J。它是度量端点上的一个门面,以供应商中立的方式生成输出。
测微计支持 [Prometheus](https://prometheus.io/)[Netflix Atlas](https://github.com/Netflix/atlas)[DataDogHQ](https://www.datadoghq.com/) 和即将推出的[对 XDB 的支持](https://www.influxdata.com/)[statsd](https://github.com/etsy/statsd)[Graphite](https://graphiteapp.org/)。使用早期版本的 Spring Boot(如 1.5)的应用程序也可以使用这个新的检测库,如“更多”中所示。
Micrometer支持 [Prometheus](https://prometheus.io/)[Netflix Atlas](https://github.com/Netflix/atlas)[DataDogHQ](https://www.datadoghq.com/) 和即将推出的[对 XDB 的支持](https://www.influxdata.com/)[statsd](https://github.com/etsy/statsd)[Graphite](https://graphiteapp.org/)。使用早期版本的 Spring Boot(如 1.5)的应用程序也可以使用这个新的检测库,如“更多”中所示。
在这个配方中,我们将使用测微计来检测我们的代码,并将度量值发送给Prometheus。因此,首先,我们将在“准备”部分设置Prometheus。
在这个配方中,我们将使用Micrometer来检测我们的代码,并将度量值发送给Prometheus。因此,首先,我们将在“准备”部分设置Prometheus。
# 准备
......@@ -1115,11 +1115,11 @@ Docker 是 Docker 集装箱化平台背后的公司,它创建了一组基本
当您在浏览器中打开`http://localhost:9090/metrics`时,您将看到当前时刻的度量值。没有形象化很难理解。随着时间的推移收集这些指标并使用图形进行可视化时,这些指标很有用。
现在,Prometheus已经上路了。让我们以Prometheus理解的格式发布测微计和度量。为此,我们将在本章中重用“与数据库交互”过程中使用的代码。此配方可在`Chapter09/2_boot_db_demo`上获得。因此,我们只需将相同的代码复制到`Chapter09/7_boot_micrometer`中,然后增强部件以添加对测微计和Prometheus的支持,如下一节所示。
现在,Prometheus已经上路了。让我们以Prometheus理解的格式发布Micrometer和度量。为此,我们将在本章中重用“与数据库交互”过程中使用的代码。此配方可在`Chapter09/2_boot_db_demo`上获得。因此,我们只需将相同的代码复制到`Chapter09/7_boot_micrometer`中,然后增强部件以添加对Micrometer和Prometheus的支持,如下一节所示。
# 怎么做。。。
1. 更新`pom.xml`以包含SpringBoot致动器和测微计Prometheus注册表依赖项:
1. 更新`pom.xml`以包含SpringBoot致动器和MicrometerPrometheus注册表依赖项:
```java
<dependency>
......@@ -1133,7 +1133,7 @@ Docker 是 Docker 集装箱化平台背后的公司,它创建了一组基本
</dependency>
```
在 Spring Boot 2 之后的版本中,测微计配置了执行器,所以我们只需要添加执行器作为依赖项,然后`micrometer-registry-prometheus`依赖项生成Prometheus理解的度量表示。
在 Spring Boot 2 之后的版本中,Micrometer配置了执行器,所以我们只需要添加执行器作为依赖项,然后`micrometer-registry-prometheus`依赖项生成Prometheus理解的度量表示。
2. 当我们运行应用程序(其中一种方式是运行`mvn spring-boot:run`并打开执行器端点时,默认为`<root_url>/actuator`。我们会发现默认情况下很少有可用的执行器端点,但 Prometheus metrics 端点不是其中的一部分:
......@@ -1178,7 +1178,7 @@ management.endpoints.web.exposure.include=prometheus
Spring Boot 提供了一个名为 actuator 的库,它具有一些功能,可以帮助您在部署到生产环境时监视和管理应用程序。这种开箱即用的功能不需要开发人员进行任何设置。因此,您无需任何工作即可获得审计、健康检查和指标收集。
如前所述,执行机构使用测微计测量和捕获代码中的不同指标,例如:
如前所述,执行机构使用Micrometer测量和捕获代码中的不同指标,例如:
* JVM 内存使用
* 连接池信息
......@@ -1213,7 +1213,7 @@ management.endpoints.web.base-path=/metrics
| `mappings` | 显示所有`@RequestMapping`路径的整理列表 |
| `prometheus` | 以可由 Prometheus 服务器刮取的格式公开度量 |
您可以看到,这些端点非常敏感,需要加以保护。好的方面是,Spring 引导执行器与 Spring Security 很好地集成,以保护这些端点。因此,如果 Spring 安全性位于类路径上,则默认情况下会保护这些端点。
您可以看到,这些端点非常敏感,需要加以保护。好的方面是,SpringBoot执行器与 Spring Security 很好地集成,以保护这些端点。因此,如果 Spring 安全性位于类路径上,则默认情况下会保护这些端点。
这些端点可以通过 JMX 或 Web 访问。默认情况下,并不是所有的执行器端点都允许 Web 访问,而是默认情况下,它们允许使用 JMX 访问。默认情况下,仅允许从 Web 访问以下属性:
......
......@@ -855,7 +855,7 @@ Spring 是一个名为`spring-test`的模块,支持 Spring 组件的单元测
如前所述,Spring Boot 是 Spring 产品组合的一个项目,旨在简化 Spring 应用程序的开发。使用 Spring Boot 的主要好处总结如下:
* Spring 引导应用程序只是一个 Spring`ApplicationContext`,其中使用了配置上的主要约定。多亏了这一点,我们可以更快地开始 Spring 开发。
* SpringBoot应用程序只是一个 Spring`ApplicationContext`,其中使用了配置上的主要约定。多亏了这一点,我们可以更快地开始 Spring 开发。
* 注释`@SpringBootApplication`用于标识 Spring Boot 项目中的主类。
* 提供了一系列开箱即用的非功能特性:嵌入式 servlet 容器(Tomcat、Jetty 和 Undertow)、安全性、度量、运行状况检查或外部化配置。
* 创建仅使用命令`java -jar`运行的独立运行应用程序(即使对于 Web 应用程序也是如此)。
......@@ -870,14 +870,14 @@ Spring 是一个名为`spring-test`的模块,支持 Spring 组件的单元测
| `spring-boot-starter-data-jpa` | 将 Spring 数据 JPA 与 Hibernate 结合使用的启动程序 |
| `spring-boot-starter-integration` | 使用 Spring 集成的启动器 |
| `spring-boot-starter-jdbc` | 将 JDBC 与 Tomcat JDBC 连接池一起使用的初学者 |
| `spring-boot-starter-test` | 用于使用库(包括 JUnit、Hamcrest 和 Mockito)测试 Spring 引导应用程序的初学者 |
| `spring-boot-starter-test` | 用于使用库(包括 JUnit、Hamcrest 和 Mockito)测试 SpringBoot应用程序的初学者 |
| `spring-boot-starter-thymeleaf` | 用于使用 IELAF 视图构建 MVC Web 应用程序的初学者 |
| `spring-boot-starter-web` | 使用 SpringMVC 构建 Web(包括 REST)应用程序的初学者。使用 Tomcat 作为默认的嵌入式容器 |
| `spring-boot-starter-websocket` | 使用 Spring 框架的 WebSocket 支持构建 WebSocket 应用程序的初学者 |
有关 Spring Boot 的完整信息,请访问[官方参考资料](https://projects.spring.io/spring-boot/)
SpringBoot 提供了不同的功能来简化测试。例如,它提供了`@SpringBootTest`注释,用于测试类的类级别。此注释将为这些测试创建`ApplicationContext`(与`@ContextConfiguration`类似,但用于基于 Spring 引导的应用程序)。正如我们在前面的章节中所看到的,`spring-test`模块中,我们使用注释`@ContextConfiguration(classes=… )`来指定要加载的 bean 定义(Spring`@Configuration`。在测试 Spring 引导应用程序时,这通常不是必需的。SpringBoot 的测试注释将自动搜索主配置(如果没有明确定义)。搜索算法从包含测试的包开始,直到找到一个`@SpringBootApplication`注释类。
SpringBoot 提供了不同的功能来简化测试。例如,它提供了`@SpringBootTest`注释,用于测试类的类级别。此注释将为这些测试创建`ApplicationContext`(与`@ContextConfiguration`类似,但用于基于 SpringBoot的应用程序)。正如我们在前面的章节中所看到的,`spring-test`模块中,我们使用注释`@ContextConfiguration(classes=… )`来指定要加载的 bean 定义(Spring`@Configuration`。在测试 SpringBoot应用程序时,这通常不是必需的。SpringBoot 的测试注释将自动搜索主配置(如果没有明确定义)。搜索算法从包含测试的包开始,直到找到一个`@SpringBootApplication`注释类。
SpringBoot 还促进了对 Spring 组件使用模拟。为此,提供了注释`@MockBean`。此注释允许在`ApplicationContext`中为 bean 定义 Mockito mock。它可以是新的 bean,但也可以替换单个现有的 bean 定义。模拟 bean 在每个测试方法之后自动重置。这种方法通常被称为容器内测试,与容器外测试相对应,其中使用模拟库(例如,Mockito)对Spring组件进行单元测试,以隔离,而不需要Spring`ApplicationContext`。例如,Spring 应用程序的两种单元测试的示例将在下一节中显示。
......@@ -1214,7 +1214,7 @@ public class PageService {
}
```
按照惯例(我们在这里使用 Spring 引导),基于 Spring 的 Web 应用程序的静态资源位于项目类路径中名为`static`的文件夹中。按照 Maven/Gradle 项目的结构,该文件夹位于`src/main/resources`路径中(见下面的屏幕截图)。请注意,这里有两个页面(我们在测试中从一个页面切换到另一个页面,请继续关注):
按照惯例(我们在这里使用 SpringBoot),基于 Spring 的 Web 应用程序的静态资源位于项目类路径中名为`static`的文件夹中。按照 Maven/Gradle 项目的结构,该文件夹位于`src/main/resources`路径中(见下面的屏幕截图)。请注意,这里有两个页面(我们在测试中从一个页面切换到另一个页面,请继续关注):
![](img/00116.jpeg)
......
......@@ -61,7 +61,7 @@ TDD 也是如此。我们通过关注小型单元来开发代码。随着我们
# 特征切换示例
下面是我们的演示应用程序。这一次,我们将构建一个简单而小型的**表述性状态转移****REST**)服务,根据需要计算斐波那契序列的具体第`N`项。我们将使用文件跟踪启用/禁用的功能。为了简单起见,我们将使用 Spring Boot 作为我们的选择框架,并将 Thymeleaf 作为模板引擎。这也包含在 Spring 引导依赖项中。有关 Spring Boot 和相关项目的更多信息,请访问[这里](http://projects.spring.io/spring-boot/)。此外,您还可以访问[这里](http://www.thymeleaf.org/) 了解更多有关模板引擎的信息。
下面是我们的演示应用程序。这一次,我们将构建一个简单而小型的**表述性状态转移****REST**)服务,根据需要计算斐波那契序列的具体第`N`项。我们将使用文件跟踪启用/禁用的功能。为了简单起见,我们将使用 Spring Boot 作为我们的选择框架,并将 Thymeleaf 作为模板引擎。这也包含在 SpringBoot依赖项中。有关 Spring Boot 和相关项目的更多信息,请访问[这里](http://projects.spring.io/spring-boot/)。此外,您还可以访问[这里](http://www.thymeleaf.org/) 了解更多有关模板引擎的信息。
以下是`build.gradle`文件的外观:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册