Nacos服务---配置中心

Nacos的配置中心的配置获取,主要通过 Namespace、group、Data ID能够定位到一个配置集。
1、配置集(Data ID)
? 在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。每个配置集都可以定义一个有意义的名称,就是配置集的ID即Data ID。
配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以 key=value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
2、配置分组(Group)
? 配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集可以定义一个group为:STUDENT_GROUP。
注 :默认情况下使用 DEFAULT_GROUP 组。
3、命名空间(Namespace)
? 命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。
命名空间在代码调用时,使用的是 命名空间的ID,在创建命名空间时,Nacos会为每个命名空间创建ID,如图:
Nacos服务---配置中心
文章图片

注 :默认情况使用的是public 命名空间。
4、最佳实践
? Nacos抽象定义了Namespace、Group、Data ID的概念,具体这几个概念代表什么,取决于我们把它们看成什么,这里推荐给大家一种用法:
Namespace:代表不同环境,如开发、测试、生产环境。
Group:代表某项目,如XX医疗项目、XX电商项目
DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件
5、代码调用:
测试用例代码块:

package com.nacos; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.api.exception.NacosException; import java.util.Properties; import java.util.concurrent.Executor; /** * @author Jay * @version 1.0 **/ public class demoMain { public static void main(String[] args) throws NacosException { //使用nacos client远程获取nacos服务上的配置信息 //nacos server地址 String serverAddr = "127.0.0.1:8848"; //data id String dataId = "nacos-simple-demo.yaml"; //group String group = "DEFAULT_GROUP"; //namespace String namespace = "c67e4a97-a698-4d6d-9bb1-cfac5f5b51c4"; Properties properties =new Properties(); properties.put("serverAddr",serverAddr); properties.put("namespace",namespace); //获取配置 ConfigService configService = NacosFactory.createConfigService(properties); // String dataId, String group, long timeoutMs String config = configService.getConfig(dataId, group, 5000); System.out.println(config); //String dataId, String group, Listener listener configService.addListener(dataId, group, new Listener() { public Executor getExecutor() { return null; } //当配置有变化 时候获取通知 public void receiveConfigInfo(String s) { System.out.println(s); } }); while (true){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }} }

整合SpringCloud 代码块:
由于springboot加载顺序 bootstrap > application ,使用配置中心的信息要配置在 bootstrap中。(踩坑点!)
server: port: 9999spring: application: name: serviceName cloud: nacos: config: #enabled: false server-addr: 192.168.83.129:8848 file-extension: yaml namespace: 1969d1e1-1c46-43ea-b57c-af75a7f8aad9 group: DEV_GROUP

注:Data Id 的名称就是application的 name 加 file-extension ,即为 serviceName.yaml , file-extension的类型是需要根据Nacos上的文件类型定义。
Nacos服务---配置中心
文章图片

java代码:
package com.nacos.service1.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class NacosConfigController {@Value("${trussan.host}") private String config1; @GetMapping("/configs") public String getConfigs(){return config1; } }

这种获取方式,但Nacos上的配置信息发生修改时,由于spring @value的注解原因,服务端拿到的值是不会发生改变的,所以生产中建议使用如下获取配置信息的方式:
package com.nacos.service2.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class NacosConfigController {@Autowired ConfigurableApplicationContext applicationContext; @GetMapping("/configs") public String getConfigs(){return applicationContext.getEnvironment().getProperty("config.service"); } }

【Nacos服务---配置中心】注入上下文的配置,动态获取。

    推荐阅读