【Spring Cloud】分布式配置

news2024/11/17 9:56:12

目录

  • 未来的开发场景
  • 为什么需要配置中心
    • 配置实时生效
    • 配置管理流程
  • 开源配置中心基本介绍
    • Disconf
    • Spring Cloud Config
    • Apollo
    • Nacos
  • Spring Cloud Config
    • 介绍
    • 配置管理工具
    • 体系
  • 案例
    • 需求
    • 编写 Config Server
      • 1.创建配置文件
      • 2.创建项目
      • 3.添加依赖
      • 4.添加注解
      • 5.修改配置文件
        • application.yml
        • 映射规则解析
      • 6.启动服务
      • 7.访问端点
      • 8.为Config Client准备配置环境
    • 编写 Config Client
      • 1.给demo-gateway项目添加依赖
      • 2.创建配置文件
        • bootstrap.yml
        • application.yml
      • 3.获取配置
      • 4.验证测试
  • 加密解密
    • 开启加密
      • 启动Config Server
      • 添加配置
      • 验证
    • 发送加密请求
    • 发送解密请求
    • 存储和解析加密数据
      • 1.添加配置
      • 2.代码解析加密
  • 思维导图
  • 补充:bootstrap.yml和application.yml的区别
        • 加载顺序
        • 配置区别
        • 典型的应用场景如下:
        • 为何需要把 config server 的信息放在 bootstrap.yml 里?

未来的开发场景

我们在创建项目的时候,为每个项目都配置了一个或者多个配置文件。通过修改配置文件中的参数我们可以创建出不同的服务环境。

  • 首先,服务拆分越多,配置项也就越多。而一旦有某项服务进行了调整,其他服务也需要相应调整。如果配置项都在每个项目的配置文件中配置,那么可想而知,只要一有改变,就得改配置文件,重新部署项目。

    • 比如:假如说3个微服务中关于数据库的配置项是完全一样的,倘若某天MySQL数据库迁移了,那么这3个微服务的配置文件也要全部修改;
  • 当修改了配置之后,必须重启服务,否则配置无法生效;

  • 其次,运维安全。如果我们将一些数据库信息直接配置在配置文件中,那么对于运维的同学来说,显然带来了更大的挑战与风险。因为项目极有可能是多人协作开发,而多人都可以直接连接数据库将会具有不小的风险(删库跑路了解一下)

为什么需要配置中心

配置实时生效

  • 传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化。轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中。
  • 配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置。

配置管理流程

配置的权限管控、灰度发布、版本管理、格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分。

开源配置中心基本介绍

Disconf

2014年7月百度开源的配置管理中心,同样具备配置的管理能力,不过目前已经不维护了,最近的一次提交是两年前了。

Spring Cloud Config

2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。

Apollo

2016年5月,携程开源的配置管理中心,具备规范的权限、流程治理等特性。

Nacos

2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。

Spring Cloud Config

介绍

  • 2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。

  • Spring Cloud Config 是一个解决分布式系统的配置管理方案的项目。它包含了 Client 和 Server 两个部分,Server 端提供配置文件的存储、以接口的形式将配置文件的内容提供出去,Client 端通过接口获取数据、并依据此数据初始化自己的应用。

  • Spring Cloud Config 是一个基于 http 协议的远程配置实现方式,通过统一的配置管理服务器进行配置管理,客户端通过 https 协议主动的拉取服务的的配置信息,完成配置获取

  • 分布式环境中,很多的服务都是集群部署,那就意味着这些集群部署的服务都需要相同的配置文件。所以,这时候就引入了 Spring Cloud Config 这个组件,使用该组件来进行众多的配置文件的统一管理。

配置管理工具

  • 本地存储
  • Subversion
  • Git

体系

  1. Config Server
  2. Config Client

在这里插入图片描述在这里插入图片描述

案例

需求

  • 在Git仓库中创建分支
  • 在指定分支下创建文件夹
  • 在第2步创建文件夹下创建配置文件
  • 在配置文件中填充配置数据信息
  • 通过Config Server获取线上Git仓库中的配置信息
  • 通过Config Client从Config Server获取配置信息

编写 Config Server

1.创建配置文件

  • 在码云/GitEE中创建项目env-project

  • 在env-project项目中创建dev分支

  • 在dev分支下创建config-file文件夹

  • 在config-file下创建文件client-dev.properties

  • 在client-dev.properties填入以下内容

    eureka.port=19015
    spring.dataSource.username=root
    

    在这里插入图片描述

