如何使用 jhipster-registry 将请求流量从旧服务器实例动态切换到新服务器实例?

How to switch request traffic from old server instance to a new one dynamically with jhipster-registry?

我使用 jhipster-registry 进行注册和管理微服务。它基于 Spring Cloud Netflix Eureka 和 Spring Cloud Config。

当我添加新的 api 并发布微服务的下一个版本时,我需要

  1. 启动一个新的服务实例
  2. 将请求流量从旧实例切换到新实例
  3. 删除/关闭旧的

并且我不想在这些步骤中重新启动我的网关。其实我在看一个运行时动态路由的方法。

尤里卡

不幸的是,这并不是那么容易,因为 Eureka 更喜欢可用性而不是一致性,所以碰巧你的服务发现由服务组成,这些服务是死的。我更喜欢与 eurka​​ 一起使用的解决方法是为所有应用程序将 MaxAutoRetries 属性 设置得更高(这很简单,因为 JHipster Registry 是一个配置服务器,所以我与所有人分享这个),比如

ribbon:
  ConnectTimeout: 3000
  ReadTimeout: 60000
  MaxAutoRetries: 10

所以这至少可以使您的请求在部署过程中经过一段时间后成功。您会遇到一些延迟,因为第一次尝试将继续使用旧服务,这会超时……但不需要重新启动,您的新服务大约会在线。部署后 3 - 5 分钟(这是我的经验......可能因情况而异)

领事

作为替代方案,您可能会考虑切换到 Hashicorps consul 而不是 eureka,这有利于一致性,因此您将能够在部署后立即管理和同步您的服务发现。

目前 JHipster 只为 consul 提供 BETA 支持,因为 运行 完全安全的安装是不可能的,因为 this bug where I am waiting for the review of the fix

其实很容易实现你想要的:

  • 使用不同的 instanceId 部署您的服务的两个版本,例如 service-v1service-v2。这很容易通过设置 eureka.instance.instanceId.

  • 来实现
  • 最初,您的 Zuul 网关正在代理对 service-v1 的请求,配置服务器的 gateway.yml 中存在以下属性:

zuul:
  routes:
    service:
      path: /service/**
      serviceId: service-v1
  • 将配置服务器 zuul 配置更改为:
zuul:
  routes:
    service:
      path: /service/**
      serviceId: service-v2
  • 然后触发网关配置的刷新:
curl -X POST http://localhost:8080/management/refresh

(请注意,此端点是安全的,因此您需要向其传递一个令牌才能通过)