配置中心概述
配置中心最基础的功能就是存储一个键值对,用户发布一个配置(configKey),然后客户端获取这个配置项(configValue);进阶的功能就是当某个配置项发生变更时,不停机就可以动态刷新服务内部的配置项。
Nacos配置入门
业务描述
在sca-provider项目中添加一个Controller对象,例如ProviderLogController,基于此Controller中的方法演示日志级别的配置
- 创建ProviderLogController对象
@RestController
@Slf4j //lombok中的这个注解用于告诉lombok,为我们类中创建一个org.slf4j.Logger对象
@RefreshScope //此注解描述类时,用于告诉系统底层,当配置中心内容发生变化,此对象要重新构建
public class ProviderLogController {
//private static final Logger log =
//LoggerFactory.getLogger(ProviderLogController.class);
@GetMapping("/provider/log/doLog01")
public String doLog01(){
System.out.println("==doLog01==");
log.trace("==trace==");
log.debug("==debug==");
log.info("==info==");
log.warn("==warn==");
log.error("==error==");
return "test log 01";
}
- 该类中,可以自己手动创建log对象,但是要注意log对象在哪个类中创建getLogger方法中的参数就要传入哪个类的字节码对象。
- 我们也可以使用添加**@Slf4j**注解的方式为我们的类中创建一个日志对象。
Slf4j有五个级别的log level可供选择,级别由上到下由低到高,优先级高的会被打印出来
其中:
debug:简单来说,对程序调试有利的信息都可以使用debug输出。
info:对用户有用的信息,比如最常见的打印接口入参和反参。
warn:可能会导致错误的信息,比如某个对象可能为null的场景判断。
error:顾名思义,发生错误的地方,最常见的catch代码块中的日志。
@RefreshScope 对nacos配置中心而言,有系统内部对配置变化的感知,还有外部对配置的感知,该注解描述类时,用于告诉系统底层,当我们的配置中心内容发生改变时,我们的该对象也要重新构建,使我们系统在浏览器中能看到日志级别的变化。
- 在sca-provider项目中添加如配置依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 将项目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
新建Nacos配置
打开nacos配置中心新建配置
其中,Data ID的值要与bootstrap.yml中定义的spring.application.name的值相同(服务名-假如有多个服务一般会创建多个配置实例,不同服务对应不同的配置实例)。
小结
- 配置中心一般都会配置什么内容?(可能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则)
- 什么信息一般不会写到配置中心?(服务端口,服务名,服务的注册地址,配置中心)
- 项目中为什么要定义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:某一个服务或配置集,一般对应一个配置文件