[Spring Cloud Tutorial翻译系列二]Spring Cloud Config Server与git集成

简介: 在这篇教程当中,我们将探讨并且完成一个叫做配置服务(Config Server)的微服务特性。所有微服务的可配置参数都在配置服务中写入和维护。它更像是将属性/资源文件从项目的代码中统一抽离到一个外部服务,这样的话如果某个属性发生了改变,那么使用它的服务并不需要重新部署。

现如今我们经常在讨论服务端开发(主要是API服务)的时候谈及“微服务”。微服务设计方法逐渐成为了API开发的新业界标准。几乎所有的组织都在推广它。
在这篇教程当中,我们将探讨并且完成一个叫做配置服务(Config Server)的微服务特性。所有微服务的可配置参数都在配置服务中写入和维护。它更像是将属性/资源文件从项目的代码中统一抽离到一个外部服务,这样的话如果某个属性发生了改变,那么使用它的服务并不需要重新部署。在不重新部署微服务的情况下,所有的属性改变将可以体现出来。

为什么要使用Spring cloud配置服务器

配置服务器的想法来自于12-factor app宣言。这份宣言与开发现代原生云应用的最佳实践指导相关。它建议将属性/资源保存在服务器的环境当中。在这个环境里,这些资源会在服务运行的时候发生变化——不同的配置通常在每个环境当中有所不同。
举个例子,如果一个服务依赖与另一个服务(由于特定业务场景被调用),并且被依赖的服务的URL发生了改变,那么我们必须用新的地址构建和部署我们的服务。但是如果我们现在运用了12 factor app方法,并且从一个运行在不同进程里的外部服务读取配置,我们就只需要刷新配置服务了。
所以,这个想法非常清晰以及有效。现在让我们来看看如何创建配置服务器。

例子中使用到的技术栈

我们将使用基于spring-boot的spring-cloud API,它非常易于使用和流行。在spring framework的命名中,它被称作Config Server。同时我们也会通过git来托管属性文件。
所以我们最终用于这个demo的技术栈是:

Java 1.8E
clipse IDE
Spring cloud
Spring boot
Spring Rest
GitHub as resource repository
Maven
REST client

我们首先将开发2个基于spring boot的微服务。

一个是提供运行配置的配置服务器
一个是使用配置服务器暴露的配置的配置客户端服务

配置服务器——服务器端配置

首先我们通过给定的步骤构建配置服务器部分。

生成项目结构

从spring boot初始化程序门户开始,这是创建任何基于Spring Boot的应用的一个特别好的起点。在这里我们只会选用Config Server starter pom。通过使用此配置,只要我们生成项目,就可以下载一个zip文件,然后解压缩后导入eclipse。

image.png

将项目导入Eclipse

一旦你从spring初始化器门户获得了zip文件,我们需要将它解压缩到我们选择的目录并将其作为maven项目导入eclipse

在Eclipse中构建

下一步是选择你喜欢的方式,从命令提示符或eclipse运行mvn clean install。

添加Config Server注解

现在打开spring已经提供的Spring Application类,并在类之前添加@EnableConfigServer注解并再次构建项目。在使用这个注解之后,这个artifact将会表现得像一个spring配置服务器。
此类被添加这个注解之后看起来会像下面那样——类名由你生成的项目名决定,当然你也可以手动更改一个你喜欢的名称。


package com.howtodoinjava.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);
    }
}

创建git仓库

下一个非常重要的步骤是建立一个本地git仓库。它可以很轻松地通过在属性文件里配置URL被替换成远程仓库。我们将放置被配置服务器微服务使用的外部属性文件来提供外部属性配置。我们需要跟着下面的步骤来创建一个本地git仓库并且检查样例属性文件。

首先请确保在你的机器上已经安装了git shell,而且你可以通过命令行运行git bash。可以通过打开命令行,输入git命令来确认。

在桌面创建一个目录config-server-repo。

然后在config-server-repo目录中创建一个文件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 - development environment。

然后在config-server-repo目录中创建一个文件config-server-client-production.properties,并在文件中添加内容msg = Hello world - this is from config server - production environment。

在这里我们为不同的环境维护了同样名称的配置,因为我们通常维护不同环境的属性,如urls,credentials,数据库详细信息等。最重要的一点是我们需要在每个属性文件中附加带有环境名称的连字符( - ),以便配置服务器理解它。此外,我们需要使用我们将在此之后创建的配置客户端服务名称命名属性文件。

现在从config-server-repo目录打开命令提示符并运行命令git init,使该目录成为git存储库。

运行git add。将所有内容添加到仓库中。

