为什么80%的码农都做不了架构师?>>>   

本文主要研究一下EurekaRibbonClientConfiguration

EurekaRibbonClientConfiguration

spring-cloud-netflix-eureka-client-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientConfiguration.java

/*** Preprocessor that configures defaults for eureka-discovered ribbon clients. Such as:* <code>@zone</code>, NIWSServerListClassName, DeploymentContextBasedVipAddresses,* NFLoadBalancerRuleClassName, NIWSServerListFilterClassName and more** @author Spencer Gibb* @author Dave Syer* @author Ryan Baxter*/
@Configuration
public class EurekaRibbonClientConfiguration {private static final Log log = LogFactory.getLog(EurekaRibbonClientConfiguration.class);@Value("${ribbon.eureka.approximateZoneFromHostname:false}")private boolean approximateZoneFromHostname = false;@RibbonClientNameprivate String serviceId = "client";@Autowired(required = false)private EurekaClientConfig clientConfig;@Autowired(required = false)private EurekaInstanceConfig eurekaConfig;@Autowiredprivate PropertiesFactory propertiesFactory;public EurekaRibbonClientConfiguration() {}public EurekaRibbonClientConfiguration(EurekaClientConfig clientConfig,String serviceId, EurekaInstanceConfig eurekaConfig,boolean approximateZoneFromHostname) {this.clientConfig = clientConfig;this.serviceId = serviceId;this.eurekaConfig = eurekaConfig;this.approximateZoneFromHostname = approximateZoneFromHostname;}@Bean@ConditionalOnMissingBeanpublic IPing ribbonPing(IClientConfig config) {if (this.propertiesFactory.isSet(IPing.class, serviceId)) {return this.propertiesFactory.get(IPing.class, config, serviceId);}NIWSDiscoveryPing ping = new NIWSDiscoveryPing();ping.initWithNiwsConfig(config);return ping;}@Bean@ConditionalOnMissingBeanpublic ServerList<?> ribbonServerList(IClientConfig config, Provider<EurekaClient> eurekaClientProvider) {if (this.propertiesFactory.isSet(ServerList.class, serviceId)) {return this.propertiesFactory.get(ServerList.class, config, serviceId);}DiscoveryEnabledNIWSServerList discoveryServerList = new DiscoveryEnabledNIWSServerList(config, eurekaClientProvider);DomainExtractingServerList serverList = new DomainExtractingServerList(discoveryServerList, config, this.approximateZoneFromHostname);return serverList;}@Beanpublic ServerIntrospector serverIntrospector() {return new EurekaServerIntrospector();}@PostConstructpublic void preprocess() {String zone = ConfigurationManager.getDeploymentContext().getValue(ContextKey.zone);if (this.clientConfig != null && StringUtils.isEmpty(zone)) {if (this.approximateZoneFromHostname && this.eurekaConfig != null) {String approxZone = ZoneUtils.extractApproximateZone(this.eurekaConfig.getHostName(false));log.debug("Setting Zone To " + approxZone);ConfigurationManager.getDeploymentContext().setValue(ContextKey.zone,approxZone);}else {String availabilityZone = this.eurekaConfig == null ? null: this.eurekaConfig.getMetadataMap().get("zone");if (availabilityZone == null) {String[] zones = this.clientConfig.getAvailabilityZones(this.clientConfig.getRegion());// Pick the first one from the regions we want to connect toavailabilityZone = zones != null && zones.length > 0 ? zones[0]: null;}if (availabilityZone != null) {// You can set this with archaius.deployment.* (maybe requires// custom deployment context)?ConfigurationManager.getDeploymentContext().setValue(ContextKey.zone,availabilityZone);}}}RibbonUtils.initializeRibbonDefaults(serviceId);}}
  • 创建了NIWSDiscoveryPing、DomainExtractingServerList、EurekaServerIntrospector
  • 初始化之后调用RibbonUtils.initializeRibbonDefaults(serviceId)

NIWSDiscoveryPing

ribbon-eureka-2.2.5-sources.jar!/com/netflix/niws/loadbalancer/NIWSDiscoveryPing.java

/*** "Ping" Discovery Client* i.e. we dont do a real "ping". We just assume that the server is up if Discovery Client says so* @author stonse**/
public class NIWSDiscoveryPing extends AbstractLoadBalancerPing {BaseLoadBalancer lb = null; public NIWSDiscoveryPing() {}public BaseLoadBalancer getLb() {return lb;}/*** Non IPing interface method - only set this if you care about the "newServers Feature"* @param lb*/public void setLb(BaseLoadBalancer lb) {this.lb = lb;}public boolean isAlive(Server server) {boolean isAlive = true;if (server!=null && server instanceof DiscoveryEnabledServer){DiscoveryEnabledServer dServer = (DiscoveryEnabledServer)server;             InstanceInfo instanceInfo = dServer.getInstanceInfo();if (instanceInfo!=null){                    InstanceStatus status = instanceInfo.getStatus();if (status!=null){isAlive = status.equals(InstanceStatus.UP);}}}return isAlive;}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {}}
  • NIWSDiscoveryPing通过获取实例的eureka状态来判断是否健康

DomainExtractingServerList

spring-cloud-netflix-eureka-client-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/eureka/DomainExtractingServerList.java

public class DomainExtractingServerList implements ServerList<DiscoveryEnabledServer> {private ServerList<DiscoveryEnabledServer> list;private final RibbonProperties ribbon;private boolean approximateZoneFromHostname;public DomainExtractingServerList(ServerList<DiscoveryEnabledServer> list,IClientConfig clientConfig, boolean approximateZoneFromHostname) {this.list = list;this.ribbon = RibbonProperties.from(clientConfig);this.approximateZoneFromHostname = approximateZoneFromHostname;}@Overridepublic List<DiscoveryEnabledServer> getInitialListOfServers() {List<DiscoveryEnabledServer> servers = setZones(this.list.getInitialListOfServers());return servers;}@Overridepublic List<DiscoveryEnabledServer> getUpdatedListOfServers() {List<DiscoveryEnabledServer> servers = setZones(this.list.getUpdatedListOfServers());return servers;}private List<DiscoveryEnabledServer> setZones(List<DiscoveryEnabledServer> servers) {List<DiscoveryEnabledServer> result = new ArrayList<>();boolean isSecure = this.ribbon.isSecure(true);boolean shouldUseIpAddr = this.ribbon.isUseIPAddrForServer();for (DiscoveryEnabledServer server : servers) {result.add(new DomainExtractingServer(server, isSecure, shouldUseIpAddr,this.approximateZoneFromHostname));}return result;}}class DomainExtractingServer extends DiscoveryEnabledServer {private String id;@Overridepublic String getId() {return id;}@Overridepublic void setId(String id) {this.id = id;}public DomainExtractingServer(DiscoveryEnabledServer server, boolean useSecurePort,boolean useIpAddr, boolean approximateZoneFromHostname) {// host and port are set in super()super(server.getInstanceInfo(), useSecurePort, useIpAddr);if (server.getInstanceInfo().getMetadata().containsKey("zone")) {setZone(server.getInstanceInfo().getMetadata().get("zone"));}else if (approximateZoneFromHostname) {setZone(ZoneUtils.extractApproximateZone(server.getHost()));}else {setZone(server.getZone());}setId(extractId(server));setAlive(server.isAlive());setReadyToServe(server.isReadyToServe());}private String extractId(Server server) {if (server instanceof DiscoveryEnabledServer) {DiscoveryEnabledServer enabled = (DiscoveryEnabledServer) server;InstanceInfo instance = enabled.getInstanceInfo();if (instance.getMetadata().containsKey("instanceId")) {return instance.getHostName()+":"+instance.getMetadata().get("instanceId");}}return super.getId();}
}
  • getInitialListOfServers及getUpdatedListOfServers都调用了setZones从eureka的metadata读取zone

EurekaServerIntrospector

spring-cloud-netflix-eureka-client-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netflix/ribbon/eureka/EurekaServerIntrospector.java

public class EurekaServerIntrospector extends DefaultServerIntrospector {@Overridepublic boolean isSecure(Server server) {if (server instanceof DiscoveryEnabledServer) {DiscoveryEnabledServer discoveryServer = (DiscoveryEnabledServer) server;return discoveryServer.getInstanceInfo().isPortEnabled(InstanceInfo.PortType.SECURE);}return super.isSecure(server);}@Overridepublic Map<String, String> getMetadata(Server server) {if (server instanceof DiscoveryEnabledServer) {DiscoveryEnabledServer discoveryServer = (DiscoveryEnabledServer) server;return discoveryServer.getInstanceInfo().getMetadata();}return super.getMetadata(server);}
}
  • 这里从eureka的instanceInfo获取metadata

小结

EurekaRibbonClientConfiguration主要是给ribbon配置eureka相关的特性,主要是NIWSDiscoveryPing、DomainExtractingServerList、EurekaServerIntrospector这几个:

