微服务之配置中心Nacos应用实践

Nacos配置快速入门

添加依赖

在已有的服务提供项目中添加配置依赖

<!--添加nacos配置中心依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>
        spring-cloud-starter-alibaba-nacos-config
    </artifactId>
</dependency>

修改配置文件

将项目中的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
        group: DEFAULT_GROUP # Group, default is DEFAULT_GROUP
        file-extension: yml # Configure the data format of the content, default to properties
Nacos基本配置

打开nacos配置中心,新建配置,

在服务提供者添加一个获取日志级别(debug<info<warn<error)的方法  

@RefreshScope //动态刷新配置
@RestController
public class ProviderController{
    private static final Logger log= LoggerFactory.getLogger(ProviderApplication.class);
    @Value("${logging.level.com.cy:error}")
    private String logLevel;
    @GetMapping("/provider/doGetLogLevel")
    public String doGetLogLevel(){
       log.trace("==log.trace==");//跟踪
       log.debug("==log.debug==");//调试
       log.info("==log.info==");//常规信息
       log.warn("==log.warn==");//警告
       log.error("==log.error==");//错误信息
        return "log level is "+logLevel;
    }
}
其中,@RefreshScope的作用是在配置中心的相关配置发生变化以后,能够及时看到更新(底层是通过重新创建Controller对象的方式,对属性进行了重新初始化),Controller编写好以后,启动配置中心服务,然后进行访问测试。,打开浏览器直接在地址栏输入http://localhost:8081/provider/doGetLogLevel,检测输出结果是否为我们配置中配置的信息,

说明:

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

小节分析:

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

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

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

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

微服务应用中我们的客户端如何获取配置中心的信息?(为了考虑性能我们的服务一般首先会从内存读取配置信息,同时我们的微服务还可以定时向nacos配置中心发请求拉取(pull)更新的配置信息,但是在一定时间间隔内还可能会出现不一致的配置,所以nacos服务端而言,当配置变化时,会通知客户端然后更新客户端.)
微服务应用中客户端如何感知配置中心数据变化?(当数据发生变化时,nacos找到它维护的客户端,然后通知客户端去获取更新的数据,客户端获取数据以后更新本地内存,并在下次访问资源时,刷新@Value注解描述的属性值,但是需要借助@RefreshScope注解对属性所在的类进行描述)
服务启动后没有从配置中心获取我们的配置数据是什么原因?(依赖,配置文件名字bootstrap.yml,配置中心的dataId名字是否正确,分组是否正确,配置的名字是否正确,缩进关系是否正确,假如是动态发布,类上是否有@RefreshScope注解)
你项目中使用的日志规范是什么?(SLF4J)
你了解项目中的日志级别吗?(debug,info,error,…,可以基于日志级别控制日志的输出)


Nacos配置管理模型

 

其中:

  • Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。
  • Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
  • Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。

命名空间设计

Nacos中的命名空间用于配置隔离,这种命名空间一般会按照环境(开发,生产环境)

进行设计和实现,默认创建的配置都储存到了public命名空间

当我们修改配置中以新的命名空间去配置时,也要修改项目中的配置文件bootstrop.yml

 

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

分组设计及实现

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

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

 

共享配置设计及读取

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

创建的配置文件需要作为共享配置时,在指定的微服务配置文件bootstrop.yml中设置对共享配置文件的读取

 小节面试分析
Nacos配置管理模型的背景?(环境不同配置不同)
Nacos配置中的管理模型是怎样的?(namespace,group,service/data-id)
Nacos客户端(微服务)是否可以读取共享配置?(可以)

重难点分析
配置中心的选型。(市场活跃度、稳定性、性能、易用)
Nacos配置中心基本应用。(新建,修改、删除配置以后,在Nacos客户端应用配置)
配置管理模型应用。(namespace,group,service/dataId)
Nacos配置变更的动态感知。(底层原理分析)


FAQ分析
为什么需要配置中心?(动态管理发布配置,无需重启服务,更好保证服务的可用)
配置中一般要配置什么内容?(经常变化的配置数据-日志级别,线程池、连接池、…)
市面上有哪些主流配置中心?(Nacos,….)
配置中心选型时要重点考虑哪些因素?(市场活跃度、稳定性、性能、易用)
Nacos客户端(微服务业务)如何动态感知配置中心数据变化的?(nacos2.0之前nacos客户端采用长轮询机制拉取nacos服务的配置信息,pull(每隔30秒)+“push(是在服务端的配置信息变更以后,通知服务端中处于等待状态的客户端队列中的客户端对象,并更新客户端对应的响应数据,然后返回响应)”)
Nacos配置管理模型是怎样的?(命名空间-namespace,分组-group,服务实例-dataId)
 


版权声明:本文为weixin_57801340原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。