写项目时除了代码之外,软件还有一些配置信息,比如数据库的用户名和密码,还有一些我们不想写死在代码里的东西,例如像线程池大小、队列长度等运行参数,以及日志级别、算法策略等, 所有这些东西,我们都叫做软件配置。
举例:
假如生产环境下,项目现在正在运行,此时修改了配置文件,我们需要让这些配置生效,通常的做法是不是要重启服务。但重启是不是会带来系统服务短时间的暂停,从而影响用户体验呢,还有可能会带来经济上的很大损失(例如双11重启下服务)。基于这样的背景,配置中心诞生了。
配置中心最基础的功能就是存储一个键值对,用户发布一个配置(configKey),然后客户端获取这个配置项(configValue)。
配置中心的功能就是当某个配置项发生变更时,不停机就可以动态刷新服务内部的配置项
Apollo(携程开源)
nacos(阿里开源)
Spring Cloud Config(Spring Cloud 全家桶成员)
1.在项目中配置依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2.修改配置文件的命称
将项目中的application.yml的名字修改为bootstrap.yml配置文件(启动优先级最高)
spring: application: name: sca-provider #设置该项目服务名,后续会nacos在注册中心呈现这个名字 cloud: nacos: discovery: server-addr: localhost:8848 #设置从哪里去查找nacos服务,与注册服务 config: server-addr: localhost:8848 #设置读取nacos配置中心的URL地址 file-extension: yml #设置读取nacos配置中心的配置文件文件的扩展名为yml group: default_5_1 #设置分组 namespace: 2e24cd67-e5c7-4547-9cbb-1f4c1f3c52fa #设置读取nacos配置中心的命名空间
3.设置配置中心的配置
配置管理—配置列表—右上方+号 进行添加配置
注意:其中Data ID的值要与bootstrap.yml中定义的spring.application.name的值相同
服务名-假如有多个服务一般会创建多个配置实例,不同服务对应不同的配置实例
4.使用@RefreshScope
@RefreshScope的作用是在配置中心的相关配置发生变化以后,能够及时看到更新(底层是通过重新创建对象的方式初始化配置中心的数据)
Namespace: 命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境,可以有多个。
Group: 分组,将若⼲个服务或者若⼲个配置集归为⼀组。
Service/DataId: 某⼀个服务或配置集,一般对应一个配置文件。
spring: cloud: nacos: config: shared-configs[0]: # 配置nacos公共配置文件,以数组形式可以配置多个 group: DEFAULT_GROUP # 配置nacos那个分组下的配置(默认为DEFAULT_GROUP) data-id: app-public-dev.yml # 设置公共配置的配置文件对应nacos下的data Id refresh: true # 配置程序支持动态刷新配置吗? 默认false表示不支持 shared-configs[1]: # 配置nacos公共配置文件,以数组形式可以配置多个 group: DEFAULT_GROUP # 配置nacos那个分组下的配置(默认为DEFAULT_GROUP) data-id: app-public-dev1.yml # 设置公共配置的配置文件对应nacos下的data Id refresh: true # 配置程序支持动态刷新配置吗? 默认false表示不支持
注意:data-id对应的配置文件后缀必须加.yml
,否则公共配置不生效
1. 假如对配置的信息访问不到或服务启动后没有从配置中心获取我们的配置数据是什么原因?
1)请检测项目配置文件的名字是否为bootstrap.yml,检查配置文件中spring.application.name属性的值是否与配置中心的data-id名相同
2)配置中心的配置信息缩进以及空格写的格式是否正确.
3)没有下载好依赖
4)配置文件名字bootstrap.yml没有修改
5)配置中心的dataId名字是否正确
6)检查分组是否正确
7)配置的名字是否正确,缩进关系是否正确
8)假如是动态发布,类上是否有@RefreshScope注解
2. 配置中心一般都会配置什么内容?
能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则
3. 什么信息一般不会写到配置中心?
服务端口,服务名,服务的注册地址,配置中心
4. 项目中为什么要定义bootstrap.yml文件?
此文件被读取的优先级比较高,可以在服务启动时读取配置中心的数据
5.Nacos配置中心宕机了,我们的服务还可以读取到配置信息吗?
可以从内存,客户端获取了配置中心的配置信息以后,会将配置信息在本地内存中存储一份
6. 微服务应用中我们的客户端如何获取配置中心的信息
为了考虑性能我们的服务一般首先会从内存读取配置信息,同时我们的微服务还可以定时向nacos配置中心发请求拉取(pull)更新的配置信息,但是在一定时间间隔内还可能会出现不一致的配置,所以nacos服务端而言,当配置变化时,会通知客户端然后更新客户端
7. 微服务应用中客户端如何感知配置中心数据变化?
当数据发生变化时,nacos找到它维护的客户端,然后通知客户端去获取更新的数据,客户端获取数据以后更新本地内存,并在下次访问资源时,刷新@Value注解描述的属性值,但是需要借助@RefreshScope注解对属性所在的类进行描述
8.Nacos客户端(微服务业务)如何动态感知配置中心数据变化的?
nacos2.0之前nacos客户端采用长轮询机制拉取nacos服务的配置信息,
每隔30秒pull+“push
在服务端的配置信息变更以后,通知服务端中处于等待状态的客户端队列中的客户端对象,并更新客户端对应的响应数据,然后返回响应