我正在开发一个基于微服务的新项目。它是一个内部应用程序,只有大约10个微服务。我们将使用网关API进行身份验证,并可能使用一些微服务聚合。 (可能是Netflix zuul和Spring Boot)
我不清楚的是我们如何进行A / B测试和Canary测试的路由。假设我有100个客户端,我们希望A / B测试新版本的微服务。客户端应用程序不需要更改,它只是微服务提供的功能的内部更改。
我知道我们会站起来一个新的微服务,比如说(v2)。我感到困惑的是如何将客户端1-10指向新版本。我们需要能够集中配置,而不是在客户端上进行任何更改。
我们知道他们的mac地址(以及其他识别属性),并且可以插入我们想要识别其消息的任何类型的标头。
那么我如何将这些指向用于A / B测试或Canary部署的API的v2?
答案 0 :(得分:1)
如果描述高级通用方法,您可以执行以下操作:
答案 1 :(得分:0)
详细阐述@Set的回答。您需要在网关API中引入一些检测代码,以决定要调用的下游端点。如果且仅当您的分布式后端的唯一组件是与网关API相关时,上述解决方案就过度设计:您可以只使用一个库。但很可能您很快就会发现一个或多个其他服务需要了解实验,在这种情况下您需要一个独立的服务。
一般来说,构建强大的实验框架是一项艰巨的任务。您将很快遇到意外问题,例如:体验稳定性(如何保证返回访问者的相同体验)或如何更改分配比例(或者可能完全关闭新代码)而无需重新启动主机应用程序。您应该研究那里的开源框架,甚至商业服务器端仪器。 (我们在Variant有一个。)
答案 2 :(得分:0)
我在Github上发布了一个原型,展示了如何使用Zuul Gateway
实现路由。此原型只显示如何基于cookie将流量路由到同一应用程序的不同实例。您可以根据任何其他条件进行路由。
您还应该查看Spring Cloud Gateway
作为Zuul
的替代方案。似乎很有希望。
https://github.com/adiesner/spring-boot-sample-ci-gateway
更简单的设置是在服务前添加nginx并使用split_clients方法。
http {
# ...
# application version 1a
upstream version_1a {
server 10.0.0.100:3001;
server 10.0.0.101:3001;
}
# application version 1b
upstream version_1b {
server 10.0.0.104:6002;
server 10.0.0.105:6002;
}
split_clients "${arg_token}" $appversion {
95% version_1a;
* version_1b;
}
server {
# ...
listen 80;
location / {
proxy_set_header Host $host;
proxy_pass http://$appversion;
}
}
}
https://www.nginx.com/blog/performing-a-b-testing-nginx-plus/