Spring 实战(第五版)
  • Spring 实战(第 5 版)
  • 第一部分 Spring 基础
  • 第 1 章 Spring 入门
    • 1.1 什么是 Spring?
    • 1.2 初始化 Spring 应用程序
      • 1.2.1 使用 Spring Tool Suite 初始化 Spring 项目
      • 1.2.2 检查 Spring 项目结构
    • 1.3 编写 Spring 应用程序
      • 1.3.1 处理 web 请求
      • 1.3.2 定义视图
      • 1.3.3 测试控制器
      • 1.3.4 构建并运行应用程序
      • 1.3.5 了解 Spring Boot DevTools
      • 1.3.6 回顾
    • 1.4 俯瞰 Spring 风景线
      • 1.4.1 Spring 核心框架
      • 1.4.2 Spring Boot
      • 1.4.3 Spring Data
      • 1.4.4 Spring Security
      • 1.4.5 Spring Integration 和 Spring Batch
      • 1.4.6 Spring Cloud
    • 1.5 小结
  • 第 2 章 开发 Web 应用程序
    • 2.1 展示信息
      • 2.1.1 建立域
      • 2.1.2 创建控制器类
      • 2.1.3 设计视图
    • 2.2 处理表单提交
    • 2.3 验证表单输入
      • 2.3.1 声明验证规则
      • 2.3.2 在表单绑定时执行验证
      • 2.3.3 显示验证错误
    • 2.4 使用视图控制器
    • 2.5 选择视图模板库
      • 2.5.1 缓存模板
    • 2.6 小结
  • 第 3 章 处理数据
    • 3.1 使用 JDBC 读写数据
      • 3.1.1 为域适配持久化
      • 3.1.2 使用 JdbcTemplate
      • 3.1.3 定义模式并预加载数据
      • 3.1.4 插入数据
    • 3.2 使用 Spring Data JPA 持久化数据
      • 3.2.1 添加 Spring Data JPA 到数据库中
      • 3.2.2 注解域作为实体
      • 3.2.3 声明 JPA repository
      • 3.2.4 自定义 JPA repository
    • 3.3 小结
  • 第 4 章 Spring 安全
    • 4.1 启用 Spring Security
    • 4.2 配置 Spring Security
      • 4.2.1 内存用户存储
      • 4.2.2 基于 JDBC 的用户存储
      • 4.2.3 LDAP 支持的用户存储
      • 4.2.4 自定义用户身份验证
    • 4.3 保护 web 请求
      • 4.3.1 保护请求
      • 4.3.2 创建用户登录页面
      • 4.3.3 登出
      • 4.3.4 阻止跨站请求伪造攻击
    • 4.4 了解你的用户
    • 4.5 小结
  • 第 5 章 使用配置属性
    • 5.1 微调自动配置
      • 5.1.1 理解 Spring 环境抽象
      • 5.1.2 配置数据源
      • 5.1.3 配置嵌入式服务器
      • 5.1.4 配置日志
      • 5.1.5 使用特殊的属性值
    • 5.2 创建自己的配置属性
      • 5.2.1 定义配置属性持有者
      • 5.2.2 声明配置属性元数据
    • 5.3 使用 profile 文件进行配置
      • 5.3.1 定义特定 profile 的属性
      • 5.3.2 激活 profile 文件
      • 5.3.3 有条件地使用 profile 文件创建 bean
    • 5.4 小结
  • 第二部分 集成 Spring
  • 第 6 章 创建 REST 服务
    • 6.1 编写 RESTful 控制器
      • 6.1.1 从服务器获取数据
      • 6.1.2 向服务器发送数据
      • 6.1.3 更新服务器上的资源
      • 6.1.4 从服务器删除数据
    • 6.2 启用超媒体
      • 6.2.1 添加超链接
      • 6.2.2 创建资源装配器
      • 6.2.3 嵌套命名关系
    • 6.3 启用以数据为中心的服务
      • 6.3.1 调整资源路径和关系名称
      • 6.3.2 分页和排序
      • 6.3.3 添加用户端点
      • 6.3.4 向 Spring Data 端点添加用户超链接
    • 6.4 小结
  • 第 7 章 调用 REST 服务
    • 7.1 使用 RestTemplate 调用 REST 端点
      • 7.1.1 请求 GET 资源
      • 7.1.2 请求 PUT 资源
      • 7.1.3 请求 DELETE 资源
      • 7.1.4 请求 POST 资源
    • 7.2 使用 Traverson 引导 REST API
    • 7.3 小结
  • 第 8 章 发送异步消息
    • 8.1 使用 JMS 发送消息
      • 8.1.3 接收 JMS 消息
      • 8.1.2 使用 JmsTemplate 发送消息
      • 8.1.1 设置 JMS
    • 8.2 使用 RabbitMQ 和 AMQP
      • 8.2.1 添加 RabbitMQ 到 Spring 中
      • 8.2.2 使用 RabbitTemplate 发送消息
      • 8.2.3 从 RabbitMQ 接收消息
    • 8.3 使用 Kafka 发送消息
      • 8.3.1 在 Spring 中设置 Kafka
      • 8.3.2 使用 KafkaTemplate 发送消息
      • 8.3.3 编写 Kafka 监听器
    • 8.4 小结
  • 第 9 章 集成 Spring
    • 9.1 声明简单的集成流
      • 9.1.1 使用 XML 定义集成流
      • 9.1.2 在 Java 中配置集成流
      • 9.1.3 使用 Spring Integration 的 DSL 配置
    • 9.2 探索 Spring Integration
      • 9.2.1 消息通道
      • 9.2.2 过滤器
      • 9.2.3 转换器
      • 9.2.4 路由
      • 9.2.5 分割器
      • 9.2.6 服务激活器
      • 9.2.7 网关
      • 9.2.8 通道适配器
      • 9.2.9 端点模块
    • 9.3 创建 Email 集成流
    • 9.4 总结
  • 第三部分 响应式 Spring
  • 第 10 章 Reactor 介绍
    • 10.1 理解响应式编程
      • 10.1.1 定义响应式流
    • 10.2 Reactor
      • 10.2.1 图解响应式流
      • 10.2.2 添加 Reactor 依赖
    • 10.3 通用响应式操作实战
      • 10.3.1 创建响应式类型
      • 10.3.2 响应式类型结合
      • 10.3.3 转换和过滤响应式流
      • 10.3.4 对反应类型执行逻辑操作
    • 10.4 总结
  • 第 11 章 开发响应式 API
    • 11.1 使用 Spring WebFlux
      • 11.1.1 Spring WebFlux 介绍
      • 11.1.2 编写响应式 Controller
    • 11.2 定义函数式请求处理程序
    • 11.3 测试响应式 Controller
      • 11.3.1 测试 GET 请求
      • 11.3.2 测试 POST 请求
      • 11.3.3 使用线上服务器进行测试
    • 11.4 响应式消费 REST API
      • 11.4.1 通过 GET 方式获取资源
      • 11.4.2 通过 POST 方式发送资源
      • 11.4.3 删除资源
      • 11.4.4 处理请求错误
      • 11.4.5 请求转换
    • 11.5 保护响应式 web API
      • 11.5.1 配置响应式 Web 安全
      • 11.5.2 配置响应式用户信息服务
    • 11.6 总结
  • 第 12 章 响应式持久化数据
    • 12.1 理解 Spring Data 响应式历程
      • 12.1.1 Spring Data 响应式精髓
      • 12.1.2 在响应式与非响应式之间进行转换
      • 12.1.3 开发响应式库
    • 12.2 使用响应式 Cassandra 库
      • 12.2.1 开启 Spring Data Cassandra
      • 12.2.2 理解 Cassandra 数据模型
      • 12.2.3 Cassandra 持久化实体映射
      • 12.2.4 编写响应式 Cassandra 库
    • 12.3 编写响应式 MongoDB 库
      • 12.3.1 开启Spring Data MongonDB
      • 12.3.2 MongoDB 持久化实体映射
      • 12.3.3 编写响应式 MongoDB 库
    • 12.4 总结
  • 第四部分 云原生 Spring
  • 第 13 章 服务发现
    • 13.1深入思考微服务
    • 13.2 配置服务注册
      • 13.2.1 配置 Eureka
      • 13.2.2 扩展 Eureka
    • 13.3 注册并发现服务
      • 13.3.1 配置 Eureka 客户端属性
      • 13.3.2 消费服务
    • 13.4 总结
  • 第 14 章 配置管理
    • 14.1 共享配置
    • 14.2 运行配置服务器
      • 14.2.1 启动配置服务器
      • 14.2.2 填写配置库
    • 14.3 消费共享的配置
    • 14.4 服务应用程序和特定配置文件的属性
      • 14.4.1 服务特定应用程序的属性
      • 14.4.2 服务配置文件属性
    • 14.5 为配置的属性加密
      • 14.5.1 在 Git 中加密属性
      • 14.5.2 在 Vault 中存储密码
    • 14.6 远程刷新配置属性
      • 14.6.1 手动刷新配置属性
      • 14.6.2 自动刷新配置属性
    • 14.7 总结
  • 第 15 章 处理失败和时延
    • 15.1 了解断路器
    • 15.2 定义断路器
      • 15.2.1 缓解时延
      • 15.2.2 管理断路器阈值
    • 15.3 管理失败事件
      • 15.3.1 介绍 Hystrix 面板
      • 15.3.2 了解 Hystrix 线程池
    • 15.4 聚合多个 Hystrix 流
    • 15.5 总结
  • 第五部分 部署Spring
  • 第 16 章 使用 SpringBoot Actuator
    • 16.1 介绍 Actuator
      • 16.1.1 配置 Actuator 基本路径
      • 16.1.2 启用和禁用 Actuator 端点
    • 16.2 使用 Actuator 端点
      • 16.2.1 获取重要的应用程序信息
      • 16.2.2 查看配置详细信息
      • 16.2.3 查看应用程序活动
      • 16.2.4 利用运行时指标
    • 16.3 自定义 Actuator
      • 16.3.1 向 /info 端点提供信息
      • 16.3.2 自定义健康指标
      • 16.3.3 注册自定义指标
      • 16.3.4 创建自定义端点
    • 16.4 保护 Actuator
    • 16.5 总结
  • 第 17 章 管理 Spring
    • 17.1 使用 SpringBoot Admin
      • 17.1.1 创建 Admin 服务端
      • 17.1.2 注册 Admin 客户端
    • 17.2 深入 Admin 服务端
      • 17.2.1 查看普通应用程序运行状况和信息
      • 17.2.2 观察关键指标
      • 17.2.3 检查环境属性
      • 17.2.4 查看并设置 log 级别
      • 17.2.5 监控线程
      • 17.2.6 追踪 HTTP 请求
    • 17.3 保护 Admin 服务端
      • 17.3.1 在 Admin 服务端中启用登录
      • 17.3.2 使用 Actuator 进行认证
    • 17.4 总结
  • 第 18 章 使用 JMX 监控 Spring
    • 18.1 使用 Actuator MBean
    • 18.2 创建自己的 MBean
    • 18.3 发送通知
    • 18.4 总结
  • 第 19 章 部署 Spring
    • 19.1 权衡部署选项
    • 19.2 构建并部署 WAR 文件
    • 19.3 将 JAR 文件推送到 Cloud Foundry
    • 19.4 在 Docker 容器中运行 SpringBoot
    • 19.5 终章
    • 19.6 总结
