具有Git集成的Spring Cloud Config Server

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

在本Spring Cloud 配置教程中,我们将讨论称为Config Server的特定微服务功能。配置服务器是存储和维护所有微服务的所有可配置参数的位置。

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

目录

1.为什么要使用配置服务器
2.技术堆栈
3.配置服务器配置
4.配置客户端配置
5.演示
6.检查是否遇到任何错误的事物

1.为什么要使用Spring Cloud Config Server

配置服务器的想法来自与开发现代云原生应用程序的最佳实践准则有关的12要素应用程序宣言。它建议将属性或资源文件从服务器外部进行外部化,这些资源或资源文件在运行时这些资源的值会发生变化-通常情况下,不同的配置会在每个环境中有所不同。

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

因此,该想法是显而易见且有效的。现在让我们看看如何创建spring cloud config server

2.技术栈

我们将使用基于spring-boot的spring-cloud API,该API随时可用且非常受欢迎。在Spring框架命名中,它称为Config Server。另外,我们将使用git配置来托管属性文件。

因此,最后,我们用于此演示的技术堆栈将是:

  1. Java 1.8
  2. Eclipse IDE
  3. Spring Cloud
  4. Spring Boot
  5. Spring休息
  6. GitHub作为资源库
  7. 马文
  8. REST客户端

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

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

3.配置服务器配置

首先,使用给定的步骤构建配置服务器部分:

  1. 生成项目结构

    Spring Boot初始化程序门户开始,这是创建任何基于Spring Boot的应用程序的一个很好的起点。在这里,我们将仅选择Config服务器Starterpom。屏幕截图是这样的。使用此配置,一旦生成项目,便会下载一个zip文件,解压缩后将其导入eclipse中。

    使用Config Server Starter POM生成服务器项目
    使用Config Server Starter POM生成服务器项目
  2. 在Eclipse中导入项目

    从spring初始化器门户获得zip文件后,我们需要将其解压缩到我们选择的目录中,然后将其导入作为Eclipse作为Maven项目。

    pom.xml
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  3. 建立日食

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

  4. 添加@EnableConfigServer注解

    现在,打开spring已经提供的Spring Application类,并@EnableConfigServer在类之前添加注解,然后再次构建项目。有了此注解,此工件将充当spring config服务器。

    添加此注解后,类将如下所示–根据您在生成时提供的项目名称,类名称可以不同。您也可以手动将类名称更改为您喜欢的名称。

    SpringConfigServerApplication.java
    package com.how2codex.example.springconfigserver;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer;
    @EnableConfigServer
    @SpringBootApplication
    public class SpringConfigServerApplication
    {
        public static void main(String[] args)
        {
            SpringApplication.run(SpringConfigServerApplication.class, args);
        }
    }
  5. git存储库中的客户端属性

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

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

    bootstrap.properties在项目src\main\resources目录中创建一个名为的文件,spring-config-sever并添加以下行。

    bootstrap.properties
    #Server port
    server.port = 8888
    #Git repo location
    spring.cloud.config.server.git.uri=E:\\devsetup\\gitworkspace\\spring-cloud\\config-git-repo
    #Verify any repository issue in service startup
    spring.cloud.config.server.git.cloneOnStart=true
    #Disable security of the Management endpoint
    management.security.enabled=false

    现在让我们了解这些属性。

    • server.port 定义嵌入式服务器将在其上启动的端口。
    • spring.cloud.config.server.git.uri将绑定git位置以查找配置。在这里,我们使用本地git repo,但只需更改此位置即可将其切换到远程位置。
    • management.security.enabled=false 将在/ env,/ refresh等管理上禁用spring安全性。这是用于开发设置的,应启用生产安全性。

    因此,此步骤将指向git位置和服务器端口。

    以上所有步骤都是我们需要在配置服务器端执行的,现在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部分中,我们可以看到我们在属性中添加的所有属性。这可以确保config-server成功运行,它已经识别了git位置,并且正在为不同环境提供配置。

    • http://localhost:8888/client-config/development
    • http://localhost:8888/client-config/production

    同样要检查服务器是否反映了属性文件中的任何更改而没有重新启动-更改任何环境的属性和签入属性文件的值。然后运行该特定环境的终结点,并验证更改后的属性值应立即反映出来而无需重新启动服务器。

    要进行git签入,请在完成更改并通过任何文本编辑器保存文件后,运行命令git add .git commit -m "test"

