Nacos源码解读与部署
1.Nacos源码如何调试分析
2.Nacos服务注册源码解读
3.Nacos服务发现源码解读
4.Nacos心跳续约源码解读
5.Nacos与Eureka源码对比
6.Nacos raft集群源码解读
源码下载
https://github.com/alibaba/nacos
常见错误
找到console的Nacos启动加上参数 设置为非集群方式启动;
-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(),执行心跳任务类 BeatTask的run方法,默认每隔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版)
nacos安装
docker pull nacos/nacos-server:1.1.4。
创建挂载配置文件和日志文件目录
mkdir –p /usr/local/nacos/conf
mkdir –p /usr/local/nacos/logs
进入容器或者其他渠道复制一份nacos配置文件到刚才创建的conf目录
docker cp 容器id:/home/nacos/conf /usr/local/nacos/conf
Nacos集群持久化配置
Nacos本身采用内存数据库,重启就会消失,为nacos数据持久化并且集群环境下因为数据一致性问题必须配置Mysql数据库内创建nacos_config库,并运行nacos安装目录conf下的sql脚本创建对应表结构。
修改需要挂载的配置文件
配置cluster.conf文件,设置集群
application.properties:db.num为数据库实例数量,多数据库可通过db.url.0,db.url.0指定不同的数据库链接
启动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日志增长特别快,主要有以下几个地方:
tomcat访问日志,可在application.properties的server.tomcat.accesslog.enabled=false关闭,生产环境是否关闭酌情考虑。
服务端业务日志,修改nacos-logback.xml即可。
客户端日志,控制台心跳日志:在java项目内配置日志级别即可。
客户端日志,config.log和naming.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
通过put请求可切换nacos的AP或CP模式
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名字一定要跟带格式后缀,不然找不到,如图