SpringCloud Config分布式配置中心

news2024/11/17 10:26:48

目录

一、概述

二、Config服务端配置与测试

配置读取规则 

三、Config客户端配置与测试

bootstrasp.yml

四、Config客户端之动态刷新


一、概述

官网:Spring Cloud Config

微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。
 

SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。

SpringCloud Config分为服务端客户端两部分。
 
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。

SpringCloud Config功能

  1. 可以集中管理配置文件;
  2. 不同环境不同配置,动态化的更新配置,分环境部署比如dev/test/prod/beta/release
  3. 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息
  4. 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置
  5. 将配置信息以REST接口的形式暴露,可以以Post方式通过curl命令行手动更新配置

由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式 

二、Config服务端配置与测试

服务端的ConfigServer是直接向GitHub拉取配置文件的 

在GitHub新建一个仓库springcloud-config用于测试,并创建三份不同环境下的配置文件

新建Module模块cloud-config-center-3344,它即为Cloud的配置中心模块cloudConfig Center

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</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-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

yml

server:
  port: 3344

spring:
  application:
    name:  cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: git@github.com:zzyybs/springcloud-config.git #GitHub上面的git仓库名字
        ####搜索目录
          search-paths:
            - springcloud-config
      ####读取分支
      label: master

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
 

主启动类 @EnableConfigServer

测试

配置读取规则 

其中,label为标签, profile为环境(dev/test/prod),application可以为服务名,所以我们在Github上的配置文件要采取上面的命名格式

三、Config客户端配置与测试

客户端的Config是向服务端ConfigServer拉取配置信息

新建cloud-config-client-3355

pom.xml(注意,客户端导入的依赖是spring-cloud-starter-config,服务端是spding-cloud-config-server

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</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-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

bootstrasp.yml

applicaiton.yml是用户级的资源配置项
bootstrap.yml是系统级的,优先级更加高

即application.yml是当前微服务自己的配置文件,bootstrap是拉取中心配置的文件,但是如果有同名的配置优先采用bootstrap(中心配置)。
 
Spring Cloud会创建一个“Bootstrap Context”,作为Spring应用的`Application Context`的父上下文。初始化的时候,`Bootstrap Context`负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的`Environment`。
 
`Bootstrap`属性有高优先级,默认情况下,它们不会被本地配置覆盖。 `Bootstrap context`和`Application Context`有着不同的约定,所以新增了一个`bootstrap.yml`文件,保证`Bootstrap Context`和`Application Context`配置的分离。
 
要将Client模块下的application.yml文件改为bootstrap.yml,这是很关键的,
因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml

 
 

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址k

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

主启动

@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3355
{
    public static void main(String[] args)
    {
        SpringApplication.run(ConfigClientMain3355.class,args);
    }
}
a

业务类,configServer会将配置信息以REST接口的形式暴露

@RestController
public class 9
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() 
    {
        return configInfo;
    }
}

测试 

 这里出现了一个问题,当我们修改github上的配置文件时,服务端直接拉取可以动态改变,但是客户端config并没有发生改变,所以我们需要做进一步配置开启动态刷新配置

四、Config客户端之动态刷新

避免每次更新配置都要重启客户端Config微服务

pom.xml中我们需要引入actuator

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

修改YML

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

业务类加上@RefreshScope 

@RestController
@RefreshScope
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}

但还需要加上一步,需要运维人员发送Post请求刷新3355,可以通过curl命令的方式刷新

curl -X POST "http://localhost:3355/actuator/refresh"

 

 

但如果有很多个客户端都需要手动刷新的话也很麻烦,可否广播,一次通知,处处生效?

这就开启了下一个篇章,SpringCloud Bus消息总线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】IDEA调试线上服务

目录IEDA打开线上服务对应的代码&#xff0c;Edit Configuration创建与远程服务的连接复制黄匡生成的参数&#xff0c;添加到服务器启动命令中服务器的服务重新启动&#xff0c;并注意调试端口5005是否被防火墙拦截本地IDEA启动&#xff0c;控制台打印如图即成功代码上加断点&a…

Linux做选择题时的要点

1.线程独有&#xff1a;栈&#xff0c;寄存器&#xff0c;信号屏蔽字&#xff0c;errno...等信息&#xff0c;因此各个线程各自有各自的栈区&#xff0c;但是堆区共用。 2.用户态线程的切换在用户态实现&#xff0c;不需要内核支持。 3.每个线程在进程虚拟地址空间中会分配拥…

部署在Docker中的iServer进行服务迁移

目录前言一&#xff1a;备份与恢复1.备份2.恢复二&#xff1a;迁移配置文件作者&#xff1a;kxj 前言 Linux 容器虚拟技术&#xff08;LXC&#xff0c;Linux Container&#xff09;是一种轻量级的虚拟化手段&#xff0c;它利用内核虚拟化技术提供轻量级的虚拟化&#xff0c;来…

【八大数据排序法】希尔排序法的图形理解和案例实现 | C++

第十七章 希尔排序法 目录 第十七章 希尔排序法 ●前言 ●认识排序 ●一、希尔排序法是什么&#xff1f; 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ●总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法&#xff0c;它主要是将一…

C++引用(特性+使用场景+常引用)

