MeasuredRate
是一个测速器,或者是统计器,在某一个时间段统计一个次数 (eureka
里面大量使用 Timer
和 耗时统计),Eureka 主要使用再一下几个地方:
代码如下:
/*** 实用程序类,用于获取过去X毫秒内的计数。* <p>* Utility class for getting a count in last X milliseconds.** @author Karthik Ranganathan,Greg Kim*/public class MeasuredRate {private static final Logger logger = LoggerFactory.getLogger(MeasuredRate.class);/*** 上一次统计的次数*/private final AtomicLong lastBucket = new AtomicLong(0);/*** 当前统计的次数*/private final AtomicLong currentBucket = new AtomicLong(0);private final long sampleInterval;/*** 定时器*/private final Timer timer;/*** 是否激活(start 的时候激活)*/private volatile boolean isActive;/*** @param sampleInterval in milliseconds*/public MeasuredRate(long sampleInterval) {this.sampleInterval = sampleInterval;this.timer = new Timer("Eureka-MeasureRateTimer", true);this.isActive = false;}public synchronized void start() {if (!isActive) {timer.schedule(new TimerTask() {@Overridepublic void run() {try {// 将当前存储桶清零,并保存到 lastBucket// Zero out the current bucket.lastBucket.set(currentBucket.getAndSet(0));} catch (Throwable e) {logger.error("Cannot reset the Measured Rate", e);}}}, sampleInterval, sampleInterval);isActive = true;}}public synchronized void stop() {if (isActive) {timer.cancel();isActive = false;}}/*** 获取上一次统计的 count* <p>* Returns the count in the last sample interval.*/public long getCount() {return lastBucket.get();}/*** 次数 +1* <p>* Increments the count in the current sample interval.*/public void increment() {currentBucket.incrementAndGet();}}
说明:
AtomicLong
那么在设置值的时候是,CAS 机制能够保证线程安全。代码如下:
// AbstractInstanceRegistrypublic boolean renew(String appName, String id, boolean isReplication) {// 略...// <2> 续租每分钟次数 +1renewsLastMin.increment();// <3> 设置 租约最后更新时间(续租)leaseToRenew.renew();return true;}
说明:
完结~
Eureka
的自我保护,是怎么去统计的?
通过 MeasuredRate
进行统计,每次 renew()
续约的时候,都会进行+1
Eureka
中的 MeasuredRate
主要用在那些地方?
两个地方,1.续约次数统计 2.集群复制的统计