Spring Cloud 配置服务器与 Git 集成

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(342)   2023-06-26 07:54:18

微服务方法现在已经成为任何新 API 开发的行业标准,几乎所有组织都在推广它。 Spring Cloud 提供了优秀的工具来在 Spring Boot 框架之上构建这些微服务。

在本spring cloud 配置 教程中,我们将讨论一个名为Config Server 的特定微服务功能。配置服务器是存储和维护所有微服务的所有可配置参数的地方。

它更像是将项目代码库中的属性/资源文件完全外部化到外部服务,这样对任何给定属性的任何更改都不需要重新部署使用该属性的服务。所有此类属性更改都将在不重新部署微服务的情况下反映出来。

一、为什么要使用Spring Cloud Config Server

config server 的想法来自 12-factor app 宣言,该宣言与开发现代应用程序的最佳实践指南相关云原生应用程序。它建议将属性或资源文件从服务器外部化,其中这些资源的值在运行时会发生变化——通常不同的配置会在每个环境中发生变化。

例如,假设一项服务依赖于另一项服务(为特定业务场景调用),并且如果该依赖服务 URL 更改为其他内容。然后通常我们需要使用更新后的 URL 来构建和部署我们的服务。现在,如果我们采用 12 因素应用程序方法,并且如果我们从外部服务读取这些配置属性,那么我们只需要更新配置服务器中的 URL 并刷新该客户端服务配置以使用更新后的 URL。

因此,这个想法是显而易见且有效的。现在让我们看看如何创建 spring cloud 配置服务器

2. 技术栈

我们将使用现成且非常流行的基于 spring-boot 的 spring-cloud API。它在 spring 框架命名法中称为 Config Server。此外,我们将使用 git 配置来托管属性文件。

所以最后,我们这个演示的技术栈将是:

  1. Java 1.8
  2. Eclipse IDE
  3. 春云
  4. spring boot
  5. 春假
  6. GitHub 作为资源库
  7. Maven
  8. REST 客户端

首先,我们将使用 spring boot 开发两个微服务。

  1. 一个是配置服务器服务,提供运行时的配置
  2. 一个是配置客户端服务,使用作为配置服务器公开的配置。

3.Config服务器配置

让我们首先按照给定的步骤构建配置服务器部分:

  1. 生成项目结构

    spring boot initializer portal开始,这是一个很好的起点创建任何基于 spring boot 的应用程序。这里我们将只选择Config server starter pom。屏幕截图是这样的。有了这个配置,一旦我们生成项目,将下载一个zip文件,解压后我们将其导入到eclipse中。

    Generate Server Project with Config Server Starter POM

    使用 Config Server Starter POM 生成服务器项目

  2. 在 Eclipse 中导入项目

    从 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
       
    <范围>测试
    
    
    
  3. 在 eclipse 中构建

    下一步将是从命令提示符或从 eclipse 中运行 mvn clean install,无论您喜欢什么。在此步骤中,将从 Maven 存储库下载所有必需的依赖项。确保您正在从任何没有下载限制的网络上尝试。 非常需要在此步骤中成功构建才能继续下一步。

  4. 添加@EnableConfigServer注解

    现在打开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);
    }
    }
    
    
  5. git 存储库中的客户端属性

    下一个重要步骤是创建本地 git 存储库。稍后可以通过在属性文件中配置其 URL 轻松将其转换为远程存储库。我们将放置外部属性文件[configuration],Config server 微服务将使用它来提供属性的外部配置。我们需要按照以下步骤创建本地 git 存储库并签入示例属性文件。

    1. 确保你的机器上安装了 git shell 并且你可以从命令提示符运行 git bash。要验证它打开命令提示符并键入 git,如果它识别该命令,那么您可能已经安装了 git 提示符,如果没有请按照 git 网站,按照说明下载和安装。
    2. 现在在您的桌面上创建目录config-server-repo
    3. 然后在 config-server-repo 目录中创建一个 config-server-client.properties 文件并在其中添加消息 msg = Hello world - this is from config server.
    4. 然后在 config-server-repo 目录中创建另一个文件 config-server-client-development.properties 文件并在其中添加消息 msg = Hello world - this is from config server – 开发环境。
    5. 然后在 config-server-repo 目录中创建另一个文件 config-server-client-production.properties 文件并在其中添加消息 msg = Hello world - this is from config server – 生产环境。
    6. 这里我们为不同的环境维护相同的属性名称,因为我们通常为不同的环境维护属性,如 url、凭据、数据库详细信息等。这里最重要的一点是我们需要在环境名称后附加连字符 (-)在每个属性中,以便配置服务器理解它。此外,我们需要使用我们将在这之后创建的配置客户端服务名称来命名属性文件。
    7. 现在从 config-server-repo 目录打开命令提示符并运行命令 git init 将该目录作为 git 存储库。
    8. 现在运行 git add . 将所有内容添加到此 repo。
    9. 最后,我们需要通过运行命令 git commit –m "initial checkin" 来提交属性文件。这应该检查 git 存储库中的所有文件。这是相同的命令提示符屏幕截图。 Git 中的属性签入

      Git 中的属性登记

      
      msg = Hello world - 这是来自配置服务器 - 默认配置文件
      
      
      msg = Hello world - 这是来自配置服务器 - 开发环境
      
      
      msg = Hello world - 这是来自配置服务器 - 生产环境
      
      
      $ 初始化
      
      $ 混帐添加。
      
      $ git commit -m "初始提交"
      
  6. 从配置服务器指向 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 存储库中。一旦我们准备好客户端部分,我们将启动配置服务器服务,我们将最终测试该功能。

  7. 验证配置

    以嵌入式模式运行服务的命令是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"

