0%

nacos简单入门

nacos入门

背景

​ 最近闲来无事看到一篇关于DynamicTp动态可监控线程池框架,也去DynamicTp官网看了一下,发现原来跟Hutool出自同一个社区,想着上手试试,看了下官网的『使用步骤』发现需要引入配置中心,在工作中apollo已经使用比较多,所以这次想尝试一下使用nacos

部署

​ 因为我使用的是mac,且安装了dockerkitematic,本以为只需要从容器仓库中拉一个nacos的镜像就大工告成,没想到,事情没有我想象的那么顺利,还是一波三折。

​ 通过kitematic直接搜索nacos镜像,并下载启动。

nacos部署.png

启动后直接报错:

1
2
3
4
5
6
7
8
9
10
11
No DataSource set
at com.alibaba.nacos.config.server.service.dump.DumpService.dumpOperate(DumpService.java:236)
at com.alibaba.nacos.config.server.service.dump.ExternalDumpService.init(ExternalDumpService.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:363)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:307)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
... 53 common frames omitted

看报错信息,大概率是数据连接的问题,到目前为止,容器是镜像下载之后直接启动的,我并没有配置数据库连接相关信息,到这里,我第一反应是将nacos的部分文件/文件夹挂载到宿主机,修改是也方便,但是对于容器的修改挂载点有点复杂,有的说去修改底层的那个config.v2.json文件,有的说通过export修改,不知道是我操作有问题还是怎么样,我尝试了之后是没有成功。后面我是将这个运行容器删掉,利用镜像重新启动一个容器,这时就可以指定对应的挂载卷,本来想把整个/nacos文件夹都挂载出来,但是指定之后,死活报错,某个文件找不到,启动失败,无奈只能走最下策,进入容器操作。

所以进入容器中,查看相关配置信息。

进入容器中定位到/home/nacos/conf/application.properties,不同容器应该会不太一样,但是大概率是在~/nacos/conf文件夹。

想将conf文件夹下的数据库脚本文件shcema.sql脚本,拿到数据库中执行之后,在修改application.properties文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:mysql}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST:docker.for.mac.host.internal}:${MYSQL_SERVICE_PORT:32786}/${MYSQL_SERVICE_DB_NAME:nacos}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true}
# db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user=${MYSQL_SERVICE_USER:root}
db.password=${MYSQL_SERVICE_PASSWORD:root}
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}

填写上数据库相关信息之后,重启还是报错,在这个地方磨了好久,一直想不明白为什么数据库连接不上。

这里主要原因是因为我的mysql数据库不是直接安装在本机上,也是通过docker容器部署,所以我最开始的时候通过nacos容器去ping连接mysql的容器,在ping通的情况下,我以为nascos容器通过mysql容器的ip可以直接访问到数据库。一直报错之后,使用telnet命令查看端口是否可访问时,报错了,才发现了问题。

按我理解,访问不到的原因可能是如果ip写的是mysql容器的ip,那么端口应该写哪个合适?是写容器对应开放的端口,还是写宿主机绑定的端口?我两种都尝试了一次,结果都是访问不到。所以将访问ip修改为访问宿主机ip+宿主机绑定mysql容器的端口,这种方式是可以访问到的。

这里必须安利一波mac上的dockerkitematic,基本上所有的类似组件,比如rabbitmqmysqlredisjenkinsnexus3等我都是通过容器化部署,只需要把对应的数据卷挂载到宿主机,保证重启是数据不丢失即可,好处当然多多,一是干净,二是简单。

访问

127.0.0.1:4567/nacos/index.html

nacos的默认账号和密码都是nacos

nacos登录页.png

nacos中有命名空间和分组的概念,每一个命名空间中可以划分多个组,在spring配置文件中,可以指定需要拉取哪个命名空间下的那个组的配置。

通过『命名空间』创建devtest命名空间之后,在『配置列表』会显示出对应的命名空间。

nacos配置列表.png

小试

引入nacos依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.1</version>
</dependency>

启动类启用nacos配置注解。

1
2
3
4
5
6
7
8
@SpringBootApplication
@NacosPropertySource(dataId = "simple-dev-yaml", groupId = "DEV_GROUP", autoRefreshed = true)
public class SpringbootSimpleApplication {

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

配置文件添加nacos服务器访问地址

1
nacos.config.server-addr=127.0.0.1:4567

测试

1
2
3
4
5
6
7
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;

@GetMapping("/config")
public boolean config(){
return useLocalCache;
}

这里只是想使用一下nacos,所以采用的都是最简单的写法,写死的方式指定了dataIdgroupId,在实际的使用中一般都是使用配置文件来进行管理。

1

-------------本文结束感谢您的阅读-------------