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)基础上,进行一定偏移量自动生成。

端口与主端口的偏移量描述
98481000客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
98491001服务端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新增了两个端口需要开放

98481000客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
98491001服务端gRPC请求服务端端口,用于服务间同步等

关于心跳检查:

Nacos单机模式的心跳机制 主要逻辑是:在客户端,开启一个延迟定时线程池,延时5秒,每隔5秒发起一次心跳检测,如果3秒没有响应,则把服务的健康状态置为UNHEALTHY,如果断开连接,则重试3次重连,在服务器端,如果30秒没有响应,才踢出该服务!

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值