Nacos使用总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Nacos使用总结

官网 :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秒没有响应,才踢出该服务!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
Nacos
|
存储 关系型数据库 MySQL
Nacos 2.0.3和Nacos 2.2.3版本
Nacos 2.0.3和Nacos 2.2.3版本
843 1
|
21小时前
|
监控 网络协议 Nacos
|
1月前
|
网络协议 Java Nacos
Nacos的应用
Nacos的应用
47 0
|
5月前
|
SQL 关系型数据库 MySQL
详解nacos使用
详解nacos使用
116 0
|
负载均衡 前端开发 网络协议
是时候了解下 nacos 了!(一)
是时候了解下 nacos 了!(一)
|
Nacos
Nacos 配置文件属性说明
Nacos 配置文件属性说明
208 0
|
6月前
|
Nacos
Nacos的某些配置
Nacos的某些配置
70 2
|
存储 负载均衡 Java
Nacos
Nacos
632 0
|
负载均衡 网络协议 前端开发
是时候了解下 nacos 了!(二)
是时候了解下 nacos 了!(二)