(八)统一配置中心-Config

news/2025/2/25 22:21:18

对于配置的重要性,我想我不用进行任何强调,大家都可以明白其重要性。在普通单体应用,我们常使用配置文件(application(*).properties(yml))管理应用的所有配置。这些配置文件在单体应用中非常胜任其角色,并没有让我们感觉到有头疼的地方。但随着微服务框架的引入,微服务数量就会在我们产品中不断增加,之前我们重点考虑的是系统的可伸缩、可扩展性好,但随之就是配置管理的问题就会一一暴露出来。起初微服务器各自管各自的配置,在开发阶段并没什么问题,但到了生产环境管理就会很头疼,如果要大规模更新某项配置,困难就可想而知。

为此,在分布式系统中,Spring Cloud提供一个Config子项目,该项目核心就是配置中心,通过一个服务端和多个客户端实现配置服务。我们可使用配置服务器集中的管理所有服务的各种环境配置文件。配置服务中心默认采用Git的方式进行存储,因此我们很容易部署修改,并可以对环境配置进行版本管理。

Spring Cloud Config具有中心化、版本控制、支持动态更新和语言独立等特性。其特点是:

  • 提供服务端和客户端支持(Spring Cloud Config Server和Spring Cloud Config Client);
  • 集中式管理分布式环境下的应用配置;
  • 基于Spring环境,实现了与Spring应用无缝集成;
  • 可用于任何语言开发的程序;
  • 默认实现基于Git仓库(也支持SVN),从而可以进行配置的版本管理;

Spring Cloud Config的结构图如下:

 
Config-结构图

从图中可以看出Spring Cloud Config有两个角色(类似Eureka): Server和Client。Spring Cloud Config Server作为配置中心的服务端承担如下作用:

  • 拉取配置时更新Git仓库副本,保证是配置为最新;
  • 支持从yml、json、properties等文件加载配置;
  • 配合Eureke可实现服务发现,配合Cloud Bus(这个后面我们在详细说明)可实现配置推送更新;
  • 默认配置存储基于Git仓库(可以切换为SVN),从而支持配置的版本管理.

而对于,Spring Cloud Config Client则非常方便,只需要在启动配置文件中增加使用Config Server上哪个配置文件即可。

 

构建Config-Server(idea)

pom如下

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>

启动类

@SpringBootApplication
@EnableConfigServer
public class SpringCloundConfigDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloundConfigDemoApplication.class, args);
	}

}

  其中增加了@EnableConfigServer

application.properties

server.port=8890
spring.application.name=server-config


spring.cloud.config.server.git.uri=https://gitee.com/skyLogin/SpringCloundConfigGit.git
spring.cloud.config.server.git.username=登录名
spring.cloud.config.server.git.password=密码

  这里最重要的是需要配置Git仓库的地址及登录用户名和口令。

 

我们在 SpringCloundConfigGit仓库中提交如下文件
user.properties
project.name = sky

  
user-dev.properties

project.description = dev-description

启动测试

{
	"name": "user",
	"profiles": ["dev"],
	"label": null,
	"version": "9bc698347dcb4e82e1c8fc631d7409cc3f0e6a65",
	"state": null,
	"propertySources": [{
		"name": "https://gitee.com/skyLogin/SpringCloundConfigGit.git/user-dev.properties",
		"source": {
			"project.description": "dev-description"
		}
	}, {
		"name": "https://gitee.com/skyLogin/SpringCloundConfigGit.git/user.properties",
		"source": {
			"project.name": "sky"
		}
	}]
}

这里可以看到,我们提交到Git中的配置文件已经能够被server-config正确的读取到。

 

构建config-client

config-client可以是任何一个基于Spring boot的应用,这里为了讲解方便,我们构建一个非常简单的web工程。

 

我们的config-client项目需要引入对spring-cloud-starter-config的依赖,如下:

 

pom

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

启动类

一个标准的Spring Boot启动类:

@SpringBootApplication
public class SpringCloundConfigClientDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringCloundConfigClientDemoApplication.class, args);
	}

}

编写测试Controller

这个测试Controller主要就是验证我们可以从Git仓库中获取配置内容。

@RestController
public class ConfigController {
    @Value("${project.name}")
    String name;

