eureka 服务端如何保存客户端服务信息?

1 个回答

  • 澜夜师兄
    勇敢一点吧!我们不会比今年更年轻了。
    ### 1、源码分析 服务端注册源码(com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl.class的方法register)如下: ```java @Override public void register(final InstanceInfo info, final boolean isReplication) { int leaseDuration = Lease.DEFAULT_DURATION_IN_SECS; if (info.getLeaseInfo() != null && info.getLeaseInfo().getDurationInSecs() > 0) { leaseDuration = info.getLeaseInfo().getDurationInSecs(); } super.register(info, leaseDuration, isReplication); replicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication); } ``` 第7行调用了父类(com.netflix.eureka.registry.AbstractInstanceRegistry)register方法,源码如下: ```java public abstract class AbstractInstanceRegistry implements InstanceRegistry { ... private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>(); ... public void register(InstanceInfo registrant, int leaseDuration, boolean isReplication) { try { read.lock(); Map<String, Lease<InstanceInfo>> gMap = registry.get(registrant.getAppName()); REGISTER.increment(isReplication); if (gMap == null) { final ConcurrentHashMap<String, Lease<InstanceInfo>> gNewMap = new ConcurrentHashMap<String, Lease<InstanceInfo>>(); gMap = registry.putIfAbsent(registrant.getAppName(), gNewMap); if (gMap == null) { gMap = gNewMap; } } ... } } ``` 在register方法中,我们可以看到将服务实例信息InstanceInfo注册到了register变量中,它其实就是一个ConcurrentHashMap。 ### 2、总结 客户端通过Jersey框架(亚马逊的一个http框架)将服务实例信息发送到服务端,服务端将客户端信息放在一个ConcurrentHashMap对象中。
    发布于 2022-03-05 17:09 •IP属地 天津
    举报
    评论
    收藏