想象一下:到了节日季节,您的用户们兴奋不已,期待着各种折扣和优惠!但是您的Item API却无法提供这些功能。通常,您需要修改代码库,并冒着引入错误的风险来添加这些功能。但有没有一种方法可以在不修改核心应用的情况下无缝添加折扣呢?
介绍 Sidecar 模式!!使用这种模式,你可以独立且风险最小地部署新功能,比如节日折扣优惠。准备让你的用户惊叹了吗?让我们开始吧!
🌐 什么是所谓的 Sidecar 模式?📌了解更多详情,请访问:https://dotnet-fullstack-dev.blogspot.com/
🌟 喜欢的话,请给个赞哦! 🚀
简而言之,边车模式允许我们通过在主应用程序旁边的单独容器中运行它们来为应用程序添加辅助功能。可以将其视为你的 项目 API 的一个辅助服务。这个侧车服务可以处理新功能,比如计算节日折扣,而不干扰主应用程序。
这种方法的主要好处包括:
- 无需修改核心API即可独立开发:无需修改核心API。
- 在不重新部署整个应用的前提下更新或修复折扣特性:可以在不重新部署整个应用的前提下更新或修复折扣特性。
- 根据需求独立扩展边车服务:根据需求独立扩展边车服务。
让我们一步步来设置边车模式,并实现节日折扣的逻辑。
第一步:定义 Sidecar 服务(折扣 API)首先,我们将创建一个名为DiscountAPI的新微服务来处理节日折扣。由于它将与我们的Item API一起工作,因此它将监听折扣请求并返回应用折扣后的价格。
建立项目:
- 创建一个新的 ASP.NET Core Web API 项目,名为 DiscountAPI。
- 添加一个端点,用来接收商品 ID 并返回折扣。
定义折扣规则:
- 在我们的促销折扣规则里,我们将对所有商品提供一个 20%的节日折扣。您可以在以后扩展此逻辑来处理其他情况。
public class DiscountController : ControllerBase
{
[HttpGet("{itemId}")]
public IActionResult GetDiscountedPrice(int itemId)
{
// 模拟实现折扣计算
var discountRate = 0.20;
var itemPrice = GetItemPrice(itemId); // 模拟获取商品价格
var discountedPrice = itemPrice * (1 - discountRate);
return Ok(new { ItemId = itemId, DiscountedPrice = discountedPrice }); // 返回成功响应
}
private double GetItemPrice(int itemId)
{
// 实际价格占位符
return 100.0; // 演示用,商品价格设为100美元
}
}
此 API 将返回一个包含折扣价的 JSON 响应,我们的主应用可以在需要展示节日折扣时获取该 JSON 响应。
第二步:将 Sidecar 集成到主应用中现在我们已经有了独立运行的DiscountAPI,让我们修改我们的Item API,让它和这个边车服务通信。
设置 HTTP 客户端:
- 使用
HttpClient
调用来获取 DiscountAPI 的折扣信息。
增强商品API以包含促销信息:
- 在物品API中添加一个端点,该端点获取原始物品详情,然后调用折扣API来查询打折价格。
public class ItemController : 商品控制器
{
private readonly IHttpClientFactory _httpClientFactory;
public ItemController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet("{id}/festival-discount")]
public async Task<IActionResult> GetItemWithDiscount(int id)
{
var item = GetItemDetails(id); // 用于获取商品详情的模拟方法
var discountClient = _httpClientFactory.CreateClient();
var discountResponse = await discountClient.GetAsync($"http://localhost:5001/api/discount/{id}");
var discountData = await discountResponse.Content.ReadAsAsync<dynamic>();
return Ok(new
{
ItemId = item.Id,
OriginalPrice = item.Price,
DiscountedPrice = discountData?.DiscountedPrice
});
}
private Item GetItemDetails(int id)
{
// 用于模拟获取商品信息的数据检索
return new Item { Id = id, Price = 100.0, Name = "示例" };
}
}
public class Item : 商品
{
public int Id { get; set; }
public string Name { get; set; }
public double Price { get; set; }
}
这里发生了这样的事:
GetItemWithDiscount
接口获取商品的基本信息。- 然后向DiscountAPI边车请求打折后的价格。
- 最后,它将原价和打折后的价格合并到一个响应里。
使用 Docker 部署服务非常简单。接下来是操作方法:
将DiscountAPI容器化
- 如果 DiscountAPI 和 Item API 还没有被容器化,就在它们各自添加一个
Dockerfile
。
# Dockerfile for DiscountAPI
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "DiscountAPI.dll"]
使用Docker Compose运行两个容器:
- 使用 Docker Compose 启动 Item API 和 DiscountAPI 作为单独容器。
version: '3.4'
服务:
item-api:
镜像: item-api
构建:
上下文: .
Dockerfile: ItemAPI/Dockerfile
端口:
- "5000:80"
discount-api:
镜像: discount-api
构建:
上下文: .
Dockerfile: DiscountAPI/Dockerfile
端口:
- "5001:80"
运行:在终端中输入 docker-compose up
,以启动这两个服务。
砰! 现在你有了一个与 Item API 并行的节日折扣功能,主代码库完全未受影响。侧车模式让你的单体应用变得像微服务一样灵活且强大。
🎉 哇!因素:为什么 Sidecar 模式(Sidecar 架构)真的很酷你不仅添加了节日折扣,而且没有改动主要代码库,还为未来的扩展打下了基础。想象一下可以添加其他功能模块,例如:
- 会员专享折扣:推出会员专属价格。
- 库存管理:再设置一个功能来监控库存情况。
侧车模式让你能够灵活、响应迅速且富有创新——同时确保核心应用的稳定性。现在,你的单体应用已经准备好参加狂欢派对了,只需添加一点点微服务的魔力!
🎬 最后一点:保持核心稳定并利用侧边增强侧车模式是无需干扰您的单体应用即可添加新功能的游戏规则改变者。在不断构建如 DiscountAPI 这样的功能时,请记住,这种模式不仅节省时间,它还能帮助您的应用在未来扩展中更加灵活。因此,下次在应对节日季的高峰期或新的功能请求时,您的 Item API 能够轻松应对挑战,无需担忧。
共同学习,写下你的评论
评论加载中...
作者其他优质文章