05-Nacos服务配置中心应用实践

第三步: 将项目sca-provider的application.yml的名字修改为bootstrap.yml(启动优先级最高),并添加配置中心配置,代码如下:

spring:

application:

name: sca-provider

cloud:

nacos:

discovery:

server-addr: 127.0.0.1:8848

config:

server-addr: 127.0.0.1:8848

file-extension: yml # Configure the data format of the content, default to properties

新建Nacos配置


打开nacos配置中心,新建配置,如图所示:

在这里插入图片描述

其中,Data ID的值要与bootstrap.yml中定义的spring.application.name的值相同(服务名-假如有多个服务一般会创建多个配置实例,不同服务对应不同的配置实例)。配置发布以后,会在配置列表中,显示我们的配置,例如:

在这里插入图片描述

测试Nacos数据读取


配置创建好以后,启动sca-provider服务,然后打开浏览器,输入http://localhost:8081/provider/log/doLog01,检测idea控制台日志输出。然后再打开nacos控制台动态更新日志级别,再访问资源并检测后台日志输出.

在这里插入图片描述

然后,修改nacos配置中心的日志级别,再刷新浏览器,检测日志的输出,是否会发生变化.

@RefreshScope注解的应用


对于nacos配置中心而言,有系统内部对配置变化的感知,还有外部系统对配置的感知,假如我们系统在浏览器中能看到日志级别的变化,该如何实现呢?我们现在来实现一个案例.

第一步:在ProviderLogController类的上面添加一个@RefreshScope注解,例如:

@RefreshScope

@RestController

public class ProviderLogController{

//…

}

其中,@RefreshScope的作用是在配置中心的相关配置发生变化以后,能够及时看到类中属性值的更新(底层是通过重新创建Controller对象的方式,对属性进行了重新初始化)。

第二步:添加ProviderLogController中添加一个获取日志级别(debug<info<warn<error)的的属性和方法,代码如下:

@Value(“${logging.level.com.jt:error}”)

private String logLevel;

@GetMapping(“/provider/log/doLog02”)

public String doLog02(){

log.info(“log level is {}”,logLevel);

return "log level is "+logLevel;

}

第三步:启动sca-provider服务,然后打开浏览器并输入http://localhost:8081/provider/log/doLog02进行访问测试。

说明,假如对配置的信息访问不到,请检测项目配置文件的名字是否为bootstrap.yml,检查配置文件中spring.application.name属性的值是否与配置中心的data-id名相同,还有你读取的配置信息缩进以及空格写的格式是否正确.

小节面试分析


  • 配置中心一般都会配置什么内容?(可能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则)

  • 什么信息一般不会写到配置中心?(服务端口,服务名,服务的注册地址,配置中心)

  • 项目中为什么要定义bootstrap.yml文件?(此文件被读取的优先级比较高,可以在服务启动时读取配置中心的数据)

  • Nacos配置中心宕机了,我们的服务还可以读取到配置信息吗?(可以从内存,客户端获取了配置中心的配置信息以后,会将配置信息在本地内存中存储一份.)

  • 微服务应用中我们的客户端如何获取配置中心的信息?(我们的服务一般首先会从内存读取配置信息,同时我们的微服务还可以定时向nacos配置中心发请求拉取(pull)更新的配置信息)

  • 微服务应用中客户端如何感知配置中心数据变化?(1.4.x版本的nacos客户端会基于长轮询机制从nacos获取配置信息,所谓的长轮询就是没有配置更新时,会在nacos服务端的队列进行等待.)

  • 服务启动后没有从配置中心获取我们的配置数据是什么原因?(依赖,配置文件名字bootstrap.yml,配置中心的dataId名字是否正确,分组是否正确,配置的名字是否正确,缩进关系是否正确,假如是动态发布,类上是否有@RefreshScope注解)

  • 你项目中使用的日志规范是什么?(SLF4J)

  • 你了解项目中的日志级别吗?(debug,info,error,…,可以基于日志级别控制日志的输出)

Nacos配置管理模型

=====================================================================

概述


Nacos 配置管理模型由三部分构成,如图所示:

在这里插入图片描述

其中:

  • Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。

  • Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。

  • Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。

命名空间设计


Nacos中的命名空间一般用于配置隔离,这种命名空间的定义一般会按照环境(开发,生产等环境)进行设计和实现.我们默认创建的配置都存储到了public命名空间,如图所示:

在这里插入图片描述

创建新的开发环境并定义其配置,然后从开发环境的配置中读取配置信息,该如何实现呢?

第一步:创建新命名空间,如图所示:

在这里插入图片描述

命名空间成功创建以后,会在如下列表进行呈现。

在这里插入图片描述

