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原配置的详情
修改配置
@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 注解监听有效
非注解实现监听器
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());
}
写的很详细,棒棒哒
小伙子,八错八错……