vlambda博客
学习文章列表

Nacos源码解读与部署

1.Nacos源码如何调试分析
2.Nacos服务注册源码解读
3.Nacos服务发现源码解读
4.Nacos心跳续约源码解读
5.Nacos与Eureka源码对比
6.Nacos raft集群源码解读

源码下载

https://github.com/alibaba/nacos

常见错误

找到consoleNacos启动加上参数 设置为非集群方式启动;

 

-Dnacos.standalone=true

服务注册源码解读

服务注册:生产者启动的时候会将该接口的信息注册到

nacosServer 缓存容器中;

 

1.nacos源码导入到idea中;

 

2.NacosClient端:根据日志分析:s.c.a.n.registry.NacosServiceRegistry  : nacos registry, mayikt-member192.168.18.224:8081 register finished

服务注册执行在NacosServiceRegistry   中的registry方法

使用httpClient技术发送 rest请求达到Nacos服务器端实现服务注册

1.     NacosServer端:

通过该接口/nacos/v1/ns/instance 搜索 NacosServer端的源码

服务注册核心api接口走的InstanceController#register

方法底层使用dataMap = new ConcurrentHashMap<>(1024);

 

服务下线走接口:

 

 

 

 

 

 

Nacos客户端源码解读

 

 

通过启动nacos客户端日志分析出:服务注册执行:nacos registry, mayikt-member 192.168.18.224:8081 registerfinished  搜索日志查找到NacosServiceRegistry#

public void register(....)  使用httpClient技术发送rest请求到达nacos服务器端注册接口信息
接口地址:http://127.0.0.1:8848/nacos/v1/ns/instance
 
 

Nacos服务器端源码解读

 

http://127.0.0.1:8848/nacos/v1/ns/instance搜索到 该请求在

InstanceController publicString register(HttpServletRequest request) 存入到

consistencyService.put集合中; key为服务名 value 为接口地址

 

 
 
 

 

服务心跳续约源码解读

Nacos客户端心跳续约

 

Nacos客户端心跳续约:

 

 

 

 

BeatReactor中的构造函数初始化了一个定时任务线程new BeatProcessor(),执行心跳任务类 BeatTaskrun方法,默认每隔5s时间发送一个心跳包到达服务器端;

 

Nacos服务器端心跳续约

服务器端在InstanceController#beat(HttpServletRequest request)接收客户端心跳续约包,
ClientBeatProcessor 线程中的run方法 修改最后续约的时间instance.setLastBeat(System.currentTimeMillis());
 
