Nacos学习:二、配置中心

news2025/2/26 6:03:48

2. 配置中心

配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlGDiZgq-1675156461849)(assets/image-20221004075445937.png)]

配置中心的服务流程如下:

1、用户在配置中心更新配置信息。

2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。

总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。

​ 在系统架构中,配置中心是整个微服务基础架构体系中的一个组件,它的功能看上去并不起眼,无非就是配置的管理和存取,但它是整个微服务架构中不可或缺的一环。

总结一下,在传统巨型单体应用纷纷转向细粒度微服务架构的历史进程中,配置中心是微服务化不可缺少的一个系 统组件,在这种背景下中心化的配置服务即配置中心应运而生,一个合格的配置中心需要满足如下特性:

  • 配置项容易读取和修改
  • 分布式环境下应用配置的可管理性,即提供远程管理配置的能力
  • 支持对配置的修改的检视以把控风险
  • 可以查看配置修改的历史记录
  • 不同部署环境下应用配置的隔离性

2.1 主流配置中心对比

目前市面上用的比较多的配置中心有:Spring Cloud Config、Apollo、Nacos和Disconf等。 由于Disconf不再维护,下面主要对比一下Spring Cloud Confifig、Apollo和Nacos。

对比项Spring Cloud ConfigApolloNacos
配置实时推送支持(Spring Cloud Bus)支持(HTTP长轮询1s内)支持(HTTP长轮询1s内)
版本管理支持(Git)支持支持
配置回滚支持(Git)支持支持
灰度发布支持支持支持
权限管理支持(依赖Git)支持不支持
多集群支持支持支持
多环境支持支持支持
监听查询支持支持支持
多语言只支持java主流语言,提供了Open API主流语言,提供了Open API
配置格式校验不支持支持支持
单机读(QPS)7(限流所致)900015000
单机写(QPS)5(限流所致)11001800
3节点读 (QPS)21(限流所致)2700045000
3节点写(QPS)5(限流所致)33005600

从配置中心角度来看:

  • 性能方面Nacos的读写性能最高,Apollo次之,Spring Cloud Config依赖Git场景不适合开放的大规模自动化运维API。
  • 功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能,而Spring Cloud Config不带运维管理界面,需要自行开发。
  • Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比 Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。

综合来看,Nacos的特点和优势还是比较明显的,下面我们一起进入Nacos的世界。 Nacos除了可以做注册中心,同样可以做配置管理来使用。

2.2 Nacos 统一配置管理

​ 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行, 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。所以一套集中式的、动态的配置管理是必不可少的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utEYtnkF-1675156461850)(assets/image-20220930223837932.png)]

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

2.2.1 在nacos中添加配置文件

到我们的nacos管理页面的配置管理界面来添加配置文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JnrM9hFj-1675156461852)(assets/image-20220930224940416.png)]

然后在弹出的表单中,填写配置信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Wdf18nW-1675156461852)(assets/image-20221001080806466.png)]


注意:

​ 项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

2.2.2 从微服务拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但如果尚未读取application.yml,又如何得知nacos地址呢?

因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KfV0Oevd-1675156461852)(assets/image-20221001080954898.png)]

步骤:

1)引入nacos-config依赖

首先,在shop-order服务中,引入nacos-config的客户端依赖:

<!--nacos-config-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2)添加bootstrap.yaml

然后,在user-service中添加一个bootstrap.yaml文件,内容如下:

spring:
  application:
    name: orderservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yml # 文件后缀名

这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。

本例中,就是去读取orderservice-dev.yml

启动shop-order,我们可以从控制台查看日志发现,它已经从nacos读取配置文件了:

2022-10-01 08:37:39.523  INFO 29664 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-orderservice-dev.yml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-orderservice.yml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-orderservice,DEFAULT_GROUP'}]
2022-10-01 08:37:39.523  INFO 29664 --- [           main] com.suke.shop.order.OrderApplication     : The following profiles are active: dev
2022-10-01 08:37:40.375  INFO 29664 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=db95bdfc-3380-37b0-be7b-eab77e21a2be

我们访问服务,也正常访问

2.3 配置热更新

我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

要实现配置热更新,可以使用两种方式:

2.3.1.方式一

在@Value注入的变量所在类上添加注解@RefreshScope,并且对应的@Bean需要添加@RefreshScope

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;

@SpringBootConfiguration
@RefreshScope
public class DataSourceConfig {
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;

