Spring Cloud:使用Zuul进行金丝雀部署

17

我正在使用Eureka和Zuul开始使用Spring Cloud,并且在结构化蓝/绿部署和金丝雀部署方面有一些问题。到目前为止,我已经掌握了基础知识,并且已经按预期工作的Eureka、Zuul和配置服务器。我想要实现的是设置一个具有两个版本的服务,比如1.0和1.1。对于特定用户子集,我希望将它们路由到1.1版本,而其他人则应该转到1.0版本。

Zuul过滤器API在文档中详细介绍,并且我在努力理解某些概念,因此我想在此处提出一些问题。我还运行了一些基本过滤器,目前除了获取主体身份和请求的服务之外不做太多事情。我遇到难题的地方在于如何向Eureka和Zuul公开相同服务的两个不同版本。我有几个问题:

  • 在文档、文章和其他堆栈溢出之间,“服务”和“集群”这个术语似乎可以互换使用。这是正确的吗?
  • 在这种情况下,如果我有一个名为/simpleservice的服务,我是否需要公开两个不同的服务ID(即simpleservicesimpleservice-1.1)?如果我这样做,当目标用户之一请求/simpleservice时,我让Zuul将他们发送到/simpleservice-1.1
  • 或者,您是否向现有服务ID添加另一个节点,并为每个节点添加其他元数据,以便Zuul可以区分版本1.0和1.1?
  • 正确答案是“以上所有”? :)
1个回答

7
假设您也使用Ribbon,我会将服务ID保持不变。相反,我会查看com.netflix.loadbalancer包。金丝雀部署本质上是具有非常特定约束的负载平衡。您可以实现自己的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个月了。因此,如果您在此期间找到其他解决方案,如果您能在自己的问题答案中分享它,那将会很好。

1
我们之前使用的是带有Ribbon的Zuul,但我没有想到去查看Ribbon项目中的规则示例。这对我们很有帮助。一旦我们深入研究,我会再次发布消息的。 - Ryan J. McDonough
@Ryan 我非常想知道你是如何解决你的问题的? - Lasse L
你深入研究了吗,@RyanJ.McDonough? - Gerardo
我也很感兴趣。我们将有100个客户,我想使用10个特定且可唯一标识的客户进行金丝雀测试。客户端应用程序不会改变,只是微服务内部发生了变化。我该如何配置网关(?),以便将这些10个客户的请求路由到新版本的微服务,而不需要更改客户端中的任何内容? - mark1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接