提交 fc63ba06 编写于 作者: W wizardforcel

2021-10-01 20:47:14

上级 574ae32a
......@@ -430,7 +430,7 @@ security manager 改进中的其他一些值得注意的变化如下:
在本课程中,我们已经看到了一些激动人心的特性,这些特性可以在不付出任何努力的情况下提高应用程序的性能。
在下一课中,我们将学习 JShell 和提前(**AOT**)编译器。我们还将学习**读取评估打印循环****REPL**)工具。
在下一课中,我们将学习 JShell 和提前(**AOT**)编译器。我们还将学习**读取求值打印循环****REPL**)工具。
# 评估
......
......@@ -1139,7 +1139,7 @@ Lock lock = ...;
Oracle 还建议使用 G1 及其默认设置,然后使用`-XX:MaxGCPauseMillis`选项使用不同的暂停时间目标,使用`-Xmx`选项使用最大 Java 堆大小。增加暂停时间目标或堆大小通常会导致更高的吞吐量。延迟也受暂停时间目标的更改影响。
在调优 GC 时,保留`-Xlog:gc*=debug`记录选项是有益的。它提供了许多关于垃圾收集活动的有用细节。JVM 调优的第一个目标是减少完整堆 GC 周期(完整 GC)的数量,因为它们非常消耗资源,因此可能会降低应用程序的速度。这是由于老代居住面积过大造成的。在日志中,它由单词`Pause Full (Allocation Failure)`标识。以下是减少完全 GC 机会的可能步骤:
在调优 GC 时,保留`-Xlog:gc*=debug`记录选项是有益的。它提供了许多关于垃圾收集活动的有用细节。JVM 调优的第一个目标是减少完整堆 GC 周期(完整 GC)的数量,因为它们非常消耗资源,因此可能会降低应用程序的速度。这是由于老代居住面积过大造成的。在日志中,它由单词`Pause Full (Allocation Failure)`标识。以下是减少完全 GC 机会的可能步骤:
* 使用`-Xmx`调出堆的大小。但请确保它不超过 RAM 的物理大小。更好的是,为其他应用程序留出一些 RAM 空间。
* 使用`-XX:ConcGCThreads`显式增加并发标记线程数。
......
......@@ -20,7 +20,7 @@
在 Java7 之前,重定向输入、输出和错误流并不简单。Java7 引入了新的 API,允许将输入、输出和错误重定向到其他进程(管道)、文件或标准输入/输出。然后,在 Java8 中,又引入了一些 API。在 Java 9 中,现在有用于以下领域的新 API:
* 获取流程信息,如**流程 ID****PID**、启动流程的用户、流程运行时间等
* 获取流程信息,如**进程 ID**(PID)、启动流程的用户、流程运行时间等
* 枚举系统中运行的进程
* 管理子流程并通过向上导航流程层次结构来访问流程树
......@@ -212,7 +212,7 @@ $ iostat
ProcessBuilder pb = new ProcessBuilder("iostat", "-Z");
```
使用前面的*操作方法中给出的命令编译并运行。。。*
使用前面的“操作方法”中给出的命令编译并运行
您将看到错误文件中报告了一个错误,但输出文件中没有报告任何错误:
......@@ -463,7 +463,7 @@ pb.command("/bin/bash", "script.sh")
* **所有者**:启动流程的用户名称
* **命令**:流程下运行的命令
* **CPU 时间**:表示进程处于活动状态的时间
* **开始时间**:表示流程启动的时间
* **启动时间**:表示流程启动的时间
这些是我们通常感兴趣的几个属性。也许我们也会对 CPU 使用或内存使用感兴趣。现在,在 Java9 之前,从 Java 内部获取这些信息是不可能的。然而,在 Java9 中,引入了一组新的 API,这使我们能够获得有关流程的基本信息。
......@@ -827,7 +827,7 @@ echo "Running iostat command";
iostat;
```
在前面的脚本中,我们正在运行命令`tree``iostat`,两个命令之间有一分钟的睡眠时间。如果您想了解这些命令,请参考本章的*运行 shell 脚本*配方。从 bashshell 中执行 sleep 命令时,每次调用它时都会创建一个新的子进程。
在前面的脚本中,我们正在运行命令`tree``iostat`,两个命令之间有一分钟的睡眠时间。如果您想了解这些命令,请参考本章的“运行 shell 脚本”配方。从 bashshell 中执行 sleep 命令时,每次调用它时都会创建一个新的子进程。
例如,我们将创建 10 个`ProcessBuilder`实例来运行前面的 shell 脚本并同时启动它们。
......
......@@ -32,7 +32,7 @@ SpringBoot 支持 Maven 和 Gradle 作为其构建工具,我们将在我们的
2. 您可以选择依赖项管理和构建工具,在**生成**文本后的下拉列表中选择适当的选项。
3. Spring Boot 支持 Java、Kotlin 和 Groovy。您可以通过**后的下拉列表更改为**文本来选择语言。
3. Spring Boot 支持 Java、Kotlin 和 Groovy。您可以通过更改**文本后的下拉列表**来选择语言。
4. 通过从和 Spring 引导文本后的下拉列表中选择其值来选择 Spring 引导版本。对于这个配方,我们将使用 SpringBoot2 的最新稳定版本,即 2.0.4。
5. 在左侧,在项目元数据下,我们必须提供与 Maven 相关的信息,即组 ID 和工件 ID。我们将使用组作为`com.packt`,工件作为`boot_demo`
6. 在右侧的“依赖项”下,可以搜索要添加的依赖项。对于这个配方,我们需要 web 和 Thymeleaf 依赖项。这意味着我们希望创建一个使用 Thymeleaf UI 模板的 web 应用程序,并希望所有依赖项(如 Spring MVC 和 Embedded Tomcat)都成为应用程序的一部分。
......@@ -316,7 +316,7 @@ values('David', 'John', 'Delhi');
![](img/db4bfc97-92cf-41ab-80a7-00fd37217a9f.png)
点击**新**,您将获得以下信息:
点击**新**,您将获得以下信息:
![](img/4f5cf0ca-3c12-435a-9fb2-64c2891729fd.png)
......@@ -330,7 +330,7 @@ values('David', 'John', 'Delhi');
您一定想知道到数据库的连接是如何实现的。其中一个 Spring Boot 自动配置类`DataSourceAutoConfiguration`通过使用您的`application.properties`文件中定义的`spring.datasource.*`属性进行设置,为我们提供一个`javax.sql.DataSource`实例。然后,MyBatis 库使用此`javax.sql.DataSource`对象为您提供`SqlSessionTemplate`的实例,这是我们的`PersonMapper`在引擎盖下使用的。
然后,我们使用`com.packt.boot_db_demo.PersonMapper`,通过使用`@AutoWired`将其注入`com.packt.boot_db_demo.PersonController`类。`@AutoWired`注释查找任何 Spring 管理的 bean,这些 bean 要么是确切类型的实例,要么是其实现。看看本章中的*创建一个简单的 Spring Boot 应用程序*配方,了解`@Controller`注释。
然后,我们使用`com.packt.boot_db_demo.PersonMapper`,通过使用`@AutoWired`将其注入`com.packt.boot_db_demo.PersonController`类。`@AutoWired`注释查找任何 Spring 管理的 bean,这些 bean 要么是确切类型的实例,要么是其实现。看看本章中的“创建一个简单的 Spring Boot 应用程序”配方,了解`@Controller`注释。
通过很少的配置,我们能够快速设置简单的 CRUD 操作。这就是 SpringBoot 为开发人员提供的灵活性和敏捷性!
......@@ -624,7 +624,7 @@ mysql> SELECT * FROM person;
spring.datasource.password=springboot
```
完整申请的完整代码可在`Chapter09/4_boot_multi_profile_incomplete`**找到。**您可以使用`mvn spring-boot:run`命令运行应用程序。Spring Boot 从`application.properties`文件读取`spring.profiles.active`属性,并在本地配置文件中运行应用程序。在浏览器中打开`http://localhost:8080/api/persons`URL,查找以下数据:
应用的完整代码可在`Chapter09/4_boot_multi_profile_incomplete`找到。您可以使用`mvn spring-boot:run`命令运行应用程序。Spring Boot 从`application.properties`文件读取`spring.profiles.active`属性,并在本地配置文件中运行应用程序。在浏览器中打开`http://localhost:8080/api/persons`URL,查找以下数据:
```java
[
......@@ -708,11 +708,11 @@ Heroku 是 PaaS 提供商领域最早的参与者之一。它支持以下编程
Heroku 提供了一个名为 Heroku cli([cli.Heroku.com](http://cli.heroku.com)的命令行工具,可用于创建 Heroku 应用程序、部署、监视、添加资源等。CLI 也支持其 web 仪表板提供的功能。它使用 Git 存储应用程序的源代码。因此,当您将应用程序代码推送到 Heroku 的 Git 存储库时,它会根据您正在使用的构建包触发一个构建。然后,它要么使用默认方式生成应用程序,要么使用`ProcFile`执行应用程序。
在此配方中,我们将把基于 Spring Boot 的 RESTful web 服务部署到 Heroku。我们将继续使用之前配方中在另一个云提供商上创建的数据库,*为 Spring Boot*创建多个配置文件
在此配方中,我们将把基于 Spring Boot 的 RESTful web 服务部署到 Heroku。我们将继续使用之前配方中在另一个云提供商上创建的数据库,“为 Spring Boot 创建多个配置文件”
# 准备
在我们继续在 Heroku 上部署示例应用程序之前,我们需要注册一个 Heroku 帐户并安装其工具,这将使我们能够从命令行工作。在接下来的部分中,我们将指导您完成注册过程,通过 web UI 和 Heroku**命令行界面****CLI**创建一个示例应用程序)
在我们继续在 Heroku 上部署示例应用程序之前,我们需要注册一个 Heroku 帐户并安装其工具,这将使我们能够从命令行工作。在接下来的部分中,我们将指导您完成注册过程,通过 web UI 和 Heroku**命令行界面****CLI**)创建一个示例应用程序
# 建立 Heroku 帐户
......@@ -823,7 +823,7 @@ Heroku 提供了一个名为 Heroku cli([cli.Heroku.com](http://cli.heroku.com
]
```
有趣的是,我们的应用程序运行在 Heroku 上,它连接到 DigitalOcean 服务器上的 MySQL 数据库。我们甚至可以在 Heroku 应用程序中提供一个数据库,并连接到该数据库。在*中查看如何执行此操作还有更多。。。*
有趣的是,我们的应用程序运行在 Heroku 上,它连接到 DigitalOcean 服务器上的 MySQL 数据库。我们甚至可以在 Heroku 应用程序中提供一个数据库,并连接到该数据库。在“更多”一节查看如何执行此操作
# 还有更多。。。
......@@ -1088,7 +1088,7 @@ Docker 是 Docker 集装箱化平台背后的公司,它创建了一组基本
使用一个名为测微计的库[对SpringBoot 2 中的代码进行检测](https://micrometer.io/) 。测微计提供了一个供应商中立的代码工具,以便您可以使用任何监控工具,并让测微计以该工具可以理解的格式提供度量数据。这类似于用于日志记录的 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)的应用程序也可以使用这个新的检测库,如*中所示,还有更多。。。*
测微计支持 [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。
......@@ -1115,7 +1115,7 @@ Docker 是 Docker 集装箱化平台背后的公司,它创建了一组基本
当您在浏览器中打开`http://localhost:9090/metrics`时,您将看到当前时刻的度量值。没有形象化很难理解。随着时间的推移收集这些指标并使用图形进行可视化时,这些指标很有用。
现在,Prometheus已经上路了。让我们以Prometheus理解的格式发布测微计和度量。为此,我们将在本章中重用*与数据库*交互过程中使用的代码。此配方可在`Chapter09/2_boot_db_demo`上获得。因此,我们只需将相同的代码复制到`Chapter09/7_boot_micrometer`中,然后增强部件以添加对测微计和Prometheus的支持,如下一节所示。
现在,Prometheus已经上路了。让我们以Prometheus理解的格式发布测微计和度量。为此,我们将在本章中重用“与数据库交互”过程中使用的代码。此配方可在`Chapter09/2_boot_db_demo`上获得。因此,我们只需将相同的代码复制到`Chapter09/7_boot_micrometer`中,然后增强部件以添加对测微计和Prometheus的支持,如下一节所示。
# 怎么做。。。
......
......@@ -180,7 +180,7 @@ HttpResponse<String> response = client.send(request,
另外,注意模块定义`module-info.java`,可在`Chapter10/2_making_http_post/src/http.client.demo`中找到。
要了解 Jackson JARs 在该模块化代码中的使用方式,请参考第 3 章、“模块化编程”中的*自下而上迁移**自上而下迁移*配方。
要了解 Jackson JARs 在该模块化代码中的使用方式,请参考第 3 章、“模块化编程”中的“自下而上迁移”和“自上而下迁移”配方。
提供运行脚本`run.bat``run.sh`,以方便代码的编译和执行:
......
此差异已折叠。
......@@ -11,13 +11,13 @@
# 介绍
**REPL**代表**读取评估打印循环**,如名称所示,它读取在命令行上输入的命令,对其进行评估,打印评估结果,并对输入的任何命令继续此过程。
**REPL**代表**读取求值打印循环**,如名称所示,它读取在命令行上输入的命令,对其进行评估,打印评估结果,并对输入的任何命令继续此过程。
所有主要语言,如 Ruby、Scala、Python、JavaScript 和 Groovy,都有 REPL 工具。Java 缺少急需的 REPL。如果我们必须尝试一些示例代码,比如说使用`SimpleDateFormat`解析字符串,我们必须编写一个包含所有仪式的完整程序,包括创建一个类、添加一个主方法,然后是我们想要尝试的一行代码。然后,我们必须编译并运行代码。这些仪式使得实验和学习语言的特点变得更加困难。
使用 REPL,您只能键入您感兴趣的代码行,并且您将立即得到有关表达式语法是否正确以及是否给出所需结果的反馈。REPL 是一个非常强大的工具,特别是对于第一次使用这种语言的人来说。假设您想展示如何用 Java 打印*Hello World*;为此,您必须开始编写类定义,然后编写`public static void main(String [] args)`方法,最后,您将解释或尝试解释许多新手难以理解的概念。
使用 REPL,您只能键入您感兴趣的代码行,并且您将立即得到有关表达式语法是否正确以及是否给出所需结果的反馈。REPL 是一个非常强大的工具,特别是对于第一次使用这种语言的人来说。假设您想展示如何用 Java 打印`Hello World`;为此,您必须开始编写类定义,然后编写`public static void main(String [] args)`方法,最后,您将解释或尝试解释许多新手难以理解的概念。
无论如何,有了 Java9 和更高版本,Java 开发人员现在可以不再抱怨没有 REPL 工具了。一个名为 JShell 的新 REPL 正在与 JDK 安装捆绑在一起。因此,我们现在可以自豪地编写*Hello World*作为我们的第一个*Hello World*代码。
无论如何,有了 Java9 和更高版本,Java 开发人员现在可以不再抱怨没有 REPL 工具了。一个名为 JShell 的新 REPL 正在与 JDK 安装捆绑在一起。因此,我们现在可以自豪地编写`Hello World`作为我们的第一个`Hello World`代码。
在本章中,我们将探索 JShell 的特性,并编写真正让我们感到惊讶和欣赏 REPL 功能的代码。我们还将看到如何使用 JShellJavaAPI 创建自己的 REPL。
......@@ -31,7 +31,7 @@
# 怎么做。。。
1. 您应该将`%JAVA_HOME%/bin`(在 Windows 上)或`$JAVA_HOME/bin`(在 Linux 上)添加到您的`PATH`变量中。如果没有,请访问*在 Windows 上安装 JDK 18.9 并设置路径变量**在 Linux(Ubuntu,x64)上安装 JDK 18.9 并在第一章*中配置路径变量*配方、*安装和偷窥 Java 11*。*
1. 您应该将`%JAVA_HOME%/bin`(在 Windows 上)或`$JAVA_HOME/bin`(在 Linux 上)添加到您的`PATH`变量中。如果没有,请访问“在 Windows 上安装 JDK 18.9 并设置路径变量”和“在 Linux(Ubuntu,x64)上安装 JDK 18.9 ”,以及第一章“安装和一瞥 Java 11”的“配置路径变量”配方。
2. 在命令行上,键入`jshell`并按`Enter`
3. 您将看到一条消息和一个`jshell>`提示:
......@@ -340,7 +340,7 @@ API 中的中心类是`jdk.jshell.JShell`类。此类是求值状态引擎,其
* **错误**:语法输入错误
* **表达式**:可能产生或不产生某些输出的输入
* **进口**:进口对账单
* **导入**:导入语句
* **方法**:方法声明
* **声明**:声明
* **类型声明**:一种类型,即类/接口声明
......
......@@ -1372,7 +1372,7 @@ Java 9 中模块之间的关系示例
以下列表总结了 Java 9 的其他新功能:
* 使用模块允许创建针对给定应用程序优化的最小运行时 JDK,而不是使用完全 JDK 安装。这可以使用 JDK 9 附带的工具*jlink*实现。
* Java9 提供了一个交互环境,可以直接从 shell 执行 Java 代码。这种类型的实用程序通常称为**读取评估打印循环****REPL**),在 JDK 9 中称为**JShell**
* Java9 提供了一个交互环境,可以直接从 shell 执行 Java 代码。这种类型的实用程序通常称为**读取求值打印循环****REPL**),在 JDK 9 中称为**JShell**
* 集合工厂方法,Java 9 提供了创建集合(例如,列表或集合)并在一行中填充它们的功能:
```java
......
......@@ -18,7 +18,7 @@ TDD 是关于速度的。我们希望快速演示一个想法、概念或实现
# 嘲笑
每个完成过比*Hello World*更复杂的应用程序的人都知道 Java 代码充满了依赖性。可以有团队其他成员编写的类和方法、第三方库或与我们通信的外部系统。甚至在 JDK 中找到的库也是依赖项。我们可能有一个与数据访问层通信的业务层,数据访问层反过来使用数据库驱动程序获取数据。在处理单元测试时,我们更进一步地考虑依赖关系,并且经常将所有公共和受保护的方法(甚至是我们正在处理的类中的方法)视为应该隔离的依赖关系。
每个完成过比`Hello World`更复杂的应用程序的人都知道 Java 代码充满了依赖性。可以有团队其他成员编写的类和方法、第三方库或与我们通信的外部系统。甚至在 JDK 中找到的库也是依赖项。我们可能有一个与数据访问层通信的业务层,数据访问层反过来使用数据库驱动程序获取数据。在处理单元测试时,我们更进一步地考虑依赖关系,并且经常将所有公共和受保护的方法(甚至是我们正在处理的类中的方法)视为应该隔离的依赖关系。
在单元测试级别上进行 TDD 时,创建考虑所有这些依赖关系的规范可能非常复杂,以至于测试本身将成为瓶颈。它们的开发时间可以大大增加,因此 TDD 带来的好处很快就被不断增加的成本所掩盖。更重要的是,这些依赖关系往往会创建复杂的测试,它们包含比实现本身更多的 bug。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册