    @Bean
    @RefreshScope
    public DataSource getDataSource(){
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setJdbcUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

2.3.2 方式二

使用@ConfigurationProperties注解代替@Value注解。

在shop-order服务中,在DataSourceConfig类添加@ConfigurationProperties注解:

student: 
 name: lisi
 age: 21
 sex:
@Data
@ConfigurationProperties(prefix = "student")
@Component
public class Student {
    private String name;
    private Integer age;
    private String sex;
}

@GetMapping("/student")
public Student getStudent(){
    return student;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-laDIHqW1-1675156461853)(assets/image-20221002170011571.png)]

当我们把name修改为zhangsan,age修改为22,再访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k2QdUvU1-1675156461853)(assets/image-20221002170104197.png)]

此时,我们发现数据以及热更新了

2.4 配置共享

其实微服务启动时,会去nacos读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:orderservice-dev.yaml

  • [spring.application.name].yaml,例如:orderservice.yaml

[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

下面我们通过案例来测试配置共享

2.4.1 添加一个环境共享配置

我们在nacos中添加一个orderservice.yaml文件:

[外链图片转存中...(img-6sm4b9gY-1675156461854)]

2.4.2 在Student类中读取共享配置

[外链图片转存中...(img-lubbE6F7-1675156461854)]

2.4.3 运行shop-order,使用不同的profile

[外链图片转存中...(img-VyixAXXg-1675156461854)]

请求controller,我们发现student的id有值:

在这里插入图片描述

这说明我们的orderservice.yml文件已被共享了

注意:

当nacos、服务本地同时出现相同属性时,优先级有高低之分:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71pcKFXN-1675156461855)(assets/image-20221002172650143.png)]

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

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

相关文章

uni-app - H5 网站项目接入集成 51LA 网站统计详细教程(提供 51LA.js 官方插件与引入教程)

前言 如果您需要 Nuxt.js H5 网站项目的引入方式,请访问:Nuxt.js - 网站项目接入 51LA 网站统计 这个需求不常见,网上几乎没有教程,本文来做最新最好用的引入方案。 本文实现了 uniapp 开发的 H5 网页项目,要求接入 51LA 网站统计 的需求, 跟着本文,简简单单的几个步骤…

【HTML】有趣的代码合集(附源码)

文末有源码下载&#xff0c; “窝” 不信你全都看不上 文章目录CSS3 登录表单 个性化登录按钮可爱的CSS3圆盘时钟动画jQuery登录表单CSS3超酷弹出对话框 兼容移动端HTML5翻牌消除小游戏交互式分享按钮 可横向展开HTML5文件上传美化表单 支持拖拽上传纯CSS3加载Loading动画图 12…

unity怎样让玩家在不同材质上行走具有不同脚步声音效

问题:玩家在草地,雪地,木板上行走需要不同的脚步声音效,且无论行走还是奔跑,音效都要和脚步动画同步.思路:在动画上添加事件触发脚步声音效,并判断地面的材质然后播放不同的音效.实现:一.判断地面材质第一种情况是在unity内置terrain上行走地面有草地,石地,木地等,需要有不同音…

【蓝桥杯】历届试题 成绩统计(省赛)Java

【资源限制】 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 【问题描述】 小蓝给学生们组织了一场考试&#xff0c;卷面总分为 100 分&#xff0c;每个学生的得分都是一个 0 到 100 的整数。…

计算机网络概念:

CDN:全国各地因为距离,加速响应,也因此可以节省带宽成本.DNS:域名解析器OSI七层模型:应用层:类比填写的数据报文表示层:类比浏览器层会话层:类比cookie或者token记录上次信息传输层:所谓的三次握手和四次挥手发生在这一层,进程到进程网络层:类似于ip通过路由器找到另一ip,服务器…

Web3中文|元宇宙如何更具包容性?

一旦新技术在发展过程中发生意外&#xff0c;受到最大伤害的往往会是边缘化的群体。 打个比方&#xff0c;自动决定内容访问权限和图像阐释方式的算法实际上受到了种族主义和性别歧视的影响。而拥有多种边缘化身份的人通常面临更大的风险。 这就是为什么当我听到马克扎克伯格…

Linux系统Shell脚本第六章:文件三剑客之sed

目录 一、文本三剑客之sed 1、基本用法 2、sed脚本语法及命令 3、sed选项 4、sed的查找替换使用 5、后向引用 6、变量 一、文本三剑客之sed 1、基本用法 sed [选项]... {自身脚本语法};.... [input file...] 举例&#xff1a; seq 5 |sed #生成1-5数字传给sed #该…

配置python虚拟环境配置【Pycharm为例】 2023年2月1日 14点43分

