nacos配置中心,基本使用

1 启动naocs服务

2 添加依赖

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>${latest.version}</version>
</dependency>

==注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。==

3 配置文件中添加nacos server服务地址(properties)

nacos.config.server-addr=127.0.0.1:8848

4 启动类上,使用 @NacosPropertySource 加载 dataId 为 example 的配置源,并开启自动更新:

@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigApplication.class, args);
    }
}

5 NacosPropertySource注解常用属性**

dataId:nacos的数据id(区分数据用)
autoRefreshed:true开启自动更新,false关闭。默认值false
groupId:分组id。默认值DEFAULT_GROUP

6 通过 Nacos 的 @NacosValue 注解获取属性值**

@Controller
@RequestMapping("config")
public class ConfigController {

    // "${useLocalCache:false}" 意思是获取不到值去默认值false。
    // autoRefreshed = true  开启自动更新
    // "${useLocalCache}"开启自动更新,先获取的是nacos的值,nacos没有则获取本地配置的,本地配置没有,则出错。
    // 不开启更新则获取的是本地配置
    @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
    private boolean useLocalCache;

    @RequestMapping(value = "/get", method = GET)
    @ResponseBody
    public boolean get() {
        return useLocalCache;
    }
}

7 连接设置nacos配置中心的值**

设置配置:curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=useLocalCache=true" (liunx 服务器内部使用,建议使用代码来设置和更新,或者可视化界面)
获取配置:curl http://localhost:8080/config/get   (通过项目内的接口)

8 配置监听

nacos监听注解形式的配置主要是依靠注解== @NacosConfigListener(dataId = DATA_ID)==

下图是nacos原配置的详情
file
修改配置

@Controller
@RequestMapping("config")
public class ConfigController {

    private static final Logger logger = LoggerFactory.getLogger(ConfigController.class);

    @NacosInjected
    private ConfigService configService;

    /**
     * 修改nacos中心配置
     * @throws Exception
     */
    @RequestMapping(value = "/publishConfig", method = GET)
    @ResponseBody
    public void publishConfig2() throws Exception {
        // Build Properties Content
        StringBuilder builder = new StringBuilder();
        builder.append("user.id = 1");
        builder.append(SystemUtils.LINE_SEPARATOR);
        builder.append("user.name = mercyblitz");
        builder.append(SystemUtils.LINE_SEPARATOR);
        builder.append("user.github = https://github.com/mercyblitz");
        // 通过注入服务 configService 的publishConfig修改配置
        // publishConfig存在会修改,不存在添加
        configService.publishConfig("example", DEFAULT_GROUP,
                builder.toString());
    }

    /**
     * 通过注解配置监听器
     * 配置转换为字符串类型
     * @param value
     */
    @NacosConfigListener(dataId = "example")
    public void onReceived(String value) {
        System.out.println(11211);

        logger.info("onReceived(String) : {}", value);
    }

    /**
     * 通过注解配置监听器
     * 配置转换为Properties类型
     * @param value
     */
    @NacosConfigListener(dataId = "example")
    public void onReceived(Properties value) {
        System.out.println(1111);
        logger.info("onReceived(Properties) : {}", value);
    }
}

控制台打印结果
监听器打印出来结果,@NacosConfigListener 注解监听有效
file

非注解实现监听器

configService.addListener(DATA_ID, DEFAULT_GROUP, new AbstractListener() {
    @Override
    public void receiveConfigInfo(String config) {
        assertEquals("9527", config); // asserts true
    }
});

9 监听器的类型转换

@NacosConfigListener 的类型转换包括内置和自定义实现。 默认情况下,内置类型转换基于 Spring DefaultFormattingConversionService,这意味着它包好了大多数情况以及 Spring 框架更高级版本的丰富功能。

@NacosConfigListener(dataId = DATA_ID)
public void onInteger(Integer value) {
    assertEquals(Integer.valueOf(9527), value); // asserts true
}

@NacosConfigListener(dataId = DATA_ID)
public void onInt(int value) {
    assertEquals(9527, value); // asserts true
}

监听到的配置内容的类型和监听器的类型有关。监听的入参类型不对,监听器无法坚监听到。

自定义监听器转换

nacos-spring-context 为开发人员提供弹性扩展。 如果定义名为nacosConfigConversionService的Spring Bean,其类型为ConversionService,则将忽略DefaultFormattingConversionService。 此外,您可以自定义NacosConfigConverter接口的实现,以指定类型转换的侦听器方法:

public class UserNacosConfigConverter implements NacosConfigConverter<User> {

    @Override
    public boolean canConvert(Class<User> targetType) {
        return true;
    }

    @Override
    public User convert(String source) {
        return JSON.parseObject(source, User.class);
    }
}

UserNacosConfigConverter 类绑定在 @NacosConfigListener.converter() 属性上,如下:

@NacosInjected
private ConfigService configService;

@Test
public void testPublishUser() throws NacosException {
    configService.publishConfig("user", DEFAULT_GROUP, "{\"id\":1,\"name\":\"mercyblitz\"}");
}

@NacosConfigListener(dataId = "user", converter = UserNacosConfigConverter.class)
public void onUser(User user) {
    assertEquals(Long.valueOf(1L), user.getId()); 
    assertEquals("mercyblitz", user.getName());
}
讨论数量: 2

写的很详细,棒棒哒

4年前

小伙子,八错八错……

4年前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!