最后我们需要通过运行命令git commit -m“initial checkin”来提交属性文件。下面是全部命令操作的截图(译者注:你也可以用git bash操作。原作者使用的是windows命令行)。

image.png

从配置服务器指向git仓库

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

#服务器端

server.port = 8888
 
#Git 仓库地址。可以替换成你本地git仓库的绝对路径
spring.cloud.config.server.git.uri=${USERPROFILE}\\Desktop\\config-server-repo
 
#关闭Management endpoint的安全检验
management.security.enabled=false

#译者注,在springboot的2.x版本当中,
#management.security.enabled已经被废弃。
#应该该成以下配置,才可以访问刷新配置的url /actuator/refresh
#management.endpoints.web.exposure.include=refresh

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

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

验证服务器端配置

为了确认服务器是否可以识别这些属性,我们首先在项目根目录运行以下命令:
java -jar targetspring-config-server-0.0.1-SNAPSHOT.jar
复制代码现在打开浏览器并检查下面的Urls,它将返回JSON输出。在propertySources部分,我们可以看到我们在属性文件中添加的所有属性内容。这确保配置服务器成功运行,它已识别git的位置,并且正在为不同环境提供配置。

http://localhost:8888/config-server-client/development

http://localhost:8888/config-server-client/production

此外,我们来看看在项目运行的时候,对属性文件中的任何更改是否在服务器没有重新启动的情况下生效——修改环境属性文件当中的值,将它提交到git仓库,然后通过查看对应环境的endponit(浏览器打开对应的url)来检查配置是否在服务没有重启的情况下生效——这就是配置服务器的魔法。

配置服务器——客户端配置

现在我们将继续进行客户端实现。我们将从一个单独的微服务中获取属性。这是我们的最终目标 - 将配置外部化到不同的服务。

创建Maven项目

打开https://start.spring.io/,并使用以下选定的依赖生成客户端项目:

Actuator
Config Client
Web
Rest Repositories

屏幕将如下所示。像Spring-Config-Server一样,将生成的zip文件解压缩到某个目录并导入eclipse。

image.png

创建REST资源

首先添加一个RestController以查看响应中的服务器端属性值。为此,打开已生成的@SpringBootApplication类文件,并在该文件的末尾添加一个该类。这非常简单和直接,我们仅仅只是在/message上暴露一个方法,用它返回由配置服务器微服务提供的msg属性值。该配置服务器指向本地git仓库(在生产环境它将会被替换为一个远程git仓库)。

package com.howtodoinjava.example.springconfigclient;
 
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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@SpringBootApplication
public class SpringConfigClientApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringConfigClientApplication.class, args);
    }
}
 
@RefreshScope
@RestController
class MessageRestController {
 
    @Value("${msg:Hello world - Config Server is not working..pelase check}")
    private String msg;
 
    @RequestMapping("/msg")
    String getMsg() {
        return this.msg;
    }
}    

与配置服务器绑定

在srcmainresources目录中创建一个名为bootstrap.properties的文件,并添加以下属性以及一些必需的配置与配置服务器连接。
spring.application.name=config-server-client

Active Profile配置与环境有关。

如果它为空,则配置服务器将会使用末尾没有环境变量的配置文件

如 config-server-client.properties

spring.profiles.active=development

spring.cloud.config.uri=http://localhost:8888

management.security.enabled=false
复制代码上述主要的配置与配置服务器的配置意义一致。

Demo

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

构建与运行配置服务器项目

从spring-config-server文件夹打开命令行工具并运行mvn clean install命令。在构建完成之后,运行java -jar targetspring-config-server-0.0.1-SNAPSHOT.jar
配置服务器将会在本地的8888端口启动。

构建与运行配置客户端项目

同样的, 从spring-config-clienet文件夹打开命令行工具并运行mvn clean install命令。在构建完成之后,运行java -jar targetspring-config-client-0.0.1-SNAPSHOT.jar
配置服务器将会在本地的8080端口启动。

测试Rest Endpoint(端点)

现在打开浏览器,通过访问http://localhost:8080/msg打开/msg的rest endpoinit。它将会返回Hello world - this is from config server - Development environment。它之前出现在config-server-client-development.properties文件当中。

测试属性更改

现在我们将进行属性更改并测试是否可以在配置客户端服务中反映,而无需重新启动任何微服务。

对config-server-client-development.properties中的msg值进行更改然后提交到本地git,接着在浏览器中再次点击http//localhost:8080/msg,你将仅仅得到旧值。

要获得新值,我们需要通过从任意REST客户端使用POST方法访问http://localhost:8080/refresh端点来刷新配置。

一旦配置客户端服务被成功刷新后,新值就应该会出现在服务响应体中。这是因为Rest Controller暴露的@RefreshScope注解。