由 GitBook 提供支持
在本页

这有帮助吗?

  1. 第 19 章 部署 Spring

19.2 构建并部署 WAR 文件

在阅读本书的整个过程中,随着您开发 Taco Cloud 应用程序,您已经在 IDE 中或通过命令运行过可执行 JAR 文件。无论是内嵌的 Tomcat 服务器还是 Netty、SpringWebFlux 应用程序,一直都在提供服务。

这在很大程度上要感谢 Spring Boot 的自动配置。您得以不必创建 web.xml 文件或 servlet 初始类,以声明 Spring MVC 的 DispatcherServlet。但是如果您要部署应用程序到 Java 应用服务器,您需要构建一个 WAR 文件。应用服务器需要知道如何运行应用程序,您还需要在 WAR 文件中包含一个 servlet 初始化类,以充当 web.xml 文件的一部分,并声明 DispatcherServlet。

事实证明,将 Spring Boot 应用程序构建成 WAR 文件并不困难。实际上,如果在使用 Initializr 时选择了 WAR 选项,那么你就没什么需要做的了。

Initializr 确保生成的项目将包含 servlet 初始类,且构建产物是 WAR 文件。但是,如果您使用 Initializr 时选择的是 JAR 文件(或者如果您想知道相关的差异是什么),您需要阅读下面的内容。