文章目录1. 新建一个项目2. 新建文件&#xff0c;创建项目3. 此时文件结构4. 安装环境样例5. 检查当前环境点击【解释器设置】点击同开头设置环境6. 开始安装根目录下有这个文件点击【终端】7. 激活虚拟环境7.1 如果出现以下错误([参考链接](https://blog.csdn.net/e5pool/arti…

大数据是干什么的,TOOM大数据舆情监测系统数据挖掘

舆情数据挖掘是指从大量的舆情数据中&#xff0c;通过使用数据挖掘、机器学习等技术&#xff0c;对舆情数据进行分析处理&#xff0c;提取有价值的信息&#xff0c;从而得到舆情分析结果。舆情数据挖掘的目的是了解舆论趋势、话题热点、网民情绪等&#xff0c;为决策提供数据支…

PowerBI实用技巧——利用DATEDIFF实现时间进度百分比

需求概述&#xff1a;根据系统默认时间当年1月~当年12月为一年&#xff08;或指定财年&#xff09;进行时间百分比进度展示。一、默认正常时间进度实现效果&#xff0c;例如现在系统是2023年2月1日&#xff0c;截止当前年时间已经过去了全年的8.49%.1.解决思路&#xff1a;首先…

【Faster R-CNN】之 backbone 代码精读

1、前言 在上一篇文章 【Faster R-CNN】之 Resize_and_Padding 代码精读 中&#xff0c;我们得到了图像尺寸统一的 batch 了&#xff0c;接下来&#xff0c;就是 feed 到 backbone 中 获取 feature map。 2、backbone 1&#xff09;这里的 backbone 其实就是 迁移学习&#…

什么是数据治理?

我们这些搞数据治理的人&#xff0c;几乎每天都会说到“数据治理”这个词。但有很多人依然不清楚数据治理的确切含义&#xff0c;也搞不懂数据治理和数据管理的关系。这一节&#xff0c;我们就来认真辨析“数据治理”这个词。首先&#xff0c;我们来看一看国际数据管理协会DAMA…

C语言学习笔记-条件判断

C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 fals…

python基础学习2--模块、面向对象编程

一、模块 在python中&#xff0c;一个.py文件就称之为一个模块&#xff08;module)。为了避免模块重名冲突&#xff0c;pyton又引入了按目录来组织模块的方法&#xff0c;成为包(package)。 比如mycompany&#xff0c;按照如下目录存放&#xff1a; 引入了包以后&#xff0c;只…

【JavaGuide面试总结】Spring篇·上

【JavaGuide面试总结】Spring篇上1.谈谈自己对于 Spring IoC 的了解2.什么是 Spring Bean&#xff1f;3.将一个类声明为 Bean 的注解有哪些?4.注入 Bean 的注解有哪些&#xff1f;5.Component 和 Bean 的区别是什么&#xff1f;6.Autowired 和 Resource 的区别是什么&#xff…

私服 Nexus

Sonatype公司的一款maven私服产品。 下载地址&#xff1a; https://help.sonatype.com/repomanager3/download 启动命令&#xff1a; nexus.exe /run nexus 访问服务器&#xff08;默认端口&#xff1a;8081&#xff09;&#xff1a; http://localhost:8081 提示信息有密码所在…

【IoT】红外循迹避障小车

说明 随着生产自动化的发展需要&#xff0c;机器人已经越来越广泛地应用到生产自动化上&#xff0c;随着科学技术的发展&#xff0c;机器人的传感器种类也越来越多&#xff0c;其中红外传感器已经成为自动行走和驾驶的重要部件。 红外的典型应用领域为自主式智能导航系统&…

Unity开发入门吐血反思

年前Team Leader开会时曾说道&#xff0c;以后我们可能都要去参与Unity开发&#xff0c;当时我还兴致勃勃一连提了好几个问题&#xff0c;有没有领路人&#xff0c;文档是否充分等等&#xff0c;毕竟做Android之余多掌握门技术也不错&#xff0c;学到的就是赚到的&#xff0c;技…

倚天剑第一式——爬虫基础

博主简介&#xff1a;博主是一个大二学生&#xff0c;主攻人工智能领域研究。感谢缘分让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;C&#xff0c;python&#xff0c;爬虫等方面的知识分享。如果有需要的小伙伴&#xff0c;可以关注博主&#xff…

Docker部署ThingsBoard-Gateway ODBC数据上传(五)

目录 1、linux系统安装Docker 1.docker安装Python 2.安装ODBC包 2、docker安装运行tb-gateway 3、修改config配置文件 4、 安装ODBC驱动程序 5、重启docker 因为需要数据库ODBC数据上传&#xff0c;所以我选择单独部署在远程服务器的docker容器中。其原理大致是这样的&…