4.Config客户端配置

现在我们将继续进行客户端实现,我们将在其中使用来自单独微服务的这些属性,这是我们的最终目标——将配置外部化到不同的服务。

  1. 创建 Maven 项目

    转到 https://start.spring.io/ 网页门户并使用以下选定的工件生成客户端项目:

    1. 执行器
    2. 配置客户端
    3. 网络
    4. 休息存储库

    生成前的画面如下图所示;单击生成后,我们将获得 .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
       
    <范围>测试
    
    
    
    使用列出的依赖项生成客户端项目

    生成具有列出的依赖项的客户端项目

  2. 创建 REST 资源

    添加一个 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() {
    返回此消息;
    }
    }
    
  3. 与配置服务器绑定

    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。这是对于开发设置,应在生产环境中启用安全性。
  4. Verify Client Config

    这是我们非常需要在配置客户端做的,而不是在这个项目上做最后的 mvn clean install 命令,这样一切都被正确编译并打包在目标文件夹以及本地 Maven 存储库中。我们将与服务器端一起启动配置客户端服务,并最终测试该功能。

5.演示

让我们测试配置服务器应用程序。

  • 构建并运行配置服务器项目

    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 服务。

  • 测试 REST 端点

    现在在浏览器中通过浏览 url http://localhost:8080/msg< 打开 /msg rest 端点/代码>。它应该返回 Hello world - this is from config server,它在 config-server-client-development.properties 文件中提到。

    测试 REST 端点

    测试 REST 端点

  • 测试属性更改

    现在我们将进行属性更改并测试这是否可以在不重新启动任何微服务的情况下反映在配置客户端服务中。 做一些更改,在config-server-client-development.properties 中的 msg 属性的值并在本地 git 中签入,然后点击 http:// localhost:8080/msg 再次在浏览器中,您只会得到旧值。

    为了反映新值,我们需要通过点击 刷新配置 code>http://localhost:8080/refresh 端点使用来自任何 REST 客户端的 POST 方法。

    一旦你有成功刷新配置客户端服务,新值应反映在服务响应中。这是因为 @RefreshScope 注释我们公开的 Rest Controller。

6. 遇到任何错误时要检查的事项

  • Property 文件名和Client 模块服务名spring.application.name=config-server-client 应该完全一致,否则将检测不到properties。实际上,Config Server 在属性文件名的端点公开属性,如果您浏览 URL http://localhost:8888/config-server-client/development 它将返回所有开发环境值. 所有开发属性视图

    所有开发属性视图

  • 确保您已使用上述 git init/add/commit 命令在 git 存储库中签入属性文件。
  • 确保您已通过任何 REST 客户端调用 http://localhost:8080/refreshPOST 方法刷新了客户端服务环境。否则更改的值将不会反映在客户端服务中。
  • 确保在启动配置客户端服务时,配置服务器服务已经在运行。否则,注册可能需要一些时间,这可能会在测试时造成混乱。

这就是为微服务创建配置服务器的全部内容。如果您在配置本文中提到的所有点时遇到任何困难,请添加评论,我们很乐意调查问题。

地址:https://www.cundage.com/article/spring-cloud-config-server-git.html

相关阅读

微服务方法现在已经成为任何新 API 开发的行业标准,几乎所有组织都在推广它。 Spring Cloud 提供了优秀的工具来在 Spring Boot 框架之上构建这些微服务。 在本spring...
我们最近有一位客户对使用 Spring Cloud Contract (SCC) 的想法非常感兴趣,以防止微服务团队之间的 API“漂移”,在微服务团队中,各个开发团队负责管理组成部分的各个 A...
问题 在上一篇文章Spring Cloud Config Server简介(http://sivalabs.in/2017/08/spring-cloud-tutorials-introduct...
Spring Cloud解决了分布式系统的常见问题。然而,对于那些只使用广为人知的单体应用程序的人来说,跳入为分布式服务设计的一长串模式可能在一开始就让人不知所措。本文将通过实用的方法带您了解 ...
学习利用名为 Hystrix 的 Spring cloud Netflix 堆栈组件之一在调用底层 微服务断路器跨度&gtl;。通常需要在某些底层服务永久关闭/抛出错误的应用程序中启用容错,我们...
Spring Boot 和 Spring Cloud 在交付基于微服务的应用程序时被广泛使用。最终,基于在不同主机上运行的 Spring boot 应用程序监控微服务 已成为一种必需。有许多工具...
一、概述 在本教程中,我们将回顾 Spring Cloud Config Server 的基础知识。我们将设置一个配置服务器,然后构建一个客户端应用程序
一、概述 在本教程中,我们将回顾 Spring Cloud Config Server 的基础知识。我们将设置一个配置服务器,然后构建一个客户端应用程序
学习使用 Netflix Zuul 及其与 Spring Cloud 的紧密结合来创建负载均衡器。这里我们将主要关注API网关模式及其使用。我们将构建一个netflix zuul example...
问题 SpringBoot 在通过属性或 YAML 文件外部化配置属性方面提供了很大的灵活性。我们还可以使用配置文件特定的配置文件(例如 application.properties、appli...