首先,您需要使用某种方式配置 Spring 的 DispatcherServlet。可以通过 web.xml 文件完成,但 Spring Boot 通过 SpringBootservletInitializer 很容易实现这一点。SpringBootServletilizer 是对 WebApplicationInitializer 接口的一种特殊的 SpringBootAware 实现。除了配置 Spring 的 DispatcherServlet,SpringBootServletInitializer 也寻找 Spring 应用程序上下文中的任何类型为 Filter、Servlet 或 ServletContextInitializer 的类,并将它们实例化到 servlet 容器。

要使用 SpringBootServletilizer,请创建一个子类并重写 configure() 方法指定 Spring 配置类。清单 19.1 显示了 IngredientServiceServletInitializer。 这是您用于配料服务应用程序的 SpringBootServletInitializer 的子类。

程序清单 19.1 通过 Java 启用 Spring Web 应用程序
package tacos.ingredients;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

public class IngredientServiceServletInitializer
        extends SpringBootServletInitializer {
  @Override
  protected SpringApplicationBuilder configure(
                    SpringApplicationBuilder builder) {
    return builder.sources(IngredientServiceApplication.class);
  }
}

如您所见,configure() 方法参数中传入了 SpringApplicationBuilder 对象,并将其作为结果返回。方法中调用 sources() 注册 Spring 配置类。在这种情况下,它注册 IngredientServiceApplication 类,起到两个作用。一是指定启动类(用于可执行 JAR 文件),另一个指定 Spring 配置类。

