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。我很好奇的几件事:

假设您也在使用 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 个月了。因此,如果您在此期间找到了一些其他解决方案,那么如果您能在您自己的问题的答案中分享它就太好了。