4.Nacos配置中心实战

核心知识点

配置中心诞生背景

我们的软件除了代码之外,还需要一些配置信息,比如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配置中心能否读取共享配置信息

可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值