C#微服务的Service Mesh:如何在.NET的“动物园”中生存

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

您的.NET微服务失控了?来认识一下——Service Mesh

\n\n

想象一下:您有五个、十个,甚至五十个C#微服务。它们通过HTTP、gRPC或RabbitMQ相互通信。一切运行正常……直到问题开始出现。超时、重试、断路器、负载均衡、服务间认证——每个开发人员都要从头编写相同的代码。熟悉吗?

\n\n

这被称为“微服务动物园问题”——当业务逻辑淹没在基础设施代码中时。这时,Service Mesh登场了——这是一种架构模式,它将所有网络相关的复杂性从您的C#代码中剥离出来。在本文中,我们将探讨如何在.NET世界中驾驭Service Mesh,编写实际代码,并了解它是否值得。

\n\n

用通俗的语言解释Service Mesh(面向C#开发者)

\n\n

Service Mesh是一个专门的基础设施层,用于管理服务间的通信。想象一下,您的每个C#微服务都获得了一个“隐形助手”——sidecar代理(通常是Envoy或Linkerd-proxy)。这个代理会拦截服务的所有入站和出站流量,并为您完成所有繁琐的工作:

\n\n
    \n
  • 服务发现——不再需要硬编码的URL。
  • \n
  • 负载均衡——智能的请求分发。
  • \n
  • 重试和超时——失败时自动重试。
  • \n
  • 断路器——防止级联故障。
  • \n
  • mTLS加密——开箱即用的安全性。
  • \n
  • 可观测性——指标、追踪、日志。
  • \n
\n\n

对于C#的主要优势:您的代码保持干净。您只编写业务逻辑,所有网络魔法都由Service Mesh处理。最流行的实现是:Istio(重量级但功能强大)和Linkerd(轻量、快速、用Rust编写)。

\n\n

编写一个准备好使用Service Mesh的C#微服务

\n\n

为了理解其中的魔法,让我们创建一个简单的基于C#的.NET微服务,并准备让它与Service Mesh协同工作。我们将使用gRPC——微服务内部通信的理想协议。

\n\n

步骤1:创建一个C# gRPC服务

\n\n

打开终端并执行:

\n\n
dotnet new grpc -n OrderService\ncd OrderService
\n\n

添加一个简单的proto文件 Protos/orders.proto:

\n\n
syntax = "proto3";\n\nservice OrderGrpc {\n  rpc GetOrder (OrderRequest) returns (OrderResponse);\n}\n\nmessage OrderRequest {\n  string order_id = 1;\n}\n\nmessage OrderResponse {\n  string order_id = 1;\n  string status = 2;\n  double total = 3;\n}
\n\n

在 Services/OrderService.cs 中实现服务:

\n\n
public class OrderService : OrderGrpc.OrderGrpcBase\n{\n    private readonly ILogger<OrderService> _logger;\n\n    public OrderService(ILogger<OrderService> logger)\n    {\n        _logger = logger;\n    }\n\n    public override Task<OrderResponse> GetOrder(OrderRequest request, ServerCallContext context)\n    {\n        _logger.LogInformation("请求订单 {OrderId}", request.OrderId);\n        // 这里可以是您的业务逻辑\n        return Task.FromResult(new OrderResponse\n        {\n            OrderId = request.OrderId,\n            Status = "已确认",\n            Total = 99.99\n        });\n    }\n}
\n\n

启动服务:

\n\n
dotnet run
\n\n

服务在端口5001上运行(gRPC的默认端口)。现在想象一下,您有20个这样的服务。如何管理它们之间的通信?这时Service Mesh就派上用场了。

\n\n

为C#微服务配置Istio:分步指南

\n\n

假设您的Kubernetes集群已经配置好。安装Istio:

\n\n
istioctl install --set profile=demo -y
\n\n

现在,启用自动注入

博客

书籍推荐