实用篇-Nacos配置管理

news2024/11/29 22:45:44

Nacos不仅具有注册中心的功能,还具有注册管理的功能

一、Nacos实现配置管理

可以使用统一配置管理,来配置更改热更新,整体结构如下

前提条件: 你已经把上面的 '实用篇-Nacos注册中心' 学完了,并且项目也跟着做了。我们下面会使用到上面的项目。具体操作如下

第一步: 浏览器访问http://localhost:8848/nacos/index.html,用户名和密码都是nacos,登录进管理面板

第二步: 在管理面板添加配置

注意上图中配置内容中的不是把项目中application.yml所有配置都写过来,而是只写有热更新需求的配置,配置完点击发布即可

上面我们只是把这个配置文件做出来了,至于微服务如何去读取我们做出来了的配置文件,下面会学习 

二、Nacos微服务配置拉取

在微服务去获取上面Nacos做出来了的配置文件,步骤如下图

具体步骤如下

第一步: 在UserService微服务的pom.xml,添加如下,引入Nacos的配置管理客户端依赖

<!--读取nacos配置管理依赖-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

第二步: 在UserService微服务中的resources目录新建File,文件名是bootstrap.yml。注意bootstrap.yml文件是引导文件,优先级高于application.yml文件。添加如下

spring:
  application:
    # 服务名称
    name: UserService
  profiles:
    # 环境,dev表示开发环境
    active: dev
  cloud:
    nacos:
      # nacos的服务地址
      server-addr: localhost:8848
      config:
        # 我们创建的dev命名空间
        namespace: d8ec5ecb-2268-4551-ac2d-f08953292b28 
        # 文件后缀名
        file-extension: yaml

第三步: 把application.yml中删掉如下。跟刚刚的bootstrap.yml重复的代码给删掉,也就是如果代码重复的话只保留bootstrap.yml的代码,操作后application.yml文件如下

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password:
    driver-class-name: com.mysql.jdbc.Driver



#     # 跨集群部署
#      discovery:
#        cluster-name: SH   # 自定义集群的名字

mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

#eureka:
#  client:
#    service-url:
#      # eureka的服务地址。如果有多个的话,逗号隔开。也就是把当前这个user-service微服务注册给哪个Eureka
#      defaultZone: http://localhost:8686/eureka

第四步: 验证UserService微服务有没有拉取到配置文件。在UserService微服务的web目录的UserController类里面添加如下 

 //验证配置拉取是否成功,我们直接在这里去读取拉取过来的配置,如果能拉取就表示验证成功
    @Value("${pattern.dateformat}")
    private String dataformat;

    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dataformat));
    }

第五步: 测试。重新启动UserService微服务,浏览器访问 http://localhost:8081/user/now

 

上面我们已经实现了读取Nacos上写的配置文件,但是存在一个问题,如果配置文件修改了那必须重启服务才能生效修改后的配置。

能不能让Nacos中写的配置文件实现热更新呢,也就是实时生效,不需要重新启动微服务

三、配置热更新

方式①

Nacos中的配置文件变更后,微服务无需重启就可以感知,实现的方式有两种,如下:

第一种: 在@Value注入的变量所在类(也就是我们上面的UserController类)上添加注解@RefreshScope

第一种的具体操作如下

第一步: 在UserService微服务的web目录的UserController类添加如下,并重新启动UserService微服务的实例

第二步: 修改浏览器上写的配置文件,修改为如下,点击发布

pattern:
  dateformat: yyyy.MM.dd HH:mm:ss

第三步: 查看是否实现热更新,浏览器访问,可以看到,直接访问的是更新后的配置,而无需重启服务

方式②

第二种配置热更新方式是: 使用@ConfigurationProperties注解

第一步:在user-service项目下创建config/PatternProperties类

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix = "pattern")  //配置属性前缀名
public class PatternProperties {
     private String dateformat;  
}

 第二步: 在user-service微服务项目的web目录的UserController类修改为如下

package cn.itcast.user.web;

import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping("/user")
//@RefreshScope
public class UserController {

