SpringCloud升级之路2020.0.x版-18.Eureka的客户端核心设计和配置

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: SpringCloud升级之路2020.0.x版-18.Eureka的客户端核心设计和配置

image.png


Eureka 客户端配置就是访问 Eureka Server 的客户端相关配置,包括 Eureka Server 地址的配置,拉取服务实例信息相关配置,当前实例注册相关配置和 http 连接相关配置。在 Spring Cloud 中,Eureka 客户端配置以 eureka.client 开头,对应配置类为 EurekaClientConfigBean

其中,Eureka 客户端有三个比较重要的定时任务,以及相关配置,这里用图的方式给大家展示出来了:

读取服务实例相关流程


微信图片_20220625164120.jpg


定时检查实例信息以及实例状态并同步到 Eureka Server



image.png


定时心跳相关流程



image.png


image.png


可以直接指定 Eureka Server 的地址,并且,这些配置可以动态修改,并且可以配置刷新时间。例如:

eureka:
    client:
      service-url:
        # 默认eureka集群,这里必须是defaultZone,不能用-替换大写,与其他的配置不一样,因为实在EurekaClientConfigBean里面写死的
        defaultZone: http://127.0.0.1:8211/eureka/
        zone1: http://127.0.0.1:8212/eureka/
        zone2: http://127.0.0.1:8213/eureka/
        zone3: http://127.0.0.1:8214/eureka/
      # 如果上面 eureka server 地址相关配置更新了,多久之后会重新读取感知到
      eureka-service-url-poll-interval-seconds: 300

也可以通过 DNS 获取 Eureka Server,例如:

eureka:
    client:
      # 是否使用 dns 获取,如果指定了则通过下面的 dns 配置获取,而不是上面的 service-url
      use-dns-for-fetching-service-urls: true
      # dns 配置
      # eureka-server-d-n-s-name: eureka.com
      # dns 配置的 eureka server 的 port
      # eureka-server-port: 80
      # dns 配置的 eureka server 的 port 后面的 uri 前缀 context
      # eureka-server-u-r-l-context: /eureka

同时,可能有不同的 Eureka Server 部署在不同的可用区域(zone)上,这里也可以配置 Eureka Client 的 zone 配置:

eureka:
    client:
      # 可用区列表,key 为 region,value 为 zone
      availability-zones:
        region1: zone1, zone2
        region2: zone3
      # 所在区域,通过这个读取 availability-zones 获取 zone,然后通过 zone 读取 service-url 获取对应的 eureka url
      # 这里的逻辑对应的类是 ConfigClusterResolver 和 ZoneAffinityClusterResolver
      region: region1
      # 如果设置为 true,则同一个 zone 下的 eureka 会跑到前面优先访问。默认为 true
      prefer-same-zone-eureka: true


image.png


我们可以配置是否从 Eureka 上面拉取服务实例信息,一般本地测试的时候,可能我们不想使用 Eureka 上面的注册实例的信息,就可以通过这个配置禁用 Eureka Client 从 Eureka 上面获取微服务实例信息。

eureka:
    client:
      # 是否从 eureka 上面拉取实例
      fetch-registry: true

拉取服务实例信息的请求,也是可以配置是拉取压缩信息还是完整信息,以及是否通过增量拉取获取实例信息。Eureka 增量拉取机制实现很简单,就是新注册或者淘汰的实例会放入最近修改队列,队列中的信息会作为增量拉取的响应返回。增量拉取可能会丢失某些实例的更新,但是节省网络流量,在网络不好的情况下可以使用增量拉取。增量拉取中有版本控制,如果版本有差异,还是会通过全量拉取,之后再进行增量拉取。

eureka:
    client:
      # 是否禁用增量拉取,如果网络条件不好,可以禁用,每次都会拉取全量。增量拉取中有版本控制,如果版本有差异,还是会通过全量拉取,之后再进行增量拉取。
      disable-delta: false
      # 客户端请求头指定服务端返回的实例信息是压缩的信息还是完整信息,默认是完整信息
      # full, compact
      client-data-accept: full
      # 针对增量拉取,是否每次都日志差异
      log-delta-diff: true

拉取后的实例会被保存到本地缓存中,本地缓存具有过期时间:

eureka:
    client:
      # eureka client 刷新本地缓存时间
      # 默认30s
      registry-fetch-interval-seconds: 5
      # 只保留状态为 UP 的实例,默认为 true
      filter-only-up-instances: true
      # eureka client 刷新本地缓存(定时拉取 eureka 实例列表)线程池大小,默认为 2
      cache-refresh-executor-thread-pool-size: 2
      # eureka client 刷新本地缓存(定时拉取 eureka 实例列表)线程池任务最大延迟时间,这个配置是定时拉取任务延迟(registry-fetch-interval-seconds)的倍数,默认 10 倍
      cache-refresh-executor-exponential-back-off-bound: 10

