我正在使用Eureka和Zuul开始使用Spring Cloud,并且在构建蓝/绿和金丝雀部署方面有一些问题。到目前为止,我已经解决了基础问题,并使Eureka、Zuul和配置服务器按预期工作。我想要完成的是建立一个有两个版本的服务,比如1.0和1.1。对于特定用户的子集,我希望将他们路由到1.1版本,其他所有人都应该转到1.0版本。
Zuul过滤器API在文档上有点轻,我正在努力理解一些概念,所以我想在这里问几个问题。我还运行了一些基本的过滤器,除了获取主体的身份和它们请求的服务之外,它们目前不会做很多事情。在理解如何向Eureka和Zuul公开同一服务的两个不同版本时,我遇到了瓶颈。我很好奇的几件事:
- 在文档、帖子和其他堆栈溢出之间,术语"服务"one_answers"集群"似乎可以互换使用。这是正确的吗? 如果我有一个名为
- 或者,您是否向现有的服务ID添加另一个节点,并向每个节点添加额外的元数据,以便Zuul和区分1.0和1.1版本?
- 正确答案是"all of the above?":)
/simpleservice
的服务,我是否暴露了两个不同的serviceid(即simpleservice
和simpleservice-1.1
)?如果我这样做,当一个目标用户请求/simpleservice
时,我让Zuul将它们发送到/simpleservice-1.1
假设您也在使用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"one_answers"simpleservice-x.y")在Eureka中注册它们自己,我想事情一定会变得复杂。您必须扩展发现客户端以忽略版本部分("-x")。y",同时仍然能够处理"foo-service"),当从Eureka检索可用服务器列表时,然后执行一些选择过程以选择正确的服务器。所以我想事情会变得更加复杂。
这都是基于最好的猜测,我还没有实际实现这个。我意识到这个问题已经有4个月了。因此,如果您在此期间找到了其他解决方案,请在回答您自己的问题时与我们分享。