官网 :http://nacos.io
下载地址 本文下载的为2.0.0版本:
https://github.com/alibaba/nacos/releases
Linux/Unix/Mac
启动命令:(默认启动为集群模式)
- 单机模式 - 用于测试和单机试用
sh startup.sh -m standalone
- 集群模式 - 用于生产环境,确保高可用,官方建议至少3个或3个以上的节点来实现
集群模式
sh startup.sh -m cluster
根据cluster.conf.example修改生成 cluster.conf
127.0.0.1:8848 127.0.0.1:18848 127.0.0.1:28848
最好用nginx做下反向代理
upstream nacos_backend { server localhost:8848; server localhost:18848; server localhost:28848; } location /nacos/ { proxy_pass http://nacos_backend; proxy_set_header Host $host; add_header Access-Control-Allow-Origin *; proxy_set_header X-Real_IP $remote_addr; proxy_set_header Referer $http_referer; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
- 多集群模式 - 用于多数据中心场景 TODO...
关闭nacos:
[root@VM-0-15-centos bin]# sh shutdown.sh The nacosServer(26890) is running... Send shutdown request to nacosServer(26890) OK
启动端口
Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
端口 | 与主端口的偏移量 | 描述 |
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。
因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。
打开页面
http://127.0.0.1/nacos/index.html
默认账号是nacos,默认密码nacos
[root@VM-0-15-centos logs]# jps -l 30601 sun.tools.jps.Jps 26890 /data/download/nacos/target/nacos-server.jar
数据持久化
默认情况下,Nacos使用嵌入式数据库derby 实现数据的存储,所以我们如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。修改
/home/nacos/nacos8848/conf/ application.properties
新建数据库nacos,刷入SQL脚本nacos-mysql.sql,修改application.properties,
### Connect URL of DB: db.url.0=jdbc:mysql://172.17.0.15:3306/nacos?autoReconnect=true&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8 db.user.0=root db.password.0=ooxxooxx
数据库表如下:
mysql> show tables; +----------------------+ | Tables_in_nacos | +----------------------+ | config_info | | config_info_aggr | | config_info_beta | | config_info_tag | | config_tags_relation | | group_capacity | | his_config_info | | permissions | | roles | | tenant_capacity | | tenant_info | | users | +----------------------+ 12 rows in set (0.00 sec)
其中config_info 记录了配置信息,his_config_info记录了输入的历史版本,users记录了登陆账号。
再次启动当看到如下信息,说明mysql存储已经开启
2021-04-05 15:35:50,810 INFO Started Nacos in 12.238 seconds (JVM running for 12.789) 2021-04-05 15:35:50,811 INFO Nacos started successfully in stand alone mode. use external storage
目前对我们有用的功能如下:
服务发现:
代码地址:https://github.com/alibaba/nacos/tree/develop/naming
描述 | 主要开发者 | 状态 | 排期 |
服务注册与发现 | nkorange | 稳定 | 0.1.0 |
健康检查(服务端探测、客户端心跳) | xuanyin | 稳定 | 0.1.0 |
路由策略(权重、保护阈值、就近访问) | wangjianwei | 稳定 | 0.1.0 |
配置管理
代码地址:https://github.com/alibaba/nacos/tree/develop/config
描述 | 主要开发者 | 状态 | 排期 |
配置管理(发布、修改、查询、监听配置) | yanlinly | 稳定 | 0.1.0 |
灰度配置 | yanlinly | 稳定 | 1.1.0 |
加密配置 | 不支持 |
如何使用?
下载客户端
implementation group: 'com.alibaba.nacos', name: 'nacos-client', version: '2.0.0';
修改配置的的话,服务器日志生成在这个文件下:
/usr/local/nacos8848/logs/config-client-request.log
命名空间的创建,别名和ID最好一致,否则ID容易生成一长串的3fdd5065-f742-4f4f-9b80-015b7c5468ae,很难肉眼去识别。
SDK使用:
初始化客户端(指定namespace):
String serverId = "10018"; String configCenter = "110.15.9.113"; String nameSpace = "dev"; Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, configCenter); properties.put(PropertyKeyConst.NAMESPACE, nameSpace); ConfigService configService = NacosFactory.createConfigService(properties);
发布配置(指定group,dataId)
用于通过程序自动发布 Nacos 配置,以便通过自动化手段降低运维成本。
注意:创建和修改配置时使用的同一个发布接口,当配置不存在时会创建配置,当配置已存在时会更新配置。
public boolean publishConfig(String dataId, String group, String content) throws NacosException; @Since 1.4.1 public boolean publishConfig(String dataId, String group, String content, String type) throws NacosException;
boolean successful = configService.publishConfig(serverId, SystemConstant.SERVER_TYPE_GAME, content);
获取配置
用于服务启动的时候从 Nacos 获取配置。
public String getConfig(String dataId, String group, long timeoutMs) throws NacosException
String config = null; try { config = configService.getConfig(serverId, SystemConstant.SERVER_TYPE_GAME, 5000); } catch (NacosException e) { logger.error(e.getMessage(), e); } logger.debug("读取配置 config=\n{}", config);
删除配置
用于通过程序自动删除 Nacos 配置,以便通过自动化手段降低运维成本。
注意: 当配置已存在时会删除该配置,当配置不存在时会直接返回成功消息。
public boolean removeConfig(String dataId, String group) throws NacosException
configService.removeConfig(serverId, SystemConstant.SERVER_TYPE_GAME);
监听配置
如果希望 Nacos 推送配置变更,可以使用 Nacos 动态监听配置接口来实现。
public void addListener(String dataId, String group, Listener listener)
举例:
AbstractConfigChangeListener listener = new AbstractConfigChangeListener() { @Override public void receiveConfigChange(ConfigChangeEvent event) { logger.debug("{}", event.getChangeItems()); } @Override public void receiveConfigInfo(final String configInfo) { logger.debug("更新配置 config=\n{}", configInfo); } }; configService.addListener(serverId, SystemConstant.SERVER_TYPE_GAME, listener);
删除监听(一定是要曾经加到监听去的对象):
configService.removeListener(serverId, SystemConstant.SERVER_TYPE_GAME, listener);
获取服务器状态,值为UP为正常,DOWN为跪了
String getServerStatus();
关闭客户端:
configService.shutDown();
运行过程中会有如下8个线程产生,感觉很冗余:
目前遇到的两个问题:
1.启动会占用1.5秒,Response ,Request包扫描,GRPC 初始化,耗时过长,
2.生成了过多的线程数,目测8根
nacos单机模式报错:server is DOWN now, please try again later!
删除nacos目录下data/protocol目录,重新启动nacos服务
主要查看的两个日志:config-fatal.log,config-server.log
双写相关:
如果在服务请求时返回了如下信息,
Nacos cluster is running with 1.X mode, can't accept gRPC request temporarily. Please check the server status or close Double write to force open 2.0 mode
则需要在服务器关闭双写。
为了节省性能开销,当集群部署完成后,可以先观察一段时间运行情况,当确认无误后,可以关闭双写,从而释放性能,具体的关闭方式是通过API进行:
curl -X PUT 'localhost:8848/nacos/v1/ns/operator/switches?entry=doubleWriteEnabled&value=false'
关闭后可以从logs/naming-server.log
日志中观察到如下
字样。说明关闭双写。
Disable Double write, stop and clean v1.x cache and features Check double write closed
注意,关闭双写后无法在进行平滑降级,请先确认关闭前集群正确运行。
如果要用curl测试API,要注意的是,http请求多参数时,要把&前加\,否则容易被截断。
最好nacos和应用之间走内网环境,如下:
http://172.17.0.15/nacos/v1/ns/instance/list?groupName=game\&namespaceId=idc-test\&serviceName=game\&clusters=game
用nacos SDK 连接时遇到如下异常的话,说明部分端口没开启。
com.alibaba.nacos.api.exception.NacosException: Request nacos server failed: at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:227) ~[nacos-client-2.0.2.jar:?] at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.subscribe(NamingGrpcClientProxy.java:186) ~[nacos-client-2.0.2.jar:?] at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.subscribe(NamingClientProxyDelegate.java:146) ~[nacos-client-2.0.2.jar:?] at com.alibaba.nacos.client.naming.NacosNamingService.subscribe(NacosNamingService.java:393) ~[nacos-client-2.0.2.jar:?] at com.alibaba.nacos.client.naming.NacosNamingService.subscribe(NacosNamingService.java:377) ~[nacos-client-2.0.2.jar:?] at com.yorha.directory.config.ServiceManager.subscribe(ServiceManager.java:109) ~[classes/:?] at com.yorha.directory.service.ServerManager.init(ServerManager.java:28) ~[classes/:?] at com.yorha.directory.DirectoryServerService.onStart(DirectoryServerService.java:73) ~[classes/:?] at com.yorha.core.AbstractService.start(AbstractService.java:140) ~[classes/:?] at com.yorha.directory.DirectoryServer.main(DirectoryServer.java:10) ~[classes/:?] Caused by: com.alibaba.nacos.api.exception.NacosException: Client not connected,current status:STARTING at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:656) ~[nacos-client-2.0.2.jar:?] at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:636) ~[nacos-client-2.0.2.jar:?] at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:217) ~[nacos-client-2.0.2.jar:?] ... 9 more
查阅Nacos 2.0 升级文档发现 2.0新增了两个端口需要开放
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
关于心跳检查:
Nacos
单机模式的心跳机制 主要逻辑是:在客户端,开启一个延迟定时线程池,延时5
秒,每隔5
秒发起一次心跳检测,如果3
秒没有响应,则把服务的健康状态置为UNHEALTHY,如果断开连接,则重试3次重连,在服务器端,如果30
秒没有响应,才踢出该服务!