Nacos Server接收到心跳请求之后或者服务注册时,调用Service.init()初始化了一个
定时任务ClientBeatCheckTask,默认每隔5s心跳检测过期地址
在该ClientBeatCheckTask run方法中 遍历所有的地址,判断
if (System.currentTimeMillis() - instance.getLastBeat() > instance.getIpDeleteTimeout()) {
当前系统时间-最后续命时间>30s 则认为该地址过期 nacos服务器中移除该地址。
 
http://127.0.0.1:8848/nacos/v1/ns/instance?ephemeral=true&serviceName=DEFAULT_GROUP@@gzj-member&port=8081&namespaceId=public&ip=192.168.18.224&clusterName=DEFAULT&
有走到com.alibaba.nacos.naming.controllers.InstanceController#deregister Map合中移除该地址。
 
 
 
 
Nacos服务器端 判断如果续约超时15s 的情况下不会移除该缓存地址,而发布超时事件
Nacos服务器端 判断如果续约超时30s 的情况下才会移除该缓存地址
 

服务下线源码解读

 

1.服务下线

Idea断点调试;

 

Idea 非断点启动的情况下;

 

 

调用调用不通。

如何解决呢?消费者调用接口的时候,如果调用不通的情况下,则使用本地负载均衡故障

转移方式获取下一台节点调用。

For

 

 

 

Feign自带。

 

 

 

 

 

 

 

 

 

 

 

 
通过日志可以分析出:当nacos客户端停止之后,会走NacosServiceRegistry
发送一个rest请求达到nacos服务器端从缓存中移除该地址
com.alibaba.nacos.naming.controllers.InstanceController#deregister Map合中移除该地址。
注意 如果是非常正常停止,则不会向nacos服务器端发送移除地址通知,只能通过
心跳检测移除,大概延迟30s左右。
 

服务集群数据同步

 

 

 

Nacos安装和集群搭建(docker版)

  1. nacos安装

docker pull nacos/nacos-server:1.1.4

 

  1. 创建挂载配置文件和日志文件目录

mkdir –p /usr/local/nacos/conf

mkdir –p /usr/local/nacos/logs

进入容器或者其他渠道复制一份nacos配置文件到刚才创建的conf目录

docker cp 容器id:/home/nacos/conf /usr/local/nacos/conf

  1. Nacos集群持久化配置

Nacos本身采用内存数据库,重启就会消失,为nacos数据持久化并且集群环境下因为数据一致性问题必须配置Mysql数据库内创建nacos_config库,并运行nacos安装目录conf下的sql脚本创建对应表结构。

  1. 修改需要挂载的配置文件

配置cluster.conf文件,设置集群



application.properties:db.num为数据库实例数量,多数据库可通过db.url.0,db.url.0指定不同的数据库链接 

Nacos源码解读与部署


  1. 启动nacos

默认集群启动,docker run分别挂载启动,指定jvm参数即可,非docker直接安装目录

./startup.sh启动  ./startup.sh –p 8849方式可以指定端口号。

Nacos参数https://nacos.io/zh-cn/docs/quick-start-docker.html

单机启动 命令启动starup.sh–m standalone

集群启动docker run --name nacos-server-1 -d -p 8848:8848 --privileged=true--restart=always -e JVM_XMS=32m -e JVM_XMX=64m -e MODE=cluster -ePREFER_HOST_MODE=hostname -v /usr/local/nacos/logs:/home/nacos/logs -v/usr/local/nacos/conf:/home/nacos/conf nacos/nacos-server:1.1.4

生产环境注意,因nacos日志增长特别快,主要有以下几个地方:

  1. tomcat访问日志,可在application.propertiesserver.tomcat.accesslog.enabled=false关闭,生产环境是否关闭酌情考虑。

  2. 服务端业务日志,修改nacos-logback.xml即可。

  3. 客户端日志,控制台心跳日志:在java项目内配置日志级别即可。

    Nacos源码解读与部署


  1. 客户端日志,config.lognaming.log这两个主要是配置及服务发现的日志,特别多,两种方式控制,必须版本在1.1.3之后。

    通过接口控制

# 调整naming模块的naming-raft.log的级别为error:curl -X PUT '$nacos_server:8848/nacos/v1/ns/operator/log?logName=naming-raft&logLevel=error'#调整config模块的config-dump.log的级别为warn:curl -X PUT'$nacos_server:8848/nacos/v1/cs/ops/log?logName=config-dump&logLevel=warn'

 

java项目启动命令内控制

Java –jar –Dcom.alibaba.nacos.config.log.level=error–Dcom.alibaba.nacos.naming.log.level=error test.jar


 

Nacos源码解读与部署

 

 

Nacos访问

默认账号nacos密码nacos

通过put请求可切换nacosAPCP模式

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

一般用默认的AP模式即可

Nacos项目配置

Pom依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-discovery</artifactId><version>2.1.1.RELEASE</version> </dependency>

<dependency>

           <groupId>org.springframework.cloud</groupId>

           <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

           <version>0.2.2.RELEASE</version>

       </dependency>

 

 

注意:连接nacos分布式配置中心一定采用bootstrap形式优先加载 否则可能会报错。

 

bootstrap.yml 用于应用程序上下文的引导阶段。application

.yml 由父Spring ApplicationContext加载。

 

nacos创建的dataId名字一定要跟带格式后缀,不然找不到,如图

 

Nacos源码解读与部署