微服务方法现在已经成为任何新 API 开发的行业标准,几乎所有组织都在推广它。 Spring Cloud 提供了优秀的工具来在 Spring Boot 框架之上构建这些微服务。
在本spring cloud 配置 教程中,我们将讨论一个名为Config Server 的特定微服务功能。配置服务器是存储和维护所有微服务的所有可配置参数的地方。
它更像是将项目代码库中的属性/资源文件完全外部化到外部服务,这样对任何给定属性的任何更改都不需要重新部署使用该属性的服务。所有此类属性更改都将在不重新部署微服务的情况下反映出来。
config server 的想法来自 12-factor app 宣言,该宣言与开发现代应用程序的最佳实践指南相关云原生应用程序。它建议将属性或资源文件从服务器外部化,其中这些资源的值在运行时会发生变化——通常不同的配置会在每个环境中发生变化。
例如,假设一项服务依赖于另一项服务(为特定业务场景调用),并且如果该依赖服务 URL 更改为其他内容。然后通常我们需要使用更新后的 URL 来构建和部署我们的服务。现在,如果我们采用 12 因素应用程序方法,并且如果我们从外部服务读取这些配置属性,那么我们只需要更新配置服务器中的 URL 并刷新该客户端服务配置以使用更新后的 URL。
因此,这个想法是显而易见且有效的。现在让我们看看如何创建 spring cloud 配置服务器。
我们将使用现成且非常流行的基于 spring-boot 的 spring-cloud API。它在 spring 框架命名法中称为 Config Server。此外,我们将使用 git 配置来托管属性文件。
所以最后,我们这个演示的技术栈将是:
首先,我们将使用 spring boot 开发两个微服务。
让我们首先按照给定的步骤构建配置服务器部分:
从spring boot initializer portal开始,这是一个很好的起点创建任何基于 spring boot 的应用程序。这里我们将只选择Config server starter pom。屏幕截图是这样的。有了这个配置,一旦我们生成项目,将下载一个zip文件,解压后我们将其导入到eclipse中。
使用 Config Server Starter POM 生成服务器项目
从 spring initializer portal 获得 zip 文件后,我们需要将其解压缩到我们选择的目录,并将其作为 maven 项目导入到 eclipse 中。
<属性> UTF-8 UTF-8 1.8 Hoxton.RELEASE <依赖管理> <依赖关系> <依赖关系> org.springframework.cloud spring-cloud-dependencies <版本>${spring-cloud.version} pom <范围>导入 <依赖关系> <依赖关系> org.springframework.cloud spring-cloud-config-server <依赖关系> org.springframework.boot spring-boot-starter-actuator <依赖关系> org.springframework.boot spring-boot-starter-test <范围>测试
下一步将是从命令提示符或从 eclipse 中运行 mvn clean install
,无论您喜欢什么。在此步骤中,将从 Maven 存储库下载所有必需的依赖项。确保您正在从任何没有下载限制的网络上尝试。 非常需要在此步骤中成功构建才能继续下一步。
现在打开spring已经提供的SpringApplication类,添加@EnableConfigServer
类前注解,再次构建工程。有了这个注解,这个工件将像一个 spring 配置服务器。
添加这个注解后,类将如下所示 - 类名可能会有所不同,具体取决于您在生成时提供的项目名称。您也可以手动将类名更改为您喜欢的名称。
包 com.howtodoinjava.example.springconfigserver; 导入 org.springframework.boot.SpringApplication; 导入 org.springframework.boot.autoconfigure.SpringBootApplication; 导入 org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication 公共类 SpringConfigServerApplication { public static void main(String[] args) { SpringApplication.run(SpringConfigServerApplication.class, args); } }
下一个重要步骤是创建本地 git 存储库。稍后可以通过在属性文件中配置其 URL 轻松将其转换为远程存储库。我们将放置外部属性文件[configuration],Config server 微服务将使用它来提供属性的外部配置。我们需要按照以下步骤创建本地 git 存储库并签入示例属性文件。
git
,如果它识别该命令,那么您可能已经安装了 git 提示符,如果没有请按照 git 网站,按照说明下载和安装。config-server-client.properties
文件并在其中添加消息 msg = Hello world - this is from config server.
然后在 config-server-repo 目录中创建另一个文件 config-server-client-development.properties
文件并在其中添加消息 msg = Hello world - this is from config server – 开发环境。
然后在 config-server-repo 目录中创建另一个文件 config-server-client-production.properties
文件并在其中添加消息 msg = Hello world - this is from config server – 生产环境。
这里我们为不同的环境维护相同的属性名称,因为我们通常为不同的环境维护属性,如 url、凭据、数据库详细信息等。这里最重要的一点是我们需要在环境名称后附加连字符 (-)在每个属性中,以便配置服务器理解它。此外,我们需要使用我们将在这之后创建的配置客户端服务名称来命名属性文件。
现在从 config-server-repo 目录打开命令提示符并运行命令 git init
将该目录作为 git 存储库。
现在运行 git add .
将所有内容添加到此 repo。
最后,我们需要通过运行命令 git commit –m "initial checkin"
来提交属性文件。这应该检查 git 存储库中的所有文件。这是相同的命令提示符屏幕截图。
Git 中的属性登记
msg = Hello world - 这是来自配置服务器 - 默认配置文件
msg = Hello world - 这是来自配置服务器 - 开发环境
msg = Hello world - 这是来自配置服务器 - 生产环境
$ 初始化
$ 混帐添加。
$ git commit -m "初始提交"
从配置服务器指向 Git 存储库
在
src\main\resources
目录中创建一个名为 bootstrap.properties
的文件spring-config-sever
项目并添加以下行。
#服务器端口
服务器.port = 8888
#Git 仓库位置
spring.cloud.config.server.git.uri=E:\\devsetup\\gitworkspace\\spring-cloud\\config-git-repo
#验证服务启动中的任何存储库问题
spring.cloud.config.server.git.cloneOnStart=true
#禁用管理端点的安全性
管理.security.enabled=false
现在让我们了解这些属性。
server.port
定义嵌入式服务器启动的端口。
spring.cloud.config.server.git.uri
将绑定 git 位置以查找配置。这里我们使用本地 git 存储库,但只需更改此位置即可切换到远程获取位置。
management.security.enabled=false
将在 /env、/refresh 等管理点上禁用 spring 安全。这是用于开发设置,在生产中应该启用安全。
因此,这一步将指向一个 git 位置和服务器端口。
以上所有步骤都是我们需要在配置服务器端完成的,现在做最后一个 <在此项目上执行 code>mvn clean install
命令,以便所有内容都得到正确编译,并打包到目标文件夹以及本地 maven 存储库中。一旦我们准备好客户端部分,我们将启动配置服务器服务,我们将最终测试该功能。
以嵌入式模式运行服务的命令是java -jar target\spring-config-server-0.0.1-SNAPSHOT.jar
然而,我们将在测试部分重新讨论这一点。
要检查配置服务器是否可以识别属性,首先使用项目代码的命令提示符中的给定命令从命令提示符运行配置服务器微服务基本位置。
java -jar target\spring-config-server-0.0.1-SNAPSHOT.jar
现在打开浏览器并检查以下 URL,它将返回 JSON
输出,在 propertySources
部分我们可以看到我们在属性中添加的所有属性。这可确保配置服务器成功运行,它已识别 git 位置,并为不同环境提供配置服务。
http://localhost:8888/client-config/development
http://localhost:8888/client-config/production
还要检查属性文件中的任何更改是否在不重新启动的情况下被服务器反映出来——更改任何环境属性的值并签入属性文件。然后运行该特定环境的端点,并验证更改后的属性值应立即反映出来,而无需重新启动服务器。
要进行 git 签入,在进行更改并通过任何文本编辑器保存文件后,运行命令 git add .
和 git commit -m "test"
现在我们将继续进行客户端实现,我们将在其中使用来自单独微服务的这些属性,这是我们的最终目标——将配置外部化到不同的服务。
转到 https://start.spring.io/ 网页门户并使用以下选定的工件生成客户端项目:
生成前的画面如下图所示;单击生成后,我们将获得 .zip
文件下载选项。和Spring-Config-Server一样,将文件解压到某个目录下,然后在eclipse中导入。
<属性> UTF-8 UTF-8 1.8 Hoxton.RELEASE <依赖管理> <依赖关系> <依赖关系> org.springframework.cloud spring-cloud-dependencies <版本>${spring-cloud.version} pom <范围>导入 <依赖关系> <依赖关系> org.springframework.boot spring-boot-starter-actuator <依赖关系> org.springframework.cloud spring-cloud-starter-config <依赖关系> org.springframework.boot spring-boot-starter-data-rest <依赖关系> org.springframework.boot spring-boot-starter-web <依赖关系> org.springframework.boot spring-boot-starter-test <范围>测试
生成具有列出的依赖项的客户端项目
添加一个 RestController
查看响应中的服务器端属性值。为此,请打开 @SpringBootApplication
类文件,并在该文件末尾添加以下小类。这非常简单直接,我们只是在 /message
URL 中公开一个方法,我们将在其中返回 msg
的属性值,该值将由配置服务器提供微服务,配置到本地git仓库(在生产中会迁移到远程git仓库!)。
包com.howtodoinjava.example.springconfigclient; 导入 org.springframework.beans.factory.annotation.Autowired; 导入 org.springframework.beans.factory.annotation.Value; 导入 org.springframework.boot.SpringApplication; 导入 org.springframework.boot.autoconfigure.SpringBootApplication; 导入 org.springframework.cloud.context.config.annotation.RefreshScope; 导入 org.springframework.core.env.Environment; 导入 org.springframework.web.bind.annotation.GetMapping; 导入 org.springframework.web.bind.annotation.RestController; @SpringBootApplication 公共类 SpringConfigClientApplication { public static void main(String[] args) { SpringApplication.run(SpringConfigClientApplication.class, args); } @Autowired public void setEnv(环境e) { System.out.println(e.getProperty("msg")); } } @刷新范围 @RestController 类 MessageRestController { @Value("${msg:Config 服务器不工作。请检查...}") 私有字符串消息; @GetMapping("/消息") 公共字符串 getMsg() { 返回此消息; } }
在src\main\resources
目录下创建一个名为bootstrap.properties
的文件并添加下面的属性连接配置服务器以及一些必需的配置。
spring.application.name=客户端配置 #Active Profile - 将与服务器中的开发属性文件相关。 #If this property is absent then, default profile will be activated 这是 #最后没有任何环境名称的属性文件。 spring.profiles.active=开发 # 注意这是默认值: spring.cloud.config.uri=http://localhost:8888 管理.security.enabled=false
现在让我们了解这些属性。
spring.application.name
只是将要部署的微服务的应用程序名称。spring.cloud.config.uri
是提及配置服务器 url 的属性。需要注意的是,我们的配置服务器在端口 8888
上运行;通过打开 spring 配置服务器代码库的 application.properties
文件并检查 server.port=8888
来验证它。management.security.enabled=false
将在 /env
、/refresh
等管理端点上禁用 spring security。这是对于开发设置,应在生产环境中启用安全性。这是我们非常需要在配置客户端做的,而不是在这个项目上做最后的 mvn clean install
命令,这样一切都被正确编译并打包在目标文件夹以及本地 Maven 存储库中。我们将与服务器端一起启动配置客户端服务,并最终测试该功能。
让我们测试配置服务器应用程序。
从spring-config-server 文件夹打开命令提示符并运行mvn clean install
命令。构建完成后,通过 java -jar
命令从该命令提示符本身运行应用程序,例如 java -jar target\spring-config-server-0.0.1-SNAPSHOT.jar
.
这将在本地主机的 8888 端口启动配置服务器服务。
同样,从spring-config-client 文件夹打开命令提示符并运行mvn clean install
命令。构建完成后,通过 java -jar
命令从命令提示符本身运行应用程序,例如 java -jar target\spring-config-client-0.0.1-SNAPSHOT.jar
.
这将在本地主机的 8080 端口启动 Config Client 服务。
现在在浏览器中通过浏览 url http://localhost:8080/msg< 打开
/msg
rest 端点/代码>。它应该返回 Hello world - this is from config server
,它在 config-server-client-development.properties
文件中提到。
测试 REST 端点
测试属性更改
现在我们将进行属性更改并测试这是否可以在不重新启动任何微服务的情况下反映在配置客户端服务中。 做一些更改,在
config-server-client-development.properties
中的 msg
属性的值并在本地 git 中签入,然后点击 http:// localhost:8080/msg
再次在浏览器中,您只会得到旧值。
为了反映新值,我们需要通过点击 刷新配置 code>http://localhost:8080/refresh
端点使用来自任何 REST
客户端的 POST
方法。
一旦你有成功刷新配置客户端服务,新值应反映在服务响应中。这是因为 @RefreshScope
注释我们公开的 Rest Controller。
spring.application.name=config-server-client
应该完全一致,否则将检测不到properties。实际上,Config Server 在属性文件名的端点公开属性,如果您浏览 URL http://localhost:8888/config-server-client/development
它将返回所有开发环境值. 所有开发属性视图
git init/add/commit
命令在 git 存储库中签入属性文件。http://localhost:8080/refresh
的 POST
方法刷新了客户端服务环境。否则更改的值将不会反映在客户端服务中。这就是为微服务创建配置服务器的全部内容。如果您在配置本文中提到的所有点时遇到任何困难,请添加评论,我们很乐意调查问题。
地址:https://www.cundage.com/article/spring-cloud-config-server-git.html