2.创建项目

指定artifactId为demo-config-server

3.添加依赖

        <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>

4.添加注解

  • @EnableConfigServer
  • @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class DemoConfigServerApplication {

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

}

5.修改配置文件

application.yml
server:
  port: 7600
spring:
  application:
    name: demo-config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xxxxxx/env_project.git # 刚才创建的gitee位置
          search-paths: config-file
eureka:
  client:
    service-url:
      defaultZone: http:192.168.2.220:7776/eureka
映射规则解析
  • /client/dev/dev,即:/{application}/{profile}/{label}
    • {application}:Git仓库中文件名的前缀, 通常使用微服务名称
    • {profile}:{application}-后面的数值
      • 在同一个分支下可以有多个{application}名称相同的文件
    • {label}:Git仓库的分支名,默认为master

在这里插入图片描述

6.启动服务

7.访问端点

访问:http://localhost:7900/client/dev/dev,确保能够读取到gitee上的内容

8.为Config Client准备配置环境

在gitee上刚才的仓库的dev分支下创建配置文件:demo-gateway-dev.properties,内容如下:

eureka.port=18080

编写 Config Client

1.给demo-gateway项目添加依赖

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

2.创建配置文件

bootstrap.yml

在demo-gateway项目中创建文件 bootstrap.yml,内容如下:

spring:
  application:
    name: demo-gateway
  cloud:
    config:
      uri: http://localhost:7600
      label: dev
      profile: dev
eureka:
  client:
    service-url:
      defaultZone: http://192.168.2.220:7776/eureka

这里为什么{profile}和{label}都指定了,不用指定{application},因为sprng.application.name就是{application}

application.yml
server:
  port: 7900

3.获取配置

@RestController
public class InfoController {
    @Value("${eureka.port}")
    private String port;
    @GetMapping("/port")
    public String getPort(){
        return "配置文件中的端口为:"+this.port;
    }
}

4.验证测试

访问地址:http://localhost:8085/port

加密解密

  • 数据在配置文件中明文保存,有安全隐患
  • 数据存储加密,使用时解密
    • Spring Cloud Config
    • JCE
      • JRE中自带
      • 默认有长度限制
      • 可以安装不限制长度版本

开启加密

启动Config Server

访问路径:

  • /encrypt/status:查看加密功能状态的端点
  • /key:查看密钥的端点
  • /encrypt:对请求的Body内容进行加密的端点
  • /decrypt:对请求的Body内容进行解密的端点

添加配置

在bootstrap.yml中添加密钥配置

encrypt:
   key: demo

验证

访问:http://localhost:7900/encrypt/status

发送加密请求

  • 请求地址:http://localhost:7900/encrypt
  • POST请求
    需加密的内容通过请求体发送
    在这里插入图片描述

发送解密请求

  • 请求地址:http://localhost:7900/decrypt
  • POST请求
  • 密文通过请求体发送
    在这里插入图片描述

存储和解析加密数据

1.添加配置

  • 在demo-gateway-dev.properties中添加加密后的配置
eureka.port={cipher} bfa028c0a382074d58bb315b00f5ffde4660d7e92977fe223cac2f9e430b1a9c
  • {cipher}代表当前数据为加密值

  • 配置文件如果是yml文件,tokenValidation的值必须加单引号,如果是properties文件,则不能有单引号,否则不能正常解析

  • 即使是相同的值,每次加密后的结果也可能不一样,以实际加密结果为准

2.代码解析加密

在demo-gateway项目解析加密数据

@RestController
public class InfoController {
    @Value("${eureka.port}")
    private String port;

    @GetMapping("/port")
    public String getPort() {
        return "配置文件中的端口为:" + this.port;
    }
}

思维导图

在这里插入图片描述

补充:bootstrap.yml和application.yml的区别

大家都知道,SpringBoot默认支持properties(.properties)和YAML(.yml .yaml )两种格式的配置文件。

加载顺序
  1. 若application.yml 和bootStrap.yml 在同一目录下 :bootstrap.yml先加载 application.yml后加载。

  2. bootstrap.yml 用于应用程序上下文的引导阶段。bootstrap.yml 由父Spring ApplicationContext加载。

  3. 父ApplicationContext 被加载到使用 application.yml 的之前。

如果resource里面同时有application.properties 和 application.yml,且存在相同的配置,则application.properties会覆盖application.yml里面的属性,因为application.properties 会后加载,也就是说哪个文件被最后加载,哪个才具有最高级。(application会覆盖bootstrap中的非引导配置)