即使配料服务应用程序还有其他 Spring 配置类,但并不需要使用 sources() 方法全部注册它们。这个 IngredientServiceApplication 类,加了 @SpringBootApplication 注解,隐式启用了组件扫描。组件扫描发现并会找到任何其他配置类。

大多数情况下,SpringBootServletInitializer 的子类就是一个模板式文件。除引用应用程序主配置类之外,完全都一样。对于每个要构建 WAR 文件的应用程序,你几乎永远不会需要对其进行更改。

既然您已经编写了一个 servlet 初始化类,那么您必须对项目构建做一些小的修改。如果您使用 Maven 进行构建,要确保 pom.xml 中的 <packaging> 元素设置为 war,所需的更改如下:

<packaging>war</packaging>

如果使用 Gradle 构建,所做的修改也很简单。在 build.gradle 文件中引入 war 插件:

apply plugin: 'war'

现在,您已经准备好构建应用程序了。对于 Maven,您将使用 Maven 包装器执行打包脚本:

$ mvnw package

如果构建成功,那么可以在目标目录中找到 WAR 文件。另一方面,如果您使用 Gradle 来构建项目,那么您将使用 Gradle 包装器:

$ gradlew build

构建完成后,WAR 文件将位于 build/libs 目录中。然后就是部署应用程序了。部署过程因应用服务器不同而异,因此请参阅应用服务器的相关部署文档。

值得注意的是,尽管您已经构建的是一个适合部署到任何 Servlet 3.0(或更高版本)容器的 WAR 文件,但此 WAR 文件仍然可以在命令行上执行,就像它是一个可执行的 JAR 文件一样:

$ java -jar target/ingredient-service-0.0.19-SNAPSHOT.war

实际上,您可以从一个构建产品中获得两种部署选择!

在应用服务器中部署微服务?

配料服务应用程序旨在成为更大的 Taco Cloud 应用程序的微服务组成部分。但是在这里,我们将配料服务作为独立应用程序部署到应用程序服务器。这有意义吗?

微服务通常类似于任何其他应用程序,应该可以独立部署。尽管这样部署配料服务,对于 Taco Cloud 应用程序的其余服务完全没用处,但并不妨碍能将其部署到 Tomcat 或其他应用程序服务器。当然,不要期望用这样的方式,可以像云端部署那样,自由扩展应用程序。

WAR 文件做为 Java 部署的主要方式有 20 多年了,它是为将应用程序部署到传统 Java 应用程序而设计的。现代的云部署并不需要 WAR 文件,有些甚至根本不支持。当我们进入一个云部署的新时代,JAR 文件是一个更好的选择。

上一页19.1 权衡部署选项下一页19.3 将 JAR 文件推送到 Cloud Foundry

最后更新于3年前

这有帮助吗?