eureka之InstanceInfo单例管理器

1.好味道源码定位

com.netflix.eureka.EurekaBootStrap#initEurekaServerContext 方法中,
通过new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get() 方法来获取InstanceInfo单例。

这个类主要是为Guice轻量级依赖注入使用。

通过上面这种new 出来的只能保证单个EurekaConfigBasedInstanceInfoProvider对象内的InstanceInfo是单例的,而无法保证全局唯一。

@Provider 是用于提供复杂对象创建使用的。


2.单例

Provider<InstanceInfo> 自动注入EurekaConfigBasedInstanceInfoProvider到Guice框架的容器中去。

@Singleton 用于保证EurekaConfigBasedInstanceInfoProvider是单例。

如果EurekaConfigBasedInstanceInfoProvider是单例的,

那么通过Guice容器获取的EurekaConfigBasedInstanceInfoProvider实例生成的InstanceInfo是全局单例的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-atgidhAZ-1621341150857)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ae0a7754-b475-4089-98df-57c7d0a52a56/Untitled.png)]

保证InstanceInfo单例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LjW8gpbz-1621341150861)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/905dea83-8631-4f68-903f-ae5b98d2a2cd/Untitled.png)]


3.InstanceInfo中有哪些东西呢?


3.1 续约对象
// 默认的 续约(心跳)刷新周期为30秒。就是每30秒发送一次心跳
// 默认的过期周期为90秒,也就是超过90秒没有收到心跳信息,认为已经掉线,可以踢出服务
LeaseInfo.Builder leaseInfoBuilder = LeaseInfo.Builder.newBuilder()
                    .setRenewalIntervalInSecs(config.getLeaseRenewalIntervalInSeconds())
                    .setDurationInSecs(config.getLeaseExpirationDurationInSeconds());

3.2 使用builder建造者模式构建复杂对象
InstanceInfo.Builder builder = InstanceInfo.Builder.newBuilder(vipAddressResolver);

3.3 坏味道之硬判断亚马逊云服务信息

eureka中包涵了大量对亚马逊云的特殊处理,如果作为一个通用框架的话,这种处理是不具备扩展性的。属于硬编码兼容亚马逊云,对国内来说,就是影响阅读的代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtnSFBXC-1621341150868)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f0267bcc-4251-489f-b4a4-7610267da71c/Untitled.png)]


3.4 builder 清晰简单构建InstanceInfo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wtwLSG0F-1621341150873)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/384c59be-6c92-424c-9d09-bc1b5adc75ab/Untitled.png)]


3.5 InstanceInfo 状态变更
if (!config.isInstanceEnabledOnit()) {
    // 服务实例状态变更
    InstanceStatus initialStatus = InstanceStatus.STARTING;
    LOG.info("Setting initial instance status as: " + initialStatus);
    builder.setStatus(initialStatus);
} else {
    LOG.info("Setting initial instance status as: {}. This may be too early for the instance to advertise "
             + "itself as available. You would instead want to control this via a healthcheck handler.",
             InstanceStatus.UP);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b0Ig7hrm-1621341150877)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/192ef983-c648-452f-9987-250d49a6aa56/Untitled.png)]


3.6 自定义元数据加载及续约信息绑定InstanceInfo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cn3bwasE-1621341150880)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/54d1c5db-b080-491a-94c4-8131d6956bbe/Untitled.png)]


4.总结

这里使用单例模式和建造者模式,这里有两个单例模式:一个单例模式是有容器框架Guice框架保证,一个是由synchronizedinstanceInfo == null 来保证单例。

eureka本身是由Netflix自身内部使用的,所以为了更好的与亚马逊云服务进行契合,做了很多特殊处理。但是对于一个框架来说,瑕疵却比较多。辩证看待,辩证学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值