17

我开始使用 Eureka 和 Zuul 使用 Spring Cloud,并且对构建蓝/绿和 Canary 部署有一些疑问。到目前为止,我已经完成了基础工作,并让 Eureka、Zuul 和配置服务器按预期工作。我想要完成的是设置一个有两个版本的服务,比如 1.0 和 1.1。对于特定用户的子集,我想将他们路由到 1.1 版本,而其他所有人都应该转到 1.0 版本。

Zuul 过滤器 API 对文档的了解有点少,我正在努力理解一些概念,所以我想在这里问几个问题。我还运行了一些基本过滤器,除了获取委托人的身份和他们请求的服务之外,它们并没有做很多事情。我碰壁的地方是了解如何向 Eureka 和 Zuul 公开同一服务的两个不同版本。我很好奇的几件事:

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

1 回答 1

7

假设您也在使用 Ribbon,我将保留服务 ID。相反,我会看看com.netflix.loadbalancer包裹。Canary 部署本质上是具有非常特定约束的负载平衡。您可以实现自己的AbstractLoadBalancerRule,根据您希望路由所基于的某些属性来选择服务器。然后将该规则添加到 Zuul 实例的配置中。

@Configuration
public class CanaryConfiguration {
    @Bean public IRule canaryDeploymentRule(IClientConfig config) {
      CanaryDeploymentRule rule = new CanaryDeploymentRule ();
      rule.initWithNiwsConfig(config);
      return rule;
    }
}

如果你让你的服务使用不同的服务 ID(“simpleservice”和“simpleservice-xy”)在 Eureka 中注册自己,我想事情肯定会变得复杂。从 Eureka 检索可用服务器列表时,您必须扩展发现客户端以忽略版本部分(“-xy”,同时仍然能够处理“foo-service”),然后执行一些选择过程来选择反正是对的。所以我想事情会变得更加复杂。

这一切都基于最佳猜测,我实际上并没有实现这一点。我意识到这个问题已经快 4 个月了。因此,如果您在此期间找到了其他解决方案,那么如果您可以在自己的问题的答案中分享它,那就太好了。

于 2015-11-26T08:17:07.217 回答