如何使用 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 并发布微服务的下一个版本时,我需要
- 启动一个新的服务实例
- 将请求流量从旧实例切换到新实例
- 删除/关闭旧的
并且我不想在这些步骤中重新启动我的网关。其实我在看一个运行时动态路由的方法。
尤里卡
不幸的是,这并不是那么容易,因为 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-v1
和 service-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
(请注意,此端点是安全的,因此您需要向其传递一个令牌才能通过)
我使用 jhipster-registry 进行注册和管理微服务。它基于 Spring Cloud Netflix Eureka 和 Spring Cloud Config。
当我添加新的 api 并发布微服务的下一个版本时,我需要
- 启动一个新的服务实例
- 将请求流量从旧实例切换到新实例
- 删除/关闭旧的
并且我不想在这些步骤中重新启动我的网关。其实我在看一个运行时动态路由的方法。
尤里卡
不幸的是,这并不是那么容易,因为 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-v1
和service-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
(请注意,此端点是安全的,因此您需要向其传递一个令牌才能通过)