提供零基础网站建设教学培训,湖北省住房城乡建设厅网站,个人域名怎么备案,怎么选择郑州网站建设背景 在很多时候#xff0c;产品同学或其他 boss 会有一些想法#xff0c;或好或坏#xff0c;都会想放到线上环境去验证#xff0c;看看能不能带来更好的效果。这其实就是一个提出假设和验证假设的过程#xff0c;而 AB 测试#xff0c;是验证假设的好方法。对于服务之间… 背景 在很多时候产品同学或其他 boss 会有一些想法或好或坏都会想放到线上环境去验证看看能不能带来更好的效果。这其实就是一个提出假设和验证假设的过程而 AB 测试是验证假设的好方法。对于服务之间的调用这一块其实也是相当符合的。举几个例子吧A - BB 进行了重构A - BB 进行了算法模型的调整A - BB 加入了新特性...对于这几个例子正常的逻辑都是会让小部分用户或流量流进新的 B观察一段时间的数据是否达到预期再决策 B 是否真的可以上线。在引入注册中心 Nacos 之后我们对服务之间调用这一块可以怎么做到呢答案就是 metadata元数据每个应用的实例基本信息比较少但是 metadata 是可以很丰富的。我们在向 Nacos Server 进行服务注册的时候往往会附加一些 metadata 可以参考官方文档中 Dubbo 融合 Nacos 成为注册中心 章节。对于上述的被调用方新版 B 而已完全可以把相关内容放进 metadata 中好比说版本号特性名等等。调用方 A 就可以根据当前的用户来判断是否要走那个版本的被调用方 B。当然这一步很多公司都会有相应的系统去管理好比体验用户。也可以看看下面这个流程图基本涉及到了。接下来就根据上面的这个做一个简单的例子。示例 首先是准备两个被调用方 B。带特性的var builder WebApplication.CreateBuilder(args);builder.Services.AddNacosAspNet(builder.Configuration);var app builder.Build();app.MapGet(/, ()
{return Results.Ok(OK - feature);
});app.Run(http://*:9885);{nacos: {ServerAddresses: [ http://localhost:8848 ],DefaultTimeOut: 15000,Namespace: cs,ListenInterval: 1000,ServiceName: providerb,PreferredNetworks: 192.168,GroupName: DEFAULT_GROUP,ClusterName: DEFAULT,Weight: 100,Metadata: {version: 1.0,feature: true}}
}正常的var builder WebApplication.CreateBuilder(args);// Add services to the container.
builder.Services.AddNacosAspNet(builder.Configuration);var app builder.Build();app.MapGet(/, ()
{return Results.Ok(OK - normal);
});app.Run(http://*:9886);{nacos: {ServerAddresses: [ http://localhost:8848 ],DefaultTimeOut: 15000,Namespace: cs,ListenInterval: 1000,ServiceName: providerb,PreferredNetworks: 192.168,GroupName: DEFAULT_GROUP,ClusterName: DEFAULT,Weight: 100,Metadata: {version: 1.0,feature: false}}
}启动这两个被调用方然后可以看到 Nacos 的服务详情页大致如下后面就是比较关键的调用方了。var builder WebApplication.CreateBuilder(args);// Add services to the container.
builder.Services.AddNacosV2Naming(x
{x.ServerAddresses new Liststring { http://localhost:8848/ };x.Namespace cs;
});var app builder.Build();app.MapGet(/req/{id}, Call);app.Run(http://*:9884);async TaskIResult Call(ILoggerFactory loggerFactory, INacosNamingService svc, IHttpClientFactory factory, int id)
{var logger loggerFactory.CreateLogger(nameof(Call));var allIns await svc.GetAllInstances(providerb, DEFAULT_GROUP, new Liststring { DEFAULT });// 按照对应的逻辑做对应的地址获取方式// 这里是id 小于 100 的走新特性string address GetAddress(allIns, id 100);var client factory.CreateClient();var res await client.GetStringAsync(address);logger.LogInformation(user{id},url{url},result{res}, id, address, res);return Results.Ok($caller ------ {res});
}string GetAddress(ListInstance instances, bool isFeature)
{var str isFeature ? true : false;var ins instances.Where(x x.Healthy x.Enabled x.Metadata.TryGetValue(feature, out var feature) feature.Equals(str)).OrderBy(xGuid.NewGuid()).FirstOrDefault();return ins ! null ? $http://{ins.Ip}:{ins.Port} : throw new Exception(Can not find out ins);
}启动调用方程序访问并指定小于100和大于100的两个用户可以看到调用的虽然是同一个服务但是一个是访问的 feature另一个访问的是 normal。到这里我们已经可以做到根据不同的逻辑将用户导向到相同服务的不同版本上面了。写在最后 充分利用好服务实例的 metadata 可以衍生出许多有意思的实践。另外《Nacos 架构与原理》 的电子书过段时间会放出大家感兴趣的可以关注一下。nacos-sdk-csharp 的地址 https://github.com/nacos-group/nacos-sdk-csharp本文示例代码的地址 https://github.com/catcherwong-archive/2021/tree/main/ABTestWithNacos