Skip to main content

微服务学习笔记

技术eurekaAbout 6 min

每天更新,用于记录未付学习过程中遇到的知识点、问题,及解决方案。

1 服务治理

之前程序的框架结构:
结构

1.1 Eureka服务治理基础框架的三个核心要素

  • 服务注册中心

Eureka提供的服务端,用于提供服务与发现。

  • 服务提供者

提供服务的应用,可以是一切遵循Eureka通讯机制的应用(不限于springboot)。它将自己提供的服务注册到Eureka。

  • 服务消费者

从服务注册中心获取服务列表,从而使消费者可以知道去何处调用需要的服务。可以通过ribbon和feign实现服务消费。

1.2 服务治理机制

  • 服务注册中心1,2相互注册形成高可用集群。
  • 服务提供者注册服务到注册中心。
  • 服务消费者同样指向注册中心。

1.2.1服务提供者

  • 服务注册
    服务提供者在启动时会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上自身服务的元数据信息。
    Eureka Server接收到这个REST请求后,将元数据信息存储在一个双层结构Map中。
    eureka.client.register-with-eureka=true 启动注册操作。
  • 服务同步
    服务提供者虽然会在不同的注册中心注册,但是当服务注册中心会转发请求到与其相连的其他注册中心,从而实现注册中心间的服务同步。通过服务同步,服务提供者的服务信息就可以通多服务注册中心的任一台获取到。
  • 服务续约
    服务注册完成后,服务提供者会维护一个心跳,防止EurekaServer“剔除任务”。
    eureka.instance.lease-renewal-interval-in-seconds=30 设置服务续约任务的调用间隔。
    eureka.instance.lease-expiration-duration-in-seconds=90 定义服务失效时间。

1.2.2 服务消费者

  • 获取服务
    当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取注册的服务清单。EurekaServer会维护一份只读的服务清单返回给客户端,同时该缓存清单会每隔30秒更新一次。
    客户端设置 eureka.client.fetch-register=true(虽然这是默认的)
    eureka.client.fetch-register-interval-seconds=30设置缓存清单更新时间。

  • 服务调用
    消费者获取服务清单后,通过服务名可以获取:服务实例名和该实例的元数据信息。
    在Ribbon中通过轮询的方式进行调用实例,从而实现客户端的负载均衡。
    进行服务调用时优先访问同处一个zone中的服务提供方。若访问不到则访问其他的zone。【每一个客户端对应一个region和一个zone】

  • 服务下线
    当服务实例进行正常关闭时,会触发一个服务下线的REST请求给EurekaServer,服务注册中心收到请求后,将该服务状态设置为下线down(上线为up)。并把下线事件传播出去。

1.2.3 服务注册中心

  • 失效剔除
    当服务实例非正常下线,服务注册中心未收到下线请求。EurekaServer的定时任务会将清单中超时没有续约的服务剔除。
  • 自我保护

本地调试时基本会在界面看到这条信息。这就是触发了EurekaServer的自我保护机制。EurekaServer在运行期间,会统计心跳失败比例在15分钟内是否低于85%。eureka会将当前实例信息保护起来,不让其过期。
使用eureka.server.enable-self-preservation=false来关闭保护机制。

1.3 配置

以上所有的应用都可以视为Eureka服务治理体系中的客户端。故,eureka客户端的配置包含两部分:

  • 服务注册相关配置:服务注册中心地址、服务获取间隔时间、可用区域等
  • 服务实例相关的配置信息:服务实例名称、IP地址、端口号、健康检查路径等。

1.3.1 服务注册类配置

可以查看org.springframework.cloud.netflix.eureka.EurekaClientConfigBean所有的配置信息都以eureka.client为前缀。

  • 指定注册中心
    eureka.client.serviceUrl.defaultZone=http....
    配置多个注册中心使用逗号分隔。
    http://<username>:<password>@ip:port/...使用安全校验信息。
    eureka.client.enable=true 启用Eureka客户端
    其他配置

  • 服务实例类配置
    可以查看org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean所有的配置信息都以eureka.instance为前缀。

    • 元数据

    元数据:Eureka客户端在向注册中心发送注册请求时,用来描述自身服务信息的对象。

    标准化元数据eureka.instance.<properties>=<value>
    自定义元数据eureka.instance.metedataMap.<key>=<value>

    • 实例名配置
      同一主机启动多实例时的默认配置规则:
      ${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
      对于实例的命名规则可以使用eureka.instance.instanceId参数进行配置。
      设置随机端口:server.port=0或者 server.port=${random.int[10000,19999]}
      虽然端口名不同但是实例名还是相同的,需要使用下面的方法设置不同的实例名:
      eureka.instance.instanceId=${spring.application.name}:${random.int}

    • 端点配置
      当我们为应用设置了context-path时,management.context-path=/hello,监控端点都应该加上这个前缀。需要变更actuator模块的访问的路径。
      eureka.instance.statusPageUrlPath=${management.context-path}/info
      eureka.instance.healthCheckUrlPath=${management.context-path}/health
      使用绝对路径方式:
      eureka.instance.healthCheckUrl=https://${eureka.instance.hostname}/health
      eureka.instance.statusPageUrl=https://${eureka.instance.hostname}/info
      eureka.instance.homePageUrl=https://${eureka.instance.hostname}/

    • 健康监测
      当服务不能正常提供时,比如服务所依赖的外部资源出现问题时,此时心跳还是在运行,客户端依旧可以使用非正常服务。这是不合理的。
      因此需要更加健全的健康状态维护。方法如下:
      首先在pom xml中引入actuator模块依赖
      配置参数eureka.client.healthcheck.enable=true

    • 其他配置
      其他配置

1.4 跨平台支持

Eureka的通信机制使用HTTP的REST接口实现,这也是Eureka同其他服务注册工具的一个关键不同点。HTTP是平台无关的,虽然Eureka Server通过java实现,但是其下微服务应用不限于使用java开发。

1.4.1 通信协议

Eureka使用Jersey和XStream配合JSON作为servlet和client之间的通讯协议。也可以选择实现自己的协议来代替。


华丽丽的分隔符!

What do you think?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.0.0-alpha.10