4.配置客户端配置

现在,我们将进行客户端实现,在此我们将使用来自单独的微服务的那些属性,这是我们的最终目标–将配置外部化为不同的服务。

  1. 创建Maven项目

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

    1. Actuator
    2. 配置客户端
    3. 网页
    4. 其余资料库

    生成前的屏幕如下所示;单击生成后,我们将获得.zip文件下载选项。像Spring-Config-Server一样,将文件解压缩到某个目录中,然后将其导入eclipse中。

    pom.xml
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    生成具有列出依赖项的客户项目
    生成具有列出依赖项的客户项目
  2. 创建REST资源

    添加一个RestController以查看响应中的服务器端属性值。为此,请打开@SpringBootApplication已生成的类文件,然后在该文件的末尾添加以下小类。这非常简单明了,我们只是在/messageURL处公开一种方法,该方法将返回msg配置服务器微服务提供的属性值,该服务器配置为本地git存储库(将迁移到本地生产中的远程git存储库!)。

    SpringConfigClientApplication.java
    package com.how2codex.example.springconfigclient;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    @SpringBootApplication
    public class SpringConfigClientApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringConfigClientApplication.class, args);
        }
        
        @Autowired
        public void setEnv(Environment e)
        {
            System.out.println(e.getProperty("msg"));
        }
    }
    @RefreshScope
    @RestController
    class MessageRestController {
        @Value("${msg:Config Server is not working。 Please check...}")
        private String msg;
        @GetMapping("/msg")
        public String getMsg() {
            return this.msg;
        }
    }
  3. 与配置服务器绑定

    bootstrap.propertiessrc\main\resources目录中创建一个名为的文件,并添加以下属性以与配置服务器连接以及一些必需的配置。

    bootstrap.properties
    spring.application.name=client-config
    #Active Profile - will relate to development properties file in the server。
    #If this property is absent then,default profile will be activated which is
    #the property file without any environment name at the end。
    spring.profiles.active=development
    # N.B。 this is the default:
    spring.cloud.config.uri=http://localhost:8888
    management.security.enabled=false

    现在让我们了解属性。

    • spring.application.name 只是将要部署的微服务的应用程序名称。
    • spring.cloud.config.uri是提及配置服务器网址的属性。请注意,我们的配置服务器在端口上运行8888;通过打开application.propertiesspring config服务器代码库的文件进行验证,然后检查server.port=8888
    • management.security.enabled=false将禁用Spring安全上的管理端点一样/env/refresh等等,这是发展的设置,在生产安全应该启用。
  4. 验证客户端配置

    我们非常需要在config客户端执行mvn clean install此操作,而不是在此项目上执行最终命令,以便正确编译所有内容并将其打包在目标文件夹以及本地Maven存储库中。我们将与服务器端一起启动配置客户端服务,最后我们将测试该功能。

5.演示

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

  • 生成并运行Config Server项目

    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

    这将在localhost的8080端口中启动Config Client服务。

  • 测试REST端点

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

    测试REST端点
    测试REST端点
  • 测试属性更改

    现在,我们将进行属性更改,并测试该更改是否可以反映在配置客户端服务中,而无需重新启动任何微服务。
    进行一些更改,在中的msg属性值中config-server-client-development.properties 并在本地git中签入,然后http://localhost:8080/msg在浏览器中再次单击,您将仅保留旧值。

    为了反映新的值,我们需要通过使用任何客户端的方法来命中端点来刷新配置http://localhost:8080/refreshPOSTREST

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

6.检查是否遇到任何错误的东西

  • 属性文件名和客户端模块服务名spring.application.name=config-server-client应完全相同,否则,将不会检测到属性。实际上,Config Server在属性文件名的端点公开属性,如果您浏览URL http://localhost:8888/config-server-client/development,它将返回所有dev环境值。
    所有开发人员属性视图
    所有开发人员属性视图
  • 确保使用git init/add/commit上述命令在git repo中签入属性文件。
  • 确保通过调用任何REST客户端的POST方法刷新了客户端服务环境http://localhost:8080/refresh。否则,更改后的值将不会反映在客户端服务中。
  • 确保在启动配置客户端服务时,配置服务器服务已在运行。否则,可能要花一些时间进行注册,这可能会在测试时造成混乱。

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

10

 发表评论

saigon has written 1445 articles

Leave a Reply