Spring 云:使用 Zuul 进行金丝雀部署
Spring Cloud: Canary Deployments with Zuul
我开始使用 Spring Cloud 使用 Eureka 和 Zuul,并且对构建 blue/green 和 Canary 部署有一些疑问。到目前为止,我已经完成了基础工作,并让 Eureka、Zuul 和配置服务器按预期工作。我想要完成的是建立一个有两个版本的服务,比如 1.0 和 1.1。对于特定用户的子集,我想将他们路由到 1.1 版本,而其他所有人都应该转到 1.0 版本。
Zuul 过滤器 API 对文档的理解有点浅,我正在努力理解一些概念,所以我想在这里问几个问题。我也有一些基本过滤器 运行,除了获取委托人的身份和他们请求的服务外,这些过滤器目前并没有做很多事情。我遇到困难的地方是了解如何将同一服务的两个不同版本公开给 Eureka 和 Zuul。我很好奇的几件事:
- 在文档、帖子和其他堆栈溢出之间,术语 "service" 和 "cluster" 似乎可以互换使用。这是正确的吗?
- 话虽如此,如果我有一个名为
/simpleservice
的服务,我是否会公开两个不同的 serviceID(即 simpleservice
和 simpleservice-1.1
)?如果我这样做,当其中一个目标用户请求 /simpleservice
时,我会让 Zuul 将他们发送到 /simpleservice-1.1
- 或者,您是否在现有服务 ID 中添加另一个节点,并为每个节点添加额外的元数据,以便 Zuul 和区分版本 1.0 和 1.1?
- 是正确答案"all of the above?" :)
假设您也在使用 Ribbon,我会保留服务 ID 的原样。相反,我会看一下 com.netflix.loadbalancer
package. Canary deployments are essentially load balancing with very specific constraints. You could implement your own AbstractLoadBalancerRule
,它根据您希望作为路由基础的某些 属性 选择服务器。然后将该规则添加到 Zuul 实例的配置中。
@Configuration
public class CanaryConfiguration {
@Bean public IRule canaryDeploymentRule(IClientConfig config) {
CanaryDeploymentRule rule = new CanaryDeploymentRule ();
rule.initWithNiwsConfig(config);
return rule;
}
}
如果您让您的服务使用不同的服务 ID("simpleservice" 和 "simpleservice-x.y")在 Eureka 中自行注册,我想事情一定会变得复杂。从 Eureka 检索可用服务器列表时,您必须扩展发现客户端以忽略版本部分(“-x.y”,同时仍然能够处理 "foo-service"),然后进行一些选择无论如何都要选择正确的过程。所以我想事情会变得更加复杂。
这一切都是基于最佳猜测,我还没有真正实施过。我意识到这个问题已经快 4 个月了。因此,如果您在此期间找到了一些其他解决方案,那么如果您能在您自己的问题的答案中分享它就太好了。
我开始使用 Spring Cloud 使用 Eureka 和 Zuul,并且对构建 blue/green 和 Canary 部署有一些疑问。到目前为止,我已经完成了基础工作,并让 Eureka、Zuul 和配置服务器按预期工作。我想要完成的是建立一个有两个版本的服务,比如 1.0 和 1.1。对于特定用户的子集,我想将他们路由到 1.1 版本,而其他所有人都应该转到 1.0 版本。
Zuul 过滤器 API 对文档的理解有点浅,我正在努力理解一些概念,所以我想在这里问几个问题。我也有一些基本过滤器 运行,除了获取委托人的身份和他们请求的服务外,这些过滤器目前并没有做很多事情。我遇到困难的地方是了解如何将同一服务的两个不同版本公开给 Eureka 和 Zuul。我很好奇的几件事:
- 在文档、帖子和其他堆栈溢出之间,术语 "service" 和 "cluster" 似乎可以互换使用。这是正确的吗?
- 话虽如此,如果我有一个名为
/simpleservice
的服务,我是否会公开两个不同的 serviceID(即simpleservice
和simpleservice-1.1
)?如果我这样做,当其中一个目标用户请求/simpleservice
时,我会让 Zuul 将他们发送到/simpleservice-1.1
- 或者,您是否在现有服务 ID 中添加另一个节点,并为每个节点添加额外的元数据,以便 Zuul 和区分版本 1.0 和 1.1?
- 是正确答案"all of the above?" :)
假设您也在使用 Ribbon,我会保留服务 ID 的原样。相反,我会看一下 com.netflix.loadbalancer
package. Canary deployments are essentially load balancing with very specific constraints. You could implement your own AbstractLoadBalancerRule
,它根据您希望作为路由基础的某些 属性 选择服务器。然后将该规则添加到 Zuul 实例的配置中。
@Configuration
public class CanaryConfiguration {
@Bean public IRule canaryDeploymentRule(IClientConfig config) {
CanaryDeploymentRule rule = new CanaryDeploymentRule ();
rule.initWithNiwsConfig(config);
return rule;
}
}
如果您让您的服务使用不同的服务 ID("simpleservice" 和 "simpleservice-x.y")在 Eureka 中自行注册,我想事情一定会变得复杂。从 Eureka 检索可用服务器列表时,您必须扩展发现客户端以忽略版本部分(“-x.y”,同时仍然能够处理 "foo-service"),然后进行一些选择无论如何都要选择正确的过程。所以我想事情会变得更加复杂。
这一切都是基于最佳猜测,我还没有真正实施过。我意识到这个问题已经快 4 个月了。因此,如果您在此期间找到了一些其他解决方案,那么如果您能在您自己的问题的答案中分享它就太好了。