    @Autowired
    private UserService userService;
    
    @Autowired
    private PatternProperties patternProperties;

    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }

    //验证配置拉取是否成功,我们直接在这里去读取拉取过来的配置,如果能拉取就表示验证成功
//    @Value("${pattern.dateformat}")
//    private String dataformat;

    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }
}

第三步: 测试。重新启动UserService微服务,先访问一下能不能拿到配置文件里面的数据

修改nacos配置如下

 点击发布,不重启项目,直接访问

 总结

两种微服务热更新的方式,总结

  • 第一种: 通过@Value注解注入,结合@RefreshScope注解来刷新
  • 第二种: 通过@ConfigurationProperties注解注入,实现刷新

注意事项:

  • 不是所有的配置都适合放到配置中心(nacos不仅是注册中心,还是配置中心),维护起来比较困难
  • 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

四、多环境配置共享

场景: 有一个配置属性,该配置属性在开发、生产、测试等环境下的值是一样的,我们就不用在每个配置文件里面都写一份,而是使用多环境配置共享。简单说就是把配置写在一个地方,不管环境怎么变,配置都能被加载。下面将进入学习

微服务启动时会从nacos里自动读取两种配置文件。如下

注意除了这两种nacos '线上配置文件' ,微服务还有自身的application.yml配置文件(叫 '本地配置文件' )。所以微服务启动时会自动读取这三种

(1)、当微服务启动时,会根据环境加载对应的配置文件

  • [spring.application.name]-[spring.profiles.active].yaml,例如: userservice-dev.yaml。格式: 服务名-环境.yaml

(2)、当微服务启动时,必然会加载这类的配置文件。我们可以把多环境共享配置写入这个文件

  • [spring.application.name].yaml,例如: userservice.yaml。格式: 服务名.yaml

(3)、微服务自身的application.yml配置文件(叫 '本地配置文件' )

案例如下

第一步: 在浏览器的nacos管理界面添加一个新的配置文件,作为我们下面要学的多环境配置文件

第二步: 读取我们刚写的配置文件(共享配置文件)的属性。把user-service微服务项目的config目录的PatternProperties类,修改为如下

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix = "pattern")  //配置属性前缀名
public class PatternProperties {
     private String dateformat;
     private String envSharedValue;
}

第三步: 为方便直观的展示是否读取到 '共享配置文件' 的配置,我们在user-service微服务项目的web目录的UserController类,修改为如下 

package cn.itcast.user.web;

import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
@RestController
@RequestMapping("/user")
//@RefreshScope
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private PatternProperties patternProperties;

    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }

    //验证配置拉取是否成功,我们直接在这里去读取拉取过来的配置,如果能拉取就表示验证成功
//    @Value("${pattern.dateformat}")
//    private String dataformat;

    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }

    @GetMapping("prop")
    public PatternProperties properties(){
        return patternProperties;
    }

}

第四步: 为方便直观的展示是否读取到 '共享配置文件' 的配置,我们在user-service微服务项目的8082端口改成test

第五步: 启动8081和8082端口

访问8081端口

 访问8081端口

 

思考:

对于8081和8082端口的dev环境的实例来说,是能够同时读取到本地配置文件、当前环境的配置文件、共享配置文件。后两者配置文件我们都是在浏览器配置的,其实本身项目代码里有一个配置文件(application.yml)。当本身的yml配置文件跟这俩浏览器配置的冲突了,以谁为准呢 

1、本地的application.yml配置文件跟当前环境的配置文件冲突时,当前环境的配置文件(UserService-dev.yaml)优先级更高

2、本地的application.yml配置文件跟共享配置文件冲突时,共享配置文件(UserService.yaml)优先级更高

3、当前环境的配置文件跟共享配置文件冲突时,当前环境的配置文件(UserService-dev.yaml)优先级更高

优先级排序。profile表示环境的意思,可以是dev开发环境,也可以是test测试环境。排序如下:

服务名-profile.yaml > 服务名.yaml > 本地配置

五、Nacos集群搭建