  • 其中NIWSDiscoveryPing通过eureka中instance的状态来判断是否ping的通
  • DomainExtractingServerList提供getInitialListOfServers以及getUpdatedListOfServers方法
  • EurekaServerIntrospector主要是通过instanceInfo获取metadata

doc

  • 16.5 Using Ribbon with Eureka

转载于:https://my.oschina.net/go4it/blog/1860751

聊聊EurekaRibbonClientConfiguration相关推荐

  1. 面向对象设计原则_聊聊面向对象的6大设计原则

    程序员都知道编程有 3 大类:面向过程.面向对象.面向函数.面向对象是被讨论的最多的,个人认为,这是因为 Java 之类的编程语言有强大的用户基础,本质还是因为比较符合人的直觉. 说到面向对象,大家可 ...

  2. python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式

    1. 前言 邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到 我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本.富文本.HTML 等格式的邮件 本文将聊聊利用 Python ...

  3. 今天聊聊分布式锁 No.86

    好了切入正题,一直在工作中会聊到很多锁的问题,今天跟大家一起闲聊一下,究竟什么是锁,为什么需要锁,以及分布式的情况下,怎么设计和实现锁. 什么是锁? 明·魏禧<大铁椎传>上是这样解释的: ...

  4. 聊聊找工作中的项目经验问题(推荐系统和智能问答)