同时,在 Spring Cloud 环境中,只要是基于 spring-cloud-commons 的微服务实现(其实所有 Spring Cloud 实现都是基于这个实现的),服务发现的 Client: DiscoveryClient(同步环境) 与 ReactiveDiscoveryClient(异步环境)都是使用的 Composite 的实现,也就是内部有多种服务发现 Client,服务发现按照一定顺序调用每一个服务发现 Client,这里也可以配置 Eureka Client 的顺序。

eureka:
    client:
      #在spring cloud 环境中,DiscoveryClient 用的其实都是 CompositeDiscoveryClient,这个 CompositeDiscoveryClient 逻辑其实就是多个 DiscoveryClient 共存,先访问一个,没找到就通过下一个寻找
      #这个order决定了顺序,默认为 0
      order: 0


image.png


我们在本地测试的时候,可能不想将本地这个实例注册到 Eureka Server 上面,这也是可以配置的:

eureka:
    client:
      # 是否将自己注册到 eureka 上面
      register-with-eureka: true

同时,Eureka 本身的设计中,Eureka 实例信息以及配置是可以改变的,那么多久会同步到 Eureka Server 上呢?注意这个和心跳请求不一样,这个是可以单独配置的:

eureka:
    client:
    # 实例信息同定时同步到 Eureka Server 的间隔时间。每隔这么长时间,检查实例信息(即eureka.instance配置信息)是否发生变化,如果发生变化,则同步到 Eureka Server,默认 30s
      # 主要检查两类信息,分别是服务地址相关信息,以及服务过期时间与刷新时间配置信息
      instance-info-replication-interval-seconds: 30
      # 实例信息同定时同步到 Eureka Server 的初始延迟时间,默认 40s
      initial-instance-info-replication-interval-seconds: 40

还有一些其他配置我们可能也用的到:

eureka:
    client:
    # 是否在初始化的时候就注册到 eureka,一般设置为 false,因为实例还不能正常提供服务
      should-enforce-registration-at-init: false
      # 是否在关闭的时候注销实例,默认为 true
      should-unregister-on-shutdown: true
      # 是否对于实例状态改变更新进行限流,默认为 true
      on-demand-update-status-change: true



image.png


Eureka Client 基于 Http 请求获取服务实例信息,这里可以针对 Http 客户端进行配置:

eureka:
    client:
      # 代理相关配置
      # proxy-host:
      # proxy-port:
      # proxy-user-name:
      # proxy-password:
      # 是否对于发往 Eureka Server 的 http 请求启用 gzip,目前已经过期了,只要 Eureka Server 启用了 gzip,请求就是 gzip 压缩的
      g-zip-content: true
      # httpclient 的链接超时,默认 5s
      eureka-server-connect-timeout-seconds: 5
      # httpclient 的读取超时,默认 5s
      eureka-server-read-timeout-seconds: 8
      # httpclient 的空闲连接超时,默认 30s
      eureka-connection-idle-timeout-seconds: 30
      # httpclient 的总连接数量,默认 200
      eureka-server-total-connections: 200
      # httpclient 的每个 host 的连接数量
      eureka-server-total-connections-per-host: 50
    # tls 相关配置,默认没有启用
#      tls:
#        enabled: false
#        key-password:
#        key-store:
#        key-store-password:
#        key-store-type:
#        trust-store:
#        trust-store-password:
#        trust-store-type:


image.png


我们这一节详细分析了 Eureka 的客户端配置。下一节,我们将开始分析 Eureka Server 相关的配置。

相关文章
|
27天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
170 73
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
66 4
|
2月前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
73 0
|
3月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
72 0
|
1天前
|
监控 Java 数据库连接
Spring c3p0配置详解
在Spring项目中配置C3P0数据源,可以显著提高数据库连接的效率和应用程序的性能。通过合理的配置和优化,可以充分发挥C3P0的优势,满足不同应用场景的需求。希望本文的详解和示例代码能为开发者提供清晰的指导,帮助实现高效的数据库连接管理。
25 10
|
4天前
|
人工智能 安全 Java
AI 时代:从 Spring Cloud Alibaba 到 Spring AI Alibaba
本次分享由阿里云智能集团云原生微服务技术负责人李艳林主讲,主题为“AI时代:从Spring Cloud Alibaba到Spring AI Alibaba”。内容涵盖应用架构演进、AI agent框架发展趋势及Spring AI Alibaba的重磅发布。分享介绍了AI原生架构与传统架构的融合,强调了API优先、事件驱动和AI运维的重要性。同时,详细解析了Spring AI Alibaba的三层抽象设计,包括模型支持、工作流智能体编排及生产可用性构建能力,确保安全合规、高效部署与可观测性。最后,结合实际案例展示了如何利用私域数据优化AI应用,提升业务价值。
|
27天前
|
Java Spring
【Spring配置相关】启动类为Current File,如何更改
问题场景:当我们切换类的界面的时候,重新启动的按钮是灰色的,不能使用,并且只有一个Current File 项目,下面介绍两种方法来解决这个问题。
|
27天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
27天前
|
Java Spring
【Spring配置】创建yml文件和properties或yml文件没有绿叶
本文主要针对,一个项目中怎么创建yml和properties两种不同文件,进行配置,和启动类没有绿叶标识进行解决。
|
1月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
109 14