- 内容提要
- 译者序
- 前言
- 第 1 章 欢迎迈入云世界,Spring
- 第 2 章 使用 Spring Boot 构建微服务
- 第 3 章 使用 Spring Cloud 配置服务器控制配置
- 第 4 章 服务发现
- 第 5 章 使用 Spring Cloud 和 Netflix Hystrix 的客户端弹性模式
- 第 6 章 使用 Spring Cloud 和 Zuul 进行服务路由
- 第 7 章 保护微服务
- 第 8 章 使用 Spring Cloud Stream 的事件驱动架构
- 第 9 章 使用 Spring Cloud Sleuth 和 Zipkin 进行分布式跟踪
- 第 10 章 部署微服务
- 附录 A 在桌面运行云服务
- 附录 B OAuth2 授权类型
3.2 构建 Spring Cloud 配置服务器
Spring Cloud 配置服务器是基于 REST 的应用程序,它建立在 Spring Boot 之上。Spring Cloud 配置服务器不是独立服务器,相反,开发人员可以选择将它嵌入现有的 Spring Boot 应用程序中,也可以在嵌入它的服务器中启动新的 Spring Boot 项目。
首先需要做的是建立一个名为 confsvr 的新项目目录。在 confsvr 目录中创建一个新的 Maven 文件,该文件将用于拉取启动 Spring Cloud 配置服务器所需的 JAR 文件。代码清单 3-1 列出的是关键部分,而不是整个 Maven 文件。
代码清单 3-1 为 Spring Cloud 配置服务器创建 pom.xml
<?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>
<groupId>com.thoughtmechanix</groupId>
<artifactId>configurationserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Config Server</name>
<description>Config Server demo project</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.4.RELEASE</version> ⇽--- 将要使用的 Spring Boot 版本
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR5</version> ⇽--- 将要使用的 Spring Cloud 版本
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<start-class>com.thoughtmechanix.confsvr.
→ ConfigServerApplication </start-class> ⇽--- 配置服务器将要使用的引导类
<java.version>1.8</java.version>
<docker.image.name>johncarnell/tmx-confsvr</docker.image.name>
<docker.image.tag>chapter3</docker.image.tag>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId> ⇽--- 在这个特定服务中将要使用的 Spring Cloud 项目
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId> ⇽---在这个特定服务中将要使用的 Spring Cloud 项目
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
<!-- 未显示 Docker 构建配置 -->
</project>
在代码清单 3-1 所示的 Maven 文件中,首先声明了要用于微服务的 Spring Boot 版本(1.4.4 版本)。下一个重要的 Maven 定义部分是将要使用的 Spring Cloud Config 父物料清单(Bill of Materials,BOM)。Spring Cloud 是一个大量独立项目的集合,这些项目全部遵循自身的发行版本而更新。此父 BOM 包含云项目中使用的所有第三方库和依赖项以及构成该版本的各个项目的版本号。在这个例子中,我们使用 Spring Cloud 的 Camden.SR5
版本。通过使用 BOM 定义,可以保证在 Spring Cloud 中使用子项目的兼容版本。这也意味着不必为子依赖项声明版本号。代码清单 3-1 的剩余部分负责声明将在服务中使用的特定 Spring Cloud 依赖项。第一个依赖项是所有 Spring Cloud 项目使用的 spring-cloud-starter-config
。第二个依赖项是 spring- cloud-config-server
起步项目,它包含了 spring-cloud-config-server 的核心库。
来吧,坐上发行版系列的列车
Spring Cloud 使用非传统机制来标记 Maven 项目。Spring Cloud 是独立子项目的集合。Spring Cloud 团队通过其称为“发行版系列”(release train)的方式进行版本发布。组成 Spring Cloud 的所有子项目都包含在一个 Maven 物料清单(BOM)中,并作为一个整体进行发布。Spring Cloud 团队一直使用伦敦地铁站的名称作为他们发行版本的名称,每个递增的主要版本都按字母表从小到大的顺序赋予一个伦敦地铁站的站名。目前已有 3 个版本,即 Angel、Brixton 和 Camden。Camden 是迄今为止最新的发行版,但是它的子项目中仍然有多个候选版本分支。
需要注意的是,Spring Boot 是独立于 Spring Cloud 发行版系列发布的。因此,Spring Boot 的不同版本可能与 Spring Cloud 的不同版本不兼容。参考 Spring Cloud 网站,可以看到 Spring Boot 和 Spring Cloud 之间的版本依赖项,以及发行版系列中包含的不同子项目版本。
我们仍然需要再多创建一个文件来让核心配置服务器正常运行。这个文件是位于 confsvr/src/ main/resources 目录中的 application.yml 文件。application.yml 文件告诉 Spring Cloud 配置服务要侦听哪个端口以及在哪里可以找到提供配置数据的后端。
我们马上就能启动 Spring Cloud 配置服务了。现在,需要将服务器指向保存配置数据的后端存储库。对于本章,读者将要使用第 2 章中开始构建的许可证服务作为使用 Spring Cloud Config 的示例。简单起见,我们将为以下 3 个环境创建配置数据:在本地运行服务时的默认环境、开发环境以及生产环境。
在 Spring Cloud 配置中,一切都是按照层次结构进行的。应用程序配置由应用程序的名称表示。我们为需要拥有配置信息的每个环境提供一个属性文件。在这些环境中,我们将创建两个配置属性:
- 由许可证服务直接使用的示例属性;
- 用于存储许可证服务数据的 Postgres 数据库的配置。
图 3-3 阐述了如何创建和使用 Spring Cloud 配置服务。需要注意的是,在构建配置服务时,它将成为在环境中运行的另一个微服务。一旦建立配置服务,服务的内容就可以通过基于 HTTP 的 REST 端点进行访问。
图 3-3 Spring Cloud 配置将环境特定的属性公开为基于 HTTP 的端点
应用程序配置文件的命名约定是“ 应用程序名称 - 环境名称 .yml”。从图 3-3 可以看出,环境名称直接转换为可以浏览配置信息的 URL。随后,启动许可证微服务示例时,要运行哪个服务环境是由在命令行服务启动时传入的 Spring Boot 的 profile 指定的。如果在命令行上没有传入 profile,Spring Boot 将始终默认加载随应用程序打包的 application.yml 文件中的配置数据。
以下是为许可证服务提供的一些应用程序配置数据的示例。这些数据包含在 confsvr/src/ main/resources/config/licensingservice/licensingservice.yml 文件中,图 3-3 引用了这些数据。下面是此文件的一部分内容:
tracer.property: "I AM THE DEFAULT"
spring.jpa.database: "POSTGRESQL"
spring.datasource.platform: "postgres"
spring.jpa.show-sql: "true"
spring.database.driverClassName: "org.postgresql.Driver"
spring.datasource.url: "jdbc:postgresql://database:5432/eagle_eye_local"
spring.datasource.username: "postgres"
spring.datasource.password: "p0stgr@s"
spring.datasource.testWhileIdle: "true"
spring.datasource.validationQuery: "SELECT 1"
spring.jpa.properties.hibernate.dialect:
→ "org.hibernate.dialect.PostgreSQLDialect"
在实施前想一想
我建议不要在中大型云应用中使用基于文件系统的解决方案。使用文件系统方法,意味着要为想要访问应用程序配置数据的所有云配置服务器实现共享文件挂载点。在云中创建共享文件系统服务器是可行的,但它将维护此环境的责任放在开发人员身上。
我将展示如何以文件系统作为入门使用 Spring Cloud 配置服务器的最简单示例。在后面的几节中,我将介绍如何配置 Spring Cloud 配置服务器以使用基于云的 Git 供应商(如 Bitbucket 或 GitHub)来存储应用程序配置。
3.2.1 创建 Spring Cloud Config 引导类
本书涵盖的每一个 Spring Cloud 服务都需要一个用于启动该服务的引导类。这个引导类包含两样东西:作为服务启动入口点的 Java main()
方法,以及一组告诉启动的服务将要启动哪种类型的 Spring Cloud 行为的 Spring Cloud 注解。
代码清单 3-2 展示了用作配置服务的引导类 Application
(在 confsvr/src/main/java/com/ thoughtmechanix/confsvr/Application.java 中)。
代码清单 3-2 Spring Cloud Config 服务器的引导类
package com.thoughtmechanix.confsvr;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication ⇽--- Spring Cloud Config 服务是 Spring Boot 应用程序,因此需要用 @SpringBoot Application 进行标记
@EnableConfigServer ⇽--- @EnableConfigServer 使服务成为 Spring Cloud Config 服务
public class ConfigServerApplication {
public static void main(String[] args) { ⇽--- main 方法启动服务并启动 Spring 容器
SpringApplication.run(ConfigServerApplication.class, args);
}
}
接下来,我们将使用最简单的文件系统示例来搭建 Spring Cloud 配置服务器。
3.2.2 使用带有文件系统的 Spring Cloud 配置服务器
Spring Cloud 配置服务器使用 confsvr/src/main/resources/application.yml 文件中的条目指向要保存应用程序配置数据的存储库。创建基于文件系统的存储库是实现这一目标的最简单方法。
为此,要将以下信息添加到配置服务器的 application.yml 文件中。代码清单 3-3 展示 Spring Cloud 配置服务器的 application.yml 文件的内容。
代码清单 3-3 Spring Cloud 配置的 application.yml 文件
server:
port: 8888 ⇽--- Spring Cloud 配置服务器将要监听的端口
spring:
profiles:
active: native ⇽--- 用于存储配置的后端存储库(文件系统)
cloud:
config:
server:
native:
searchLocations: file:///Users/johncarnell1/book/spmia-code
/chapter3-code/confsvr/src/main/resources/config/
licensingservice ⇽--- 配置文件存储位置的路径
在代码清单 3-3 所示的配置文件中,首先告诉配置服务器,对于所有配置信息的请求,应该监听哪个端口号:
server:
port: 8888
因为我们正在使用文件系统来存储应用程序配置信息,所以需要告诉 Spring Cloud 配置服务器以“native”profile 运行:
profiles:
active: native
application.yml 文件的最后一部分为 Spring Cloud 配置提供了应用程序数据所在的文件目录:
server:
native:
searchLocations: file:///Users/johncarnell1/book/spmia_code
/chapter3-code/confsvr/src/main/resources/config/licensingservice
配置条目中的重要参数是 searchLocations
属性。这个属性为每一个应用程序提供了用逗号分隔的文件夹列表,这些文件夹含有由配置服务器管理的属性。在上一个示例中,只配置了许可证服务。
注意
如果使用 Spring Cloud Config 的本地文件系统版本,那么在本地运行代码时,需要修改
spring.cloud.config.server.native.searchLocations
属性以反映本地文件路径。
我们现在已经完成了足够多的工作来启动配置服务器。接下来,我们就使用 mvn spring-boot:run
命令启动配置服务器。服务器现在应该在命令行上出现一个 Spring Boot 启动画面。如果用浏览器访问 http://localhost:8888/licensingservice/default,那么将会看到 JSON 净荷与 licensingservice.yml 文件中包含的所有属性一起返回。图 3-4 展示了调用此端点的结果。
图 3-4 检索许可证服务的默认配置信息
如果读者想要查看基于开发环境的许可证服务的配置信息,可以对 http://localhost: 8888/licensingservice/dev
端点发起 GET 请求。图 3-5 展示了调用此端点的结果。
图 3-5 使用开发环境 profile 检索许可证服务的配置信息
如果仔细观察,读者会看到在访问开发环境端点时,将返回许可证服务的默认配置属性以及开发环境下的许可证服务配置。Spring Cloud 配置返回两组配置信息的原因是,Spring 框架实现了一种用于解析属性的层次结构机制。当 Spring 框架执行属性解析时,它将始终先查找默认属性中的属性,然后用特定环境的值(如果存在)去覆盖默认属性。
具体来说,如果在 licensingservice.yml 文件中定义一个属性,并且不在任何其他环境配置文件(如 licensingservice-dev.yml)中定义它,则 Spring 框架将使用这个默认值。
注意
这不是直接调用 Spring Cloud 配置 REST 端点所看到的行为。REST 端点将返回调用的默认值和环境特定值的所有配置值。
让我们看看如何将 Spring Cloud 配置服务器挂钩到许可证微服务。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论