    在求职过程中有这么一句话叫做"金九银十",也就是说,很多时候,求职的黄金时期就是在九月份和十月份,这两个月份中企业需求是最多的,求职的成功率也是最高的.但是随着AI方面的人才越来越 ...

  5. 聊聊Service Mesh:linkerd

    [编者的话]随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所带来的服务间通讯的复杂 ...

  6. 庖丁解牛迭代器,聊聊那些藏在幕后的秘密

    0x00 前言 \\ 在我之前的一篇博客<细说C#:不是"栈类型"的值类型,从生命周期聊存储位置>的最后,我以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够 ...

  7. 聊聊Unsafe的一些使用技巧

    记得初学 Java 那会,刚学完语法基础,就接触到了反射这个 Java 提供的特性,尽管在现在看来,这是非常基础的知识点,但那时候无疑是兴奋的,瞬间觉得自己脱离了"Java 初学者" ...

  8. 聊聊 TCP 长连接和心跳那些事

    1 前言 可能很多 Java 程序员对 TCP 的理解只有一个三次握手,四次挥手的认识,我觉得这样的原因主要在于 TCP 协议本身稍微有点抽象(相比较于应用层的 HTTP 协议):其次,非框架开发者不 ...

  9. 聊聊算法在面试中的地位

    前段时间,有一位好友找到我,向我打听阿里社招笔试是否看重算法题的考察,我给予了肯定的答复.他表现的有些沮丧,表示自己工程底子很扎实,框架源码也研究地很透彻,唯独算法能力不行,leetcode 上的简单 ...

  10. 聊聊未来的程序员该如何选公司和谋规划

    聊聊未来的程序员该如何选公司和谋规划 前言 嗨喽,读者朋友们大家好,由hsm_computer老师给大家讲解,写好简历后,如何选公司投简历,如何对自己的未来做规划. 正文 过了年以后,新的一轮春招又要 ...

最新文章

  1. elasticsearch v6.5.4配置
  2. matlab练习程序(点云下采样)
  3. FIR定点提高精度的trick_02
  4. lan8720a自协商启动_紫金矿业2020届校招海外9站全面启动(面向全专业)
  5. android room表关联,如何在首次运行时填充Android Room数据库表?
  6. MyBatis嵌套查询解析
  7. 软件测试工程师-Linux介绍、命令
  8. 一个事务复制的bug--更新丢失
  9. 【亲测有效】vs2017无法断点
  10. 绝不在构造/析构函数中使用虚函数
  11. PROSOFT模块MVI56E-MNETC、MVI56-PDPMV1、PTQ-PDPMV1、AN-X2-AB-DHRIO、MVI56-MBP、MVI56-MNETR、MVI56-MNET
  12. 高级Bash脚本编程指南
  13. TensorLy-神经网络张量库
  14. 【福利贴】迅雷会员账号共享,每天更新
  15. cJSON 轻量级json解析器 速度快
  16. PHP如何接入短信接口,通过短信群发通知
  17. QCC3071与QCC3072有什么区别?
  18. 商业模式分析——以饿了么、美团外卖为例
  19. 关于扁平化界面风格的设计美学讨论
  20. 大学计算机课程ppt,以计算思维为导向的大学计算机基础课

热门文章

  1. 深度学习基础之线性回归
  2. java创建ssh链接池_HttpClient实战三:Spring整合HttpClient连接池
  3. python mysql编码_Python和MySql:Unicode和编码
  4. 创新不是突然而至——它是慢慢成长的
  5. 装tensorflow未果
  6. android studio for android learning (三) 我的第一个APP
  7. Ajax无刷新评论的PHP代码,PHP Ajax实现页面无刷新发表评论
  8. android多地图切换,Android的谷歌地图卫星切换
  9. PHP实现常用的数据结构之链表
  10. 使用gatling做压力测试与负载测试