配置区别
  1. bootstrap.yml 和application.yml 都可以用来配置参数。

  2. bootstrap.yml 用来程序引导时执行,应用于更加早期配置信息读取. 可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。

  3. application.yml 可以用来定义应用级别的, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等.如果加载的application.yml的内容标签与bootstrap的标签一致,application会覆盖bootstrap, 而application.yml 里面的内容可以动态替换。

典型的应用场景如下:
  1. 当使用 Spring Cloud Config Server 的时候,你应该在 bootstrap.yml 里面指定 spring.application.name 和 spring.cloud.config.server.git.uri
  2. 和一些加密/解密的信息
为何需要把 config server 的信息放在 bootstrap.yml 里?
  • 当使用 Spring Cloud 的时候,配置信息一般是从 config server 加载的,为了取得配置信息(比如密码等),你需要一些提早的或引导配置。因此,把 config server 信息放在 bootstrap.yml,用来加载真正需要的配置信息。

  • 当然,在一些情况上不用那么区分这两个文件,你只需要使用application文件即可,把全部选项都写在这里,效果基本是一致的,在不考虑上面的加载顺序覆盖的问题上。

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

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

相关文章

玩游戏也能学好 JavaScript 啦?

最近有朋友问&#xff0c;应该如何学好 JavaScript。不过我做了好多年的后端开发&#xff0c;JavaScript 虽然也是有所接触&#xff0c;但肯定是谈不上精通。在将朋友介绍给公司的前端大神之后&#xff0c;突然想到&#xff0c;学习编程本身还是一个挺枯燥的事情&#xff0c;如…

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Management of External Data (SQL/MED) 2003 年&#xff0c;SQL…

【大数据】Hadoop 2.X和1.X升级优化对比

目录 1.前言 2.hadoop 1.X的缺点和优化方向 3.解决NameNode的局限性 3.1.Hadoop HA 3.2.Haddop federation 4.yarn 5.周边组件 1.前言 本文是作者大数据系列中的一文&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?spm10…

相机系列——相机标定简述

作者&#xff1a;木一 对相机系列感兴趣还可看前文了解更多相关内容&#xff1a; 相机系列——透视投影&#xff1a;针孔相机模型 VR/AR/XR背后的逻辑&#xff1f;离不开三维引擎相机 引言 上文我们介绍了针孔相机模型&#xff0c;用来描述相机的透视投影成像过程&#xf…

数据要素的大海,如何流向千行百业?

文&#xff5c;白 鸽 编&#xff5c;王一粟 当数智化的风吹向银行业&#xff0c;是从底层数据的融合开始的。 在银行风控场景中&#xff0c;一个人想要进行风险投资或借贷&#xff0c;银行往往会评估这个人的信贷和风控策略。在以往的办理模式中&#xff0c;会需要办理人…

看看最新的B端登录界面,你是不是被潮流抛弃了?

毛玻璃风格&#xff08;Frosted Glass Style&#xff09;是新拟态设计风格中的一种分支&#xff0c;它灵感来源于现实世界中的毛玻璃材质。毛玻璃是一种通过在玻璃表面加工处理的方式&#xff0c;使其具有模糊、云翳和透明效果的特殊玻璃。 在设计中&#xff0c;毛玻璃风格通常…

OrangePi Kunpeng Pro体验——安装Hass与驱动SPI小屏幕

OrangePi Kunpeng Pro 是一款面向开发者和爱好者的高性能开发板。在本次测评中&#xff0c;主要将以前的一些代码在该开发板上实现&#xff0c;包括docker部署hass&#xff0c;引脚驱动SPI小屏幕。中间遇到了一些小小问题&#xff0c;但都成功了&#xff0c;一起来试试吧~ 一、…

NoSQL是什么?NoSQL数据库存在SQL注入攻击?

一、NoSQL是什么&#xff1f; NoSQL&#xff08;Not Only SQL&#xff09;是一种非关系型数据库的概念。与传统的关系型数据库不同&#xff0c;NoSQL数据库使用不同的数据模型来存储和检索数据。NOSQL数据库通常更适合处理大规模的非结构化和半结构化数据&#xff0c;且能够…

n后问题 回溯笔记

