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的逻辑是一样的,这里不再赘述

相关文章
|
1月前
|
负载均衡 Java API
Spring Cloud 面试题及答案整理,最新面试题
Spring Cloud 面试题及答案整理,最新面试题
138 1
|
1月前
|
Java Nacos Sentinel
Spring Cloud Alibaba 面试题及答案整理,最新面试题
Spring Cloud Alibaba 面试题及答案整理,最新面试题
201 0
|
1月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
146 0
|
1月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
98 0
|
8天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
8天前
|
Java API 对象存储
对象存储OSS产品常见问题之使用Spring Cloud Alibaba情况下文档添加水印如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
24 2
|
17天前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
|
23天前
|
负载均衡 网络协议 Java
构建高效可扩展的微服务架构:利用Spring Cloud实现服务发现与负载均衡
本文将探讨如何利用Spring Cloud技术实现微服务架构中的服务发现与负载均衡,通过注册中心来管理服务的注册与发现,并通过负载均衡策略实现请求的分发,从而构建高效可扩展的微服务系统。
|
23天前
|
开发框架 负载均衡 Java
Spring boot与Spring cloud之间的关系
总之,Spring Boot和Spring Cloud之间的关系是一种构建和扩展的关系,Spring Boot提供了基础,而Spring Cloud在此基础上提供了分布式系统和微服务架构所需的扩展和工具。
18 4
Spring boot与Spring cloud之间的关系
|
24天前
Springcloud-ribbon和hystrix配置
Springcloud-ribbon和hystrix配置
7 0

热门文章

最新文章