在指定命名空间下添加配置,也可以直接取配置列表中克隆,例如:

在这里插入图片描述

在这里插入图片描述

克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置,如图所示:

在这里插入图片描述

此时我们修改dev命名空间中Data Id的sca-provider配置,如图所示:

在这里插入图片描述

修改项目module中的配置文件bootstrap.yml,添加如下配置,关键代码如下:

spring:

cloud:

nacos:

config:

namespace: 6058fd3f-0d4d-44f2-85d6-5fc7d2348046

……

其中,namespace后面的字符串为命名空间的id,可直接从命名空间列表中进行拷贝.然后重启服务,继续刷新http://localhost:8081/provider/log/doLog02地址。检测输出,看看输出的内容是什么,是否为dev命名空间下配置的内容。

分组设计及实现


当我们在指定命名空间下,按环境或服务做好了配置以后,有时还需要基于服务做分组配置,例如,一个服务在不同时间节点(节假日,活动等)切换不同的配置,可以在新建配置时指定分组名称,如图所示:

在这里插入图片描述

其中,这里的useLocalCache为自己定义的配置值,表示是否使用本地缓存.

配置发布以后,修改boostrap.yml配置类,在其内部指定我们刚刚创建的分组,代码如下:

server:

port: 8081

spring:

application:

name: sca-provider

cloud:

nacos:

config:

server-addr: 127.0.0.1:8848

group: DEFAULT_GROUP_51 # Group, default is DEFAULT_GROUP

file-extension: yml # Configure the data format of the content, default to properties

namespace: 7da4aa75-f64c-43c6-b101-9d77ad96f1c0

在指定的Controller类中添加属性和方法用于获取和输出DEFAULT_GROUP_51中的useLocalCache的值,代码如下:

package com.jt.provider.controller;

@RefreshScope

@RestController

public class ProviderCacheController {

@Value(“${useLocalCache:false}”)

private boolean useLocalCache;

@RequestMapping(“/provider/cache01”)

public String doUseLocalCache01(){

return "useLocalCache’value is "+useLocalCache;

}

}

然后重启服务,进行访问测试,检测内容输出。

在这里插入图片描述

共享配置设计及读取


当同一个namespace的多个配置文件中都有相同配置时,可以对这些配置进行提取,然后存储到nacos配置中心的一个或多个指定配置文件,哪个微服务需要,就在服务的配置中设置读取即可。例如:

第一步:在nacos中创建一个共享配置文件,例如:

在这里插入图片描述

其中,这里的secret可以理解为一个密钥。

第二步:在指定的微服务配置文件(bootstrap.yml)中设置对共享配置文件的读取,例如:

spring:

application:

name: sca-provider

cloud:

nacos:

config:

server-addr: localhost:8848

命名空间

namespace: 83ed55a5-1dd9-4b84-a5fe-a734e4a6ec6d

分组名

group: DEFAULT_GROUP

配置中心文件扩展名

file-extension: yml

共享配置

shared-configs[0]:

data-id: app-public.yml

refresh: true #默认false,共享配置更新,引用此配置的地方是否要更新

第三步:在指定的Controller类中读取和应用共享配置即可,例如:

package com.jt.provider.controller;

@RefreshScope

@RestController

public class ProviderSecretController {

@Value(“${app.secret:123456}”)

private String secret;

@GetMapping(“/provider/secret”)

public String doGetSecret(){

//return String.format()

return "The Secret is "+secret;

}

}

第四步:启动服务,然后打开浏览器进行访问测试。

在这里插入图片描述

小节面试分析


  • Nacos配置管理模型的背景?(环境不同配置不同)

  • Nacos配置中的管理模型是怎样的?(namespace,group,service/data-id)

  • Nacos客户端(微服务)是否可以读取共享配置?(可以)

总结(Summary)

=====================================================================

重难点分析


  • 配置中心的选型。(市场活跃度、稳定性、性能、易用)

  • Nacos配置中心基本应用。(新建,修改、删除配置以后,在Nacos客户端应用配置)

  • 配置管理模型应用。(namespace,group,service/dataId)

  • Nacos配置变更的动态感知。(底层原理分析)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

笔者福利

以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。

有了这个,面试踩雷?不存在的!

回馈粉丝,诚意满满!!!




《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

[外链图片转存中…(img-qfLZXDRS-1713371199058)]

笔者福利

以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。

有了这个,面试踩雷?不存在的!

回馈粉丝,诚意满满!!!

[外链图片转存中…(img-XvJ5uixf-1713371199058)]
[外链图片转存中…(img-qG9Lg21t-1713371199058)]
[外链图片转存中…(img-nUpkPYww-1713371199059)]
[外链图片转存中…(img-j4t9siH7-1713371199059)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值