① 搭建MySQL集群并初始化数据库表
②下载解压nacos
③修改集群配置(节点信息)、数据库配置
④分别启动多个nacos节点
⑤nginx反向代理

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

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

相关文章

Python 接口自动化 —— requests框架

1.前言 Python内置的urllib模块&#xff0c;也可以用于访问网络资源。但是&#xff0c;它用起来比较麻烦&#xff0c;而且&#xff0c;缺少很多实用的高级功能。因此我们使用 requests 模块进行进行接口测试。 requests官方文档资料地址&#xff1a;http://cn.python-request…

操作系统:进程与线程(二)同步与互斥B

一战成硕 2.3.5 管程2.3.6 经典同步问题 2.3.5 管程 管程的特性保证了进程互斥&#xff0c;无需程序员自己实现互斥&#xff0c;降低了死锁发生的可能。 管程的定义 管程是一种高级的同步机制。 定义描述举例 条件变量 2.3.6 经典同步问题 生产者消费者问题 缓冲区没满&a…

会说话,得天下!演讲与口才训练必修课

会说话&#xff0c;得天下&#xff01;演讲与口才训练必修课 口才是现代职场上一项非常重要的素质。有了好的口才&#xff0c;不仅可以很好地展示自己的思想和见解&#xff0c;还可以影响他人并获得支持&#xff0c;这对个人职业发展十分重要。所以&#xff0c;学习如何进行出…

详解 DES加密技术 | 凯撒密码 | 栅栏密码

目录 密码学 恺撒密码 栅栏密码 消息和加密 密码的三个特性 算法和密钥 对称算法 公开密钥算法 DES对称加密技术 DES算法的安全性 DES算法的原理 DES算法的实现步骤 IP置换表和IP-1逆置换表 函数f 子密钥ki S盒的工作原理 DES算法的应用误区 密码学 密码学是一门…

Oracle (7)Online Redo Log Files

目录 一、Oracle Online Redo Log Files及其相关内容介绍 1、Online Redo Log Files简介 2、Online Redo Log Files特点 3、Online Redo Log Files文件组 4、多路复用文件 5、联机重做日志文件工作方式 6、LGWR什么时候写重做 7、LS和LSN 8、删除Redo文件成员 9、删除…

【黑马程序员】mysql基础篇笔记

2023年10月26日12:21:09过一下 1.01.MySQL课程介绍(Av765670802,P1) 2.02. 基础-课程内容&数据库相关概念(Av765670802,P2) 3.03. 基础-概述-MySQL安装及启动(Av765670802,P3) 4.04. 基础-概述-数据模型(Av765670802,P4) 通过表来存储数据的数据库就叫做关系型数据库 …

centos7安装配置以及Linux常用命令

⭐⭐ linux专栏&#xff1a;linux专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.CentOS的安装 使用vi编辑ifcfg-ens33 二. 下载MobaXterm软件 2.1MobaXterm的用途 2.2 MobaXterm的使用 2.3下载插件vim 三.Linux常用命令 3.4 vi或vim编辑器 3.4.1 命令模式 3.4.2.…

面试官:给你40亿个数,你应该如何快速判断一个数是否在这40亿个数中?—— 位图 [ C++入门 ]

阅读导航 引言一、位图的概念1. 官方文档2. 基本概念 二、位图的实现1. 插入2. 删除3. 查找C模拟实现&#x1f534;完整代码 总结 引言 在C编程中&#xff0c;位图是一种常用的数据结构&#xff0c;用于高效地表示大量的布尔值。它通过使用一个二进制位来表示每个元素的存在与…

集成电路自动化测试的优势是什么?

集成电路自动化测试的优势主要包括&#xff1a; 提高效率&#xff1a;自动化测试可以显著提高测试效率&#xff0c;因为可以24小时不间断地进行测试&#xff0c;同时避免了人工测试中的误差和疏漏&#xff0c;节省了大量时间和人力成本。 提升精度&#xff1a;自动化测试的精…

MySQL|基础操作+8大查询方式汇总