    @Value("${project.description}")
    String description;

    @RequestMapping("/config/get/message")
    public String getMessage() {
        return name + " - " + description;
    }
}

编写配置文件

这里编写的配置文件名称为:bootstrap.properties,内容如下:

server.port=8891

spring.application.name=user
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:8890/

  

定义了微服务的名称和profile以及配置服务器的地址。

注意: 这些配置不能够配置在application.properties文件中,因为在Spring Boot启动时有引导上下文和应用上下文的概念,只有将配置服务器信息定义在引导上下文中,才能够从配置服务器中获取到配置信息。否则,服务启动时会报找不到变量定义的错误。

启动测试

说明,我们的config-client已经成功从server-config上获取到配置的数据了。

 
 

链接:https://www.jianshu.com/p/997600098e6c
來源:简书

转载于:https://www.cnblogs.com/skyLogin/p/10208892.html


http://www.niftyadmin.cn/n/707402.html

相关文章

overwrite java_java中的重写override或overwrite

java中的重写override或overwriteTestOverWrite.java?class"java">class Person {private String name;private int age;public void setName(String name){this.namename;}public void setAge(int age) {this.ageage;}public String getName(){return name;}pub…

js执行完一件事 之后再去执行下一件事_没有执行力,一切都是零

什么是执行力&#xff1f;对于执行力最直观的说法&#xff0c;就是“今日事今日毕”。如果你今天的任务是写完一篇文章&#xff0c;在没有任何外界障碍的情况下&#xff0c;你拖拖拉拉地把它放在明天去做&#xff0c;你说你是一个很有能力的人&#xff0c;对不起&#xff0c;没…

Office word中去掉首页的页眉

1.首先将光标位置移动到第二页的开始&#xff0c;然后点击页面布局命令。 2.页面布局里面找到分隔符&#xff0c;找到下一页的分隔符。&#xff08;分页符分页&#xff09; 3.双击第二页的页眉&#xff0c;打开页眉编辑菜单。将连接到前一条页眉的命令去掉。 4.回到第一页的页眉…

作为2019年的Java程序员,如何能快速进阶成长?

面试候选人的时候&#xff0c;有个比较常见的问题&#xff1a;对于一份工作&#xff0c;你最关注哪些因素&#xff1f;回答往往是薪资待遇&#xff0c;公司氛围&#xff0c;公司发展前景&#xff0c;工作强度等。个人比较欣赏的答案是&#xff1a;个人能力的成长。想收获一个薪…

.net 启动mysql数据库_MySQL 数据库的启动与关闭

2、MySQL安全启动(mysqld_safe)mysqld_safe是一个shell 脚本&#xff0c;会调用mysqld启动mysql服务器&#xff0c;并监听服务器。如果mysqld进程异常终止&#xff0c;mysqld_safe将自动重启mysqldmysql_safe 从配置文件中读取[mysqld],[server],[mysqld_safe]等选项&#xff0…

java big5编码 转 gbk 无表_java big5编码 转 gbk 无表

java big5编码 转 gbk 无表[2021-01-30 18:58:29] 简介:php中big5转utf8乱码的解决办法&#xff1a;首先生成tab文件&#xff0c;并生成时要保证tab文件不存在&#xff1b;然后将指定页面转码测试&#xff1b;接着打印出文字库&#xff1b;最后big5转【utf-8】即可。php中big5…

Linux下安装maven-及常用命令

Linux下安装maven1.首先到Maven官网下载安装文件&#xff0c;目前最新版本为3.0.3&#xff0c;下载文件为apache-maven-3.0.3-bin.tar.gz&#xff0c;下载可以使用wget命令&#xff1b;2.进入下载文件夹&#xff0c;找到下载的文件&#xff0c;运行如下命令解压tar -xvf apach…

java多线程基本概述(二十五)——Exchanger

Exchanger是两个任务之间交换对象的栅栏&#xff0c;当这些任务进入栅栏时&#xff0c;它们各自拥有一个对象&#xff0c;当它们离开时&#xff0c;它们都拥有之前由对象持有的对象。这两个线程通过exchange方法交换数据&#xff0c;如果第一个线程先执行exchange()方法&#x…