如果遇到错误需要检查的事项

属性文件名与客户端服务名称spring.application.name=config-server-client需要保持一致,否则属性将无法被检测到。
确保你已经通过使用git add/commit命令来提交代码到git仓库。
确保你已经调用POST方法访问http://localhost:8080/refresh来刷新配置客户端服务。
确保在你启动配置客户端服务的时候,配置服务器服务已经启动。否则由于需要花费一些时间注册客户端服务,有的时候在测试的时候将会产生混乱。

这就是创建配置服务器微服务的全部了。如果你有遇到任何的困难请在这篇文章的评论当中提出,我们会很高兴帮助你解决这些问题。


作者:陈续渊
链接:https://juejin.im/post/5ca5b4b1f265da309b780d31
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

目录
相关文章
|
7月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
524 0
|
10月前
|
人工智能 API 开发工具
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
GitHub MCP Server是基于Model Context Protocol的服务器工具,提供与GitHub API的无缝集成,支持自动化处理问题、Pull Request和仓库管理等功能。
2080 2
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
|
机器学习/深度学习 人工智能 自然语言处理
Voice-Pro:开源AI音频处理工具,集成转录、翻译、TTS等一站式服务
Voice-Pro是一款开源的多功能音频处理工具,集成了语音转文字、文本转语音、实时翻译、YouTube视频下载和人声分离等多种功能。它支持超过100种语言,适用于教育、娱乐和商业等多个领域,为用户提供一站式的音频处理解决方案,极大地提高工作效率和音频处理的便捷性。
1275 10
Voice-Pro:开源AI音频处理工具,集成转录、翻译、TTS等一站式服务
|
Cloud Native Java Nacos
Spring Cloud Config、Apollo、Nacos和Archaius对比
这篇文章对比了Spring Cloud Config、Apollo、Nacos和Archaius这四种配置中心的适应场景、优缺点。文中讨论了它们的功能特点,例如Spring Cloud Config的集中化配置管理和动态刷新能力,Apollo的实时配置推送和权限治理,Nacos的服务发现和管理功能,以及Archaius的动态配置更新能力。文章指出选择配置中心应根据项目需求和架构来决定,并提供了一个对比图来帮助读者更直观地理解这些工具的差异。
718 1
Spring Cloud Config、Apollo、Nacos和Archaius对比
|
Java 开发工具 对象存储
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
286 2
|
jenkins 持续交付 开发工具
"引爆效率革命!Docker+Jenkins+GIT+Tomcat:解锁持续集成魔法,一键部署Java Web应用的梦幻之旅!"
【8月更文挑战第9天】随着软件开发复杂度的增加,自动化变得至关重要。本文通过实例展示如何结合Docker、Jenkins、Git与Tomcat建立高效的持续集成(CI)流程。Docker确保应用环境一致性;Jenkins自动化处理构建、测试和部署;Git管理源代码版本;Tomcat部署Web应用。在Jenkins中配置Git插件并设置项目,集成Docker构建Tomcat应用镜像并运行容器。此外,通过自动化测试、代码质量检查、环境隔离和日志监控确保CI流程顺畅,从而显著提高开发效率和软件质量。
261 3
|
Java API 开发工具
Spring Boot与Spring Cloud Config的集成
Spring Boot与Spring Cloud Config的集成
|
jenkins 持续交付 开发工具
自动化开发之旅:Docker携手Jenkins,与Git和Tomcat共舞持续集成
【8月更文挑战第13天】在软件开发中,持续集成(CI)通过自动化构建、测试与部署提升效率与稳定性。Docker、Jenkins、Git和Tomcat构成CI的黄金组合:`git push`触发Jenkins作业,利用Docker确保环境一致性,最终将应用部署至Tomcat。首先配置Git Webhooks以触发Jenkins;接着在Jenkins中创建作业并使用Docker插件模拟真实环境;通过Maven构建项目;最后部署至Tomcat。这套流程减少人为错误,提高开发效率,展示了技术的力量与流程的革新。
260 0
|
Dubbo Java 应用服务中间件
深入了解Spring Cloud Alibaba Dubbo
在现代分布式系统开发中,构建高性能、可伸缩性和弹性的微服务架构变得越来越重要。Spring Cloud Alibaba Dubbo(简称Dubbo)是一个开源的分布式服务框架,可以帮助开发者构建强大的微服务架构,具备负载均衡、服务治理、远程调用等强大功能。本文将深入介绍Spring Cloud Alibaba Dubbo,帮助你理解它的核心概念、工作原理以及如何在你的项目中使用它。
|
Kubernetes Java 微服务
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
298 0
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)