文章目录1. 概念2. 关于别名的理解3. 引用的特性1.引用必须在定义时初始化2.一个变量可以有多个别名3.引用一旦引用一个实体&#xff0c;再不能引用其他实体4.使用场景1. 引用做参数2. 引用做返回值1. 传值返回是否为n直接返回临时变量作为返回值2. 传引用返回编译器傻瓜式判断…

11、循环语句

目录 一、while语句 二、do…while语句 三、for语句 一、while语句 使用while语句可以执行循环结构&#xff0c;其一般形式如下&#xff1a; while语句的执行流程图&#xff1a; while语句首先检验一个条件&#xff0c;也就是括号中的表达式。当条件为真时&#xff0c;就执…

跟同事杠上了,用雪花算法生成的id做主键对MySQL性能有影响?

公司最近开发了一个新项目&#xff0c;设计表时由于有些字段需要对外展示&#xff0c;所以使用了雪花算法生成的id做主键。 不过有位同事对此提出了异议&#xff0c;认为雪花算法生成的id不是顺序递增的&#xff0c;会对MySQL的性能造成影响。 经过交流&#xff0c;发现持有这…

【Linux 系统运维基础】Linux目录 以及重要配置文件

Linux目录 以及重要配置文件 文本讲述了Linux中目录含义 以及我们工作中常用到的路径 1. 目录含义 2. 常用路径地址 2.1 网卡配置文件 /etc/sysconfig/network-scripts但是网卡的名称是有区别的&#xff0c;使用不同服务器生产商的名称是不同的。如下图&#xff1a; 网卡配置…

Window10下FFMPEG的安装与使用

文章目录一.FFMPEG介绍FFMPEG组成二.Windows10下FFMPEG安装三.FFMPEG的使用1.关键指令一.FFMPEG介绍 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它…

字节前端面试题目2

1.为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片&#xff1f; 1. 没有跨域问题&#xff0c;一般这种上报数据&#xff0c;代码要写通用的&#xff1b;&#xff08;排除 ajax&#xff09; 2. 不会阻塞页面加载&#xff0c;影响用户的体验&#xff0c;只…

基于SSM的图书购物商城设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【C++】三大特性之继承

目录 一、继承的概念及定义 1.继承的概念 2. 继承定义 2.1定义格式 2.2继承关系和访问限定符 2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、友元与继承 六、继承与静态成员 七、复杂的菱形继承及菱…

机器学习中的数学原理——线性不可分

这个专栏主要是用来分享一下我在 机器学习中的 学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎 私信或者评论区留言&#xff01;这一篇就更新一下《 白话机器学习中的数学——线性不可分》&#xff01; 目录 一、什么是线性不可分 二…

用125行C语言编写一个简单的16位虚拟机

改博文用图文代码的方式详细描述了实现的具体过程&#xff0c;包含每一条指令的含义。 虚拟机 在计算领域&#xff0c;VM&#xff08;虚拟机&#xff09;是一个术语&#xff0c;指的是模拟/虚拟化计算机系统/架构的系统。 从广义上讲&#xff0c;有两类虚拟机&#xff1a; 系统…

每日一练11——最近公共祖先求最大连续bit数

文章目录最近公共祖先思路&#xff1a;代码&#xff1a;求最大连续bit数思路&#xff1a;代码&#xff1a;最近公共祖先 题目链接 思路&#xff1a; 题目所描述的满二叉树如下&#xff1a; 上述树中子节点与父节点之间的关系为root child / 2 所以如果a &#xff01; b&a…

递归算法整理

一、概述&#xff1a;递归算法是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。类似于数列&#xff0c;通过前几项的值推出后几项 二、递归算法的使用条件1.大问题可以拆分为若干小问题2.原问题与子问题除数据规模不同&#xff0c;求解思路完全相同…

自助Active Directory组订阅

在任何基于Windows的企业的身份与访问管理(IAM)战略中&#xff0c;Active Directory组扮演了至关重要的角色&#xff0c;因为它们用来控制对几个资源&#xff08;包括电子邮件通讯组&#xff09;的用户访问。反复地添加用户到组中和从组中移除用户构成了IT管理员工作的有机组成…

C#windows竞赛管理系统

中文摘要 为了提高竞赛项目信息的管理效率&#xff0c;本课题使用C#语言和SQL Server数据库系统开发了一个WinForm类型的竞赛管理系统对竞赛项目信息进行高效管理&#xff0c;以提升管理质量。本系统包含教师登录注册、教师信息修改模块、添加学生信息模块、删除学生信息模块、…

可编程直流电源的介绍 什么是可编程直流电源

现在各种的电子设备不断地发展&#xff0c;它们对直流供电的电源也有了更高的要求&#xff0c;相对于电子设备来说&#xff0c;用单一的直流电源是没有办法达到供电的要求&#xff0c;所以需要不同的直流电源来给电子设备供电。可编程直流电源就是这一种。在生产测试中&#xf…

java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1

知道InetAddress.getLocalHost()方法是可以获取本地ip的&#xff0c;但是在mac电脑上执行的时候&#xff0c;偶尔会得到127.0.0.1的输出&#xff0c;这样拿到本地ip很不稳定&#xff0c;感觉就很不靠谱了 目录InetAddress.getLocalHost()方法获取本地IP不靠谱原因获取本地IP的靠…