我有一个具有多个服务的应用程序,这些服务从主应用程序服务中调用。我了解执行金丝雀和A / B部署的基本知识,但是我看到的所有示例都显示了一个循环机制,其中每个请求在版本之间进行切换。
我希望的是,一旦给定的用户/会话与某个版本相关联,它将保持这种方式以避免给用户带来混乱的体验。
如何通过Kubernetes或Istio / Envoy实现?
我们一直在努力解决这个问题,因为我们希望将测试微服务部署到生产中,并且仅在第一个请求包含“暗发布”标头时才公开它们。
如乔纳斯(Jonas)所述,从理论上讲,Cookie和标头值可用于实现所需的内容。如果您正在启用的服务处于边缘状态,而您的用户正在直接访问,则非常容易实现。
问题是,您提到您有多种服务。如果您有一条链,其中用户访问边缘服务A,然后再对服务B,服务C等进行调用,则标头或cookie不会从一个服务传播到另一服务。
这是我们尝试进行分布式跟踪时遇到的相同问题。 Istio文档当前具有此常见问题解答:
https://istio.io/faq/distributed-tracing/#istio-copy-headers
总而言之,您将必须手动进行标头传播。幸运的是,我的大多数微服务都是基于Spring Boot构建的,我可以通过一个简单的5行类来实现头传播,该类可以拦截所有传出的调用。但这仍然是侵入性的,必须在任何地方进行。服务网格的对立面。
可能有一种巧妙的解决方法,但是很难从文档中推断出什么是可能的,什么不是。我已经看到Istio开发人员提出的一些github问题来解决此问题,但是我看到的每个问题在最初的热情之后都变得过时了。
您可以使用Request Routing - Route based on user identity在Istio上执行此操作,但我不知道该功能的成熟程度。也可以根据Cookie或标头值进行路由。