Spring Cloud Ribbon 全解 (8) - SpringCloud环境下Ribbon+Eureka配置

简介: Spring Cloud Ribbon 全解 (8) - SpringCloud环境下Ribbon+Eureka配置

本文基于SpringCloud-Dalston.SR5

一般SpringCloud环境下是Ribbon+Eureka一起使用的:


SpringCloud环境下Ribbon+Eureka配置


示例项目

实例项目地址:https://github.com/HashZhang/ScanfoldAll/tree/master/Scanfold-SpringCloud/Scanfold-SpringCloud-Ribbon/Scanfold-SpringCloud-RibbonWithEureka

添加依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

添加配置:

spring.application.name=Scanfold-SpringCloud-RibbonWithEureka
server.port=8081
######## ribbon ########
#ribbon连接超时
test-service-provider.ribbon.ConnectTimeout=50
#ribbon读超时
test-service-provider.ribbon.ReadTimeout=8000
#最多重试多少台服务器
test-service-provider.ribbon.MaxAutoRetriesNextServer=1
#每台服务器最多重试次数,但是首次调用不包括在内
test-service-provider.ribbon.MaxAutoRetries=1
test-service-provider.ribbon.retryableStatusCodes=500
test-service-provider.ribbon.OkToRetryOnAllOperations=true
#服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除
#注意,EurekaServer一定要设置eureka.server.eviction-interval-timer-in-ms否则这个配置无效,这个配置一般为服务刷新时间配置的三倍
#默认90s
eureka.instance.lease-expiration-duration-in-seconds=15
#服务刷新时间配置,每隔这个时间会主动心跳一次
#默认30s
eureka.instance.lease-renewal-interval-in-seconds=5
#eureka client刷新本地缓存时间
#默认30s
eureka.client.registryFetchIntervalSeconds=5
#eureka客户端ribbon刷新时间
#默认30s
ribbon.ServerListRefreshInterval=1000
eureka.instance.preferIpAddress=true
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8211/eureka/


源码分析


类似于纯Ribbon的初始化,也是通过Intereceptor初始化Configuration,只不过这次主角是EurekaRibbonClientConfiguration:

@Bean
@ConditionalOnMissingBean
public IPing ribbonPing(IClientConfig config) {
    if (this.propertiesFactory.isSet(IPing.class, this.serviceId)) {
        return (IPing)this.propertiesFactory.get(IPing.class, config, this.serviceId);
    } else {
        NIWSDiscoveryPing ping = new NIWSDiscoveryPing();
        ping.initWithNiwsConfig(config);
        return ping;
    }
}
@Bean
@ConditionalOnMissingBean
public ServerList<?> ribbonServerList(IClientConfig config, Provider<EurekaClient> eurekaClientProvider) {
    if (this.propertiesFactory.isSet(ServerList.class, this.serviceId)) {
        return (ServerList)this.propertiesFactory.get(ServerList.class, config, this.serviceId);
    } else {
        DiscoveryEnabledNIWSServerList discoveryServerList = new DiscoveryEnabledNIWSServerList(config, eurekaClientProvider);
        DomainExtractingServerList serverList = new DomainExtractingServerList(discoveryServerList, config, this.approximateZoneFromHostname);
        return serverList;
    }
}
@Bean
public ServerIntrospector serverIntrospector() {
    return new EurekaServerIntrospector();
}
@PostConstruct
public void preprocess() {
    String zone = ConfigurationManager.getDeploymentContext().getValue(ContextKey.zone);
    if (this.clientConfig != null && StringUtils.isEmpty(zone)) {
        String availabilityZone;
        if (this.approximateZoneFromHostname && this.eurekaConfig != null) {
            availabilityZone = ZoneUtils.extractApproximateZone(this.eurekaConfig.getHostName(false));
            log.debug("Setting Zone To " + availabilityZone);
            ConfigurationManager.getDeploymentContext().setValue(ContextKey.zone, availabilityZone);
        } else {
            availabilityZone = this.eurekaConfig == null ? null : (String)this.eurekaConfig.getMetadataMap().get("zone");
            if (availabilityZone == null) {
                String[] zones = this.clientConfig.getAvailabilityZones(this.clientConfig.getRegion());
                availabilityZone = zones != null && zones.length > 0 ? zones[0] : null;
            }
            if (availabilityZone != null) {
                ConfigurationManager.getDeploymentContext().setValue(ContextKey.zone, availabilityZone);
            }
        }
    }
    RibbonUtils.setRibbonProperty(this.serviceId, CommonClientConfigKey.DeploymentContextBasedVipAddresses.key(), this.serviceId);
    RibbonUtils.setRibbonProperty(this.serviceId, CommonClientConfigKey.EnableZoneAffinity.key(), "true");
}

通过源码,可以看出,IPing的默认实现变成了NIWSDiscoveryPing,ServerList的默认实现变成DomainExtractingServerList;

NIWSDiscoveryPing之前的文章里面我们分析过其源码,ServerList的默认实现是基于DiscoveryEnabledNIWSServerList(之前也分析过)外面再包一层DomainExtractingServerList

这个DomainExtractingServerList其实就是在DiscoveryEnabledNIWSServerList返回的Server基础上封装了Zone信息,主要获取和更新逻辑还是DiscoveryEnabledNIWSServerList

至于调用还有重试和之前纯Ribbon的逻辑是一样的,这里不再赘述

相关文章
|
3月前
|
Cloud Native Java 对象存储
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
展望未来,随着5G、边缘计算等新技术的兴起,微服务架构的设计理念将会更加深入人心,Spring Cloud和Netflix OSS也将继续引领技术潮流,为企业带来更为高效、灵活且强大的解决方案。无论是对于初创公司还是大型企业而言,掌握这些前沿技术都将是在激烈市场竞争中脱颖而出的关键所在。
70 0
|
19天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
31 6
|
19天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
38 5
|
19天前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
31 5
|
1月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
42 2
|
2月前
|
Cloud Native Java 对象存储
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
55 1
|
4月前
|
负载均衡 Java Spring
Ribbon的超时配置会覆盖OpenFeign的超时配置吗
该文章详细分析了OpenFeign与Ribbon之间的超时配置关系,解释了Ribbon如何覆盖OpenFeign的默认超时配置,并探讨了OpenFeign超时配置的动态修改方案。
|
5月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
580 15
|
5月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
126 3
|
5月前
|
消息中间件 Java Nacos
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
80 0
下一篇
DataWorks