MySQL操作 一、操作数据库 MySQL中可以创建多个数据库用于存储不同场景的表结构&#xff0c;学习MySQL之前&#xff0c;我们要先理清如下的关系&#xff1a; 数据库 --> 数据表 --> 字段 抛开数据库存储上限去考虑&#xff0c;每个数据库中可以包含无数个数据表&#xf…

Apriori介绍及代码批注

一、Apriori原理解析 1. 概述 关联规则分析是数据挖掘中最活跃的研究方法之一&#xff0c;目的是在一个数据集中找到各项之间的关联关系&#xff0c;而这种关系并没有在数据中直接体现出来。以超市的销售数据为例&#xff0c;当存在很多商品时&#xff0c;可能的商品组合数量…

MySQL的数据库操作、数据类型、表操作

目录 一、数据库操作 &#xff08;1&#xff09;、显示数据库 &#xff08;2&#xff09;、创建数据库 &#xff08;3&#xff09;、删除数据库 &#xff08;4&#xff09;、使用数据库 二、常用数据类型 &#xff08;1&#xff09;、数值类型 &#xff08;2&#xff0…

用Jmeter做微信小程序项目接口测试【案例】

公司新项目组开发一款微信小程序电商平台&#xff0c;为了更好保证产品质量&#xff0c;因此提出了需要进行接口测试。 从接口本身来讲&#xff0c;对其测试与其他项目应该是一样的。所以不难理解&#xff0c;我们要对小程序的接口测试需要准备的 材料有&#xff1a; 1、完备…

LCR 158. 库存管理 II 哈希 / 摩尔投票法

LCR 158. 库存管理 II - 力扣&#xff08;LeetCode&#xff09; 仓库管理员以数组 stock 形式记录商品库存表。stock[i] 表示商品 id&#xff0c;可能存在重复。请返回库存表中数量大于 stock.length / 2 的商品 id。 &#xff08;1&#xff09;方法一&#xff1a;先排序 题目…

​Profinet转EtherNET/IP从站连接欧姆龙plc与西门子200smart通讯的配置方法​

本案例是200smart plc与欧姆龙plc进行通讯的方法&#xff0c;远创智控YC-PNM-EIP网关可以读写全系列西门子 PLC 数据。一般不需要 PLC 里做特殊的设置。只需要把 PLC 的变量地址配置到网关中&#xff0c;网关就可以读取指定地址的数据或者写数据到指定的地址。 PLC 通过网线连接…

Android---Bitmap详解

每一个 Android App 中都会使用到 Bitmap&#xff0c;它也是程序中内存消耗的大户&#xff0c;当 Bitmap 使用内存超过可用空间&#xff0c;则会报 OOM。 Bitmap 占用内存分析 Bitmap 用来描述一张图片的长、宽、颜色等信息&#xff0c;可用使用 BitmapFactory 来将某一路径下…

浮点数在计算机中的二进制表示

文章目录 Part.I IntroductionPart.II 原理Part.III 代码验证Reference Part.I Introduction 首先要了解一下下面的知识&#xff1a; 1 位有两种状态&#xff1a;0 或 11 字节&#xff08;byte&#xff09; 8 位&#xff08;bit&#xff09; 2 7 128 2^7128 27128&#xff1…

rhcsa简单的查询命令

时间 date -s "20021125 12:00:00" date 052312002002 一.简单语法 hwclock --查看硬件时间 hwclock --show 查看硬件时间 hwclock -w 同步硬件时间和系统时间 hwclock -s 将硬件时钟同步到系统时间 hwclock -r 查看当前时间 cal 查看当前月份日历 cal 10 …

nodejs+vue+elementui+express基于体质分析的个性化健身方案生成系统与设计

基于体质分析的个性化健身方案生成系统与设计 客户端&#xff1a; 1、在健身系统中可以自己选择课程&#xff08;需先充值&#xff0c;金额大于课程价格才可购买&#xff0c;否则提示余额不足&#xff0c;请充值&#xff09;&#xff0c;完成课程后由该课程的发布教练评价评分…

Python文件——使用Python读取txt文件

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注. 目录 一、文件的编码 1. 什么是编码 2. 常见的编码 二、P…