核心知识点
配置中心诞生背景
我们的软件除了代码之外,还需要一些配置信息,比如yml,properties等配置文件,比如Mybatis框架连接数据库,nacos服务调用的负载均衡算法,日志输出的级别等一些我们会经常需要改变的配置信息,每次修改配置文件都要重启服务器,这样不符合我们的预期,所以就有了配置中心,我们可以在nacos的配置中心动态修改配置信息,而不用频繁重启服务器
市场上主流的配置中心
携程(Apollo),阿里(nacos),spring colud Config等
Nacos配置中心简介
Nacos不仅有注册中心,还拥有配置中心的功能
配置中心最基础的功能就是储存一个个键值对,用户发送一个配置(configKey),客户端就收到一个配置项(configValue),配置中心的功能就是当我们更新配置时,配置中心能够做到不停机就能动态刷新服务内部配置项
Nacos配置中心入门实战
第一步:添加依赖
<!--添加配置中心依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
第二步:在配置文件选择配置中心的地址,将application.yml修改为bootstrap.yml(启用优先级最高),以后见到bootstrap.yml就是说明用了配置中心
spring:
application:
name: sca-provider #服务名
cloud:
nacos:
config: #配置中心的配置
server-addr: localhost:8848 #nacos #配置中心地址
file-extension: yml #配置文件的扩展名
第三步:编写日志输出方法
@RestController
@Slf4j
public class ProviderLogController {
@GetMapping("/provider/log/doLog01")
public String doLog01(){
//System.out.println("==doLog01==");
//日志级别:trace<debug<info<warn<error
log.trace("==trace==");
log.debug("==debug==");
log.info("==info==");//springboot工程默认级别info
log.warn("==warn==");
log.error("==error==");
return "test log level";
}
}
第四步:在nacos配置中心修改配置信息
其中Data ID要与bootstrap.yml文件中spring.application.name值保持一致(服务名,多个服务一般会创建多个配置实例,不同服务实例对应不同配置实例),配置发布后会在配置中心显示
第五步:测试
注意:日志级别:trace<debug<info<ware<error
Nacos配置中心的配置管理模型
Nacos配置管理模型包括三大部分:
命名空间:namspace,根据不不同的环境进行隔离,比如生产环境和测试环境
分组:Group,将若干个服务或若刚配置归集为一组
服务/Data ID:某一个服务或者配置集,一般对应一个配置文件
命名空间设计
第一步:进入nacos命名空间,创建一个新的命名空间
第二步:在配置中心给新的命名空间写配置信息
第三步:在配置类进行命名空间的选择
spring: application:
name: sca-provider #服务名
cloud:
nacos:
config: #配置中心的配置
namespace: 7c6ec63f-0f6b-4d29-9ab0-89518c7d161e #命名空间ID,默认为public
第四步:测试
对配置文件进行分组
第一步:在配置中心写新的配置文件并分组
第二步:在bootstrap.yml配置文件修改新的分组配置
spring: application:
name: sca-provider #服务名
cloud:
nacos:
config: #配置中心的配置
group: DEFAULT_GROUP_51 #分组默认为DEFAULT_GROUP
第三步:写测试方法
@RestController@RefreshScope
public class ProvideCacheController {
/**
* 测试配置中心分组功能
* 从配置中心或配置文件读取userLocalCache的值,
* 并将这个值赋值给cache,如果没有读取到,默认为false
* */
@Value("${useLocalCache: false}")
private boolean cache;
@GetMapping("/provider/cache01")
public String doUseLocalCache(){
return "useLocalCache value 为"+cache;
}
}
第四步:测试
共享配置设计与读取
第一步:在nacos配置中心写共享配置文件
第二步:在bootstrap.yml配置文件配置共享配置信息
spring: application:
name: sca-provider #服务名
cloud:
nacos:
config: #配置中心的配置
# 共享配置
shared-configs[0]: #此处0为共享配置文件的下标,将来可以配置多个共享配置文件
data-id: app-public.yml
refresh: true #默认false,共享配置更新,引用此配置的地方是否要更新
第三步:编写测试方法
//测试共享配置的读取@RestController
@RefreshScope
public class ProviderSecretController {
@Value("${app.secret:123456}")
private String secret;
@GetMapping("/provider/secret")
public String doGetSecret(){
return "the secret is:"+secret;
}
}
第四步:测试
解决多个用户访问同一个内容而连接多次数据库问题
创建一个缓存池,当收到同一个查询请求时,只查询一次,后续从内存中的缓存查询数据
第一步:使用CopeOnWriteArrayList的API创建缓存,这个集合是安全的,当集合更新时,会先拿到原有集合到内存中,再进行元素的更新,避免了高并发下的线程安全
private CopyOnWriteArrayList<String> localCache = new CopyOnWriteArrayList<>();
第二步:创建测试方法,nacos配置中心可以控制缓存的开启和关闭,也就是userLocalCache的值为true或false
@RestController@RefreshScope
public class ProvideCacheController {
/**
* 测试配置中心分组功能
* 从配置中心或配置文件读取userLocalCache的值,
* 并将这个值赋值给cache
* */
@Value("${useLocalCache: false}")
private boolean cache;
@GetMapping("/provider/cache01")
public String doUseLocalCache(){
return "useLocalCache value 为"+cache;
}
private CopyOnWriteArrayList<String> localCache = new CopyOnWriteArrayList<>();
@GetMapping("/provider/cache02")
public List<String> doCache(){
if (!cache){
System.out.println("data from DB");
return Arrays.asList("A","B","C");
}
if (localCache.isEmpty()){
System.out.println("data from DB");
List<String> list = Arrays.asList("A", "B", "C");
localCache.addAll(list);
}
return localCache;
}
}
第三步:测试,第一次集合更新后,再次查询不会进入数据库就拿到数据
常见问题
什么是配置中心
储存项目配置信息的一个服务,这个服务可以实现配置的动态信息的发布和更新
为什么使用配置中心
集中管理配置信息,动态发布配置信息,服务自动感知配置,提高服务可用性
配置中心一般配置什么内容
可能经常变化的配置信息,比如数据库的密码,连接池的大小,负载均衡算法,日志,线程熔断等
什么内容一般不写到配置中心
服务端口名,服务名,服务注册地址,配置中心地址
项目中为什么定义bootstrap.yml文件名
此文件的读取优先级比较高,在项目启动时就加载配置文件中的数据
Nacos配置中心宕机了,还可以读取到配置中心的配置信息吗
可以从服务的本地内存读取配置信息
微服务应用中客户端是如何感知配置中心数据的变化的
从1.4.x版本的nacos客户端基于长轮询读取nacos配置中心的数据
服务区启动后没有从配置中心获取配置信息的原因
1.配置中心依赖是否导入
2.配置文件名是否为bootstrap.yml
3.配置中心的配置信息单词是否正确
4.缩进,以及空格的那个格式是否使用正确
5.根据配置模型是否获取到正确的配置信息
你项目中的日志规范是什么
slf4j----门面模式
你了解项目中的日志级别吗
trace<debug<info<warn<error,可以根据日志级别控制日志输出
@RefreshScope注解的作用是什么
此注解修饰的类,当配置中心的配置发生变化是,此类的对象会重建,重建后属性也会更新
Nacos配置管理模型的背景
环境不同配置不同
Nacos配置管理模型的配置是怎样的
namespace>group>service/DateID
Nacos配置中心能否读取共享配置信息
可以