问题描述 在nn格的棋盘上放置彼此不受攻击的n个皇后。 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同 一行或同一列或同一斜线上的棋子。n后问题等价于在nn格的棋盘上放置n个皇后&#xff0c;任何2个皇后不放在同一行或同一列或同一斜线上。 代码 import java.uti…

史上最全排序算法整理!(1)

1.排序的概念及其应用 1.1排序的概念 排序是计算机内经常进行的一种操作&#xff0c;其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序&#xff0c;若整个排序过程不需要访问外存便能完成&#xff0c;则称此类排序问题为内部排序。反之&#…

linnux上安装php zip(ZipArchive)、libzip扩展

安装顺序&#xff1a; 安装zip&#xff08;ZipArchive&#xff09;&#xff0c;需要先安装libzip扩展 安装libzip&#xff0c;需要先安装cmake 按照cmake、libzip、zip的先后顺序安装 下面的命令都是Linux命令 1、安装cmake 确认是否已安装 cmake --version cmake官网 未安装…

基于k-NN + GCN的轴承故障诊断模型

目录 往期精彩内容&#xff1a; 创新点&#xff1a; 前言 1 轴承故障数据的预处理 1.1 导入数据 1.2 数据预处理&#xff0c;制作数据集 2 基于Pytorch的GCN轴承故障诊断 2.1 定义GCN分类网络模型 2.2 设置参数&#xff0c;训练模型 2.3 模型评估 代码、数据如下&…

乡村振兴与农业科技创新:加大农业科技研发投入,推动农业科技创新,促进农业现代化和美丽乡村建设

一、引言 在当代中国&#xff0c;乡村振兴已成为国家发展的重要战略之一。作为国民经济的基础&#xff0c;农业的发展直接关系到国家的稳定和人民的福祉。随着科技的不断进步&#xff0c;农业科技创新在推动农业现代化和美丽乡村建设中发挥着越来越重要的作用。本文旨在探讨如…

深入理解JVM:内存结构、垃圾收集与性能调优

目录 JDK、JRE、JVM关系? 启动程序如何查看加载了哪些类&#xff0c;以及加载顺序? class字节码文件10个主要组成部分? JVM结构 画一下JVM内存结构图 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池? 什么时候抛出StackOverflowError? 例如&…

SAP_SD模块 物料科目分配/成本简介

SAP系统各模块与财务都有个方面的集成。文本主要说明销售模块中的科目分配和成本的一个对应关系。 1、首先是在物料主数据上销售视图中的物料科目分配组&#xff0c;S1主营、S2材料等字段&#xff0c;物料销售的时候会将这个物料产生的记录到对应的科目中。 首先是物料主数据中…

FreeRTOS【7】队列使用

1.开发背景 操作系统提供了多线程并行的操作&#xff0c;为了方便代码的维护&#xff0c;各个线程都分配了专用的内存并处理对应的内容。但是线程间也是需要协助操作的&#xff0c;例如一个主线程接收信息&#xff0c;会把接收的信息并发到其他线程&#xff0c;即主线程不阻塞&…

数分之SQL查询电商数据案例

1,Python连接SQL数据库 以下是使用Python连接MySQL数据库并进行操作的示例代码&#xff1a; import random import time import pymysql# 定义名字数据 xing ["王", "李", "张", "刘", "陈", "杨", "黄&q…

2024年 云南 融资融券怎么开通,利率多少?4.2

一个小动作&#xff0c;每年节约几万块&#xff1f; 勤俭节约的传统&#xff0c;真的在很多年轻人当中是被嫌弃的&#xff0c;有人要说“吃多了对身体也不好”、“反正食堂饭菜很便宜”之类 但是有效利用资源的观念还是需要培养的。最近了解到很多朋友在券商融资利率很高6%&a…

Pyinstaller打包exe文件解决指南

打包命令 打包 Python 文件 输入如下格式的命令即可 默认命令 Pyinstaller 文件名.py Pyinstaller -option1 -option2 -... 要打包的文件 Pyinstaller 文件名.pyPyinstaller -option1 -option2 -... 要打包的文件 参数选项比较多&#xff0c;这里我列一个表&#xff1a;…

Downie 4 for Mac:视频下载的新选择

对于Mac用户来说&#xff0c;想要轻松下载网上的视频内容&#xff0c;Downie 4无疑是一个绝佳的选择。这款专为Mac打造的视频下载工具&#xff0c;凭借其强大的功能和简洁的操作界面&#xff0c;让视频下载变得轻松又高效。 Downie 4支持从众多网站下载视频&#xff0c;包括各…