EurekaServer的集群间复制(Replicate)
首先按照上一章节搭建环境并用wireshark抓包后,可以发现它们内部通过三个轮询请求进行同步
POST /eureka/peerreplication/batch/
PUT /eureka/apps/EUREKA-SERVER/pc_name:8081?status=UP&lastDirtyTimestamp=15575xxxxxxxx
GET /eureka/apps/delta
PeerReplication流程
我们依然不先看源码,先搞清楚RPC,以peer1为例
# 找到peer1的连接信息
lsof -i -n -P |grep `ps aux|grep java|grep peer1| awk '{print $2}'`
可以看出EurekaServer连接的关系是P2P关系,三个Peer两两相连
用Wireshark进行调试
# 所有发送给Peer1的请求
http.request.uri contains "peerreplication" && tcp.dstport==8081
可以发现这是一个30s间隔的轮询(scheduled updates)
然后在接收侧打上断点
com.netflix.eureka.resources.PeerReplicationResource#batchReplication
通过断点照成的超时,找到发送侧的报错stacktrace
com.netflix.eureka.cluster.ReplicationTaskProcessor#process
这样就可以迅速分析源码了
renew流程
对客户端的ClientUrl进行追踪,可以发现拼装侧在如下位置,来自配置文件
com.netflix.eureka.cluster.PeerEurekaNodes#resolvePeerUrls
以peer1为例,它将for循环依此请求peer2与peer3,在接收侧接收HTTP请求后,同Client一样的方法,更新自己的Memory内存中的信息,这些过程是没锁的对所有地址的广播( broadcast replication)。
好吧,就写到这吧,我个人认为没有必要继续分析下去,这个方案太浩大了,个人目前只能给出工程断点,缺少视野,否则接着只能写出粘贴源码类的文章了。