.NET构建云原生微服务的框架Steeltoe

  • Post author:
  • Post category:其他



Steeltoe 是一个用于构建云原生微服务的框架,它可以让开发者使用 .NET Core 或 .NET Framework 来开发和部署微服务,并提供一系列通用的功能,如配置管理、服务发现、断路器、负载均衡、安全等。Steeltoe 是兼容 Spring Cloud 的框架,可以让开发者轻松地迁移或集成 Java 和 .NET 的微服务。


以下是 Steeltoe 的两个使用方法的介绍,并附上相关的代码:


  • 使用 Steeltoe 实现服务注册与发现:服务注册与发现是微服务架构中的一个重要组件,它可以帮助微服务之间动态地建立连接,而不需要硬编码服务的地址。Steeltoe 支持多种服务注册与发现的工具,如 Consul、Eureka、Zookeeper 等。为了使用 Steeltoe 实现服务注册与发现,需要在项目中添加 Steeltoe.Discovery.ClientCore 这个 NuGet 包,并在 appsettings.json 中配置相关的参数,如 spring.application.name、consul.host、consul.port 等。然后,在 Startup.cs 中调用 services.AddDiscoveryClient(Configuration) 来启用服务注册与发现的功能。最后,在需要调用其他服务的地方,可以使用 DiscoveryHttpClientHandler 或 DiscoveryHttpMessageHandler 来创建 HttpClient,并通过服务名来访问其他服务,而不需要知道具体的地址。代码如下:

// appsettings.json
{
  ...
  "spring": {
    "application": {
      "name": "Consul-Register-Example"
    }
  },
  "consul": {
    "host": "192.168.56.104",
    "port": 8500,
    "discovery": {
      "enabled": true,
      "register": true,
      "port": "8080",
      "ipAddress": "192.168.56.1",
      "preferIpAddress": true
    }
  }
  ...
}

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddDiscoveryClient(Configuration);
  ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  ...
  app.UseDiscoveryClient();
  ...
}

// WeatherForecastController.cs
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
  ...
  DiscoveryHttpClientHandler _handler;

  public WeatherForecastController(ILogger<WeatherForecastController> logger, IDiscoveryClient client)
  {
    _logger = logger;
    _handler = new DiscoveryHttpClientHandler(client);
  }

  [HttpGet]
  public async Task<string> Get()
  {
    var client = new HttpClient(_handler, false);
    return await client.GetStringAsync("http://Consul-Register-Example/api/values");
  }
}

  • 使用 Steeltoe 实现分布式追踪:分布式追踪是微服务架构中的一个重要组件,它可以帮助开发者和运维人员跟踪和分析微服务之间调用链路的性能和问题,提高系统的可观察性和可维护性。Steeltoe 支持多种分布式追踪的工具,如 Zipkin、Jaeger 等。为了使用 Steeltoe 实现分布式追踪,我们需要在项目中添加 Steeltoe.Management.TracingCore 这个 NuGet 包,并在 appsettings.json 中配置相关的参数,如 management.tracing.exporter.type、management.tracing.exporter.zipkin.uri 等。然后,在 Startup.cs 中调用 services.AddDistributedTracing(Configuration) 和 app.UseTracingExporter() 来启用分布式追踪的功能。最后,在需要追踪的地方,我们可以使用 Tracer 这个类来创建和结束 Span,并添加一些自定义的标签


分布式追踪的代码如下:

// appsettings.json
{
  ...
  "management": {
    "tracing": {
      "exporter": {
        "type": "zipkin",
        "zipkin": {
          "uri": "http://localhost:9411/api/v2/spans"
        }
      }
    }
  }
  ...
}

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddDistributedTracing(Configuration);
  ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  ...
  app.UseTracingExporter();
  ...
}

// WeatherForecastController.cs
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
  ...
  Tracer _tracer;

  public WeatherForecastController(ILogger<WeatherForecastController> logger, Tracer tracer)
  {
    _logger = logger;
    _tracer = tracer;
  }

  [HttpGet]
  public IEnumerable<WeatherForecast> Get()
  {
    var span = _tracer.StartSpan("GetWeatherForecast");
    span.SetTag("custom-tag", "custom-value");
    span.LogEvent("custom-event");
    try
    {
      var rng = new Random();
      return Enumerable.Range(1, 5).Select(index => new WeatherForecast
      {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = rng.Next(-20, 55),
        Summary = Summaries[rng.Next(Summaries.Length)]
      })
      .ToArray();
    }
    catch (Exception ex)
    {
      span.SetTag("error", true);
      span.LogEvent(ex.Message);
      throw;
    }
    finally
    {
      span.Finish();
    }
  }
}

  • 配置管理:配置管理是微服务架构中的一个重要组件,它可以帮助微服务在不重启的情况下动态地更新配置,同时保持配置的一致性和安全性。Steeltoe 支持多种配置管理的工具,如 Spring Cloud Config、HashiCorp Vault 等。为了使用 Steeltoe 实现配置管理,我们需要在项目中添加 Steeltoe.Extensions.Configuration.ConfigServerCore 或 Steeltoe.Extensions.Configuration.VaultCore 这个 NuGet 包,并在 appsettings.json 中配置相关的参数,如 spring.cloud.config.uri、spring.cloud.config.username、spring.cloud.config.password 等。然后,在 Startup.cs 中调用 ConfigurationBuilder.AddConfigServer() 或 ConfigurationBuilder.AddVault() 来启用配置管理的功能。最后,在需要获取配置的地方,我们可以使用 IConfiguration 这个接口来读取配置值。

  • 断路器:断路器是微服务架构中的一个重要组件,它可以帮助微服务在遇到故障或延迟时快速失败,防止故障扩散和雪崩效应。Steeltoe 支持多种断路器的工具,如 Hystrix、Polly 等。为了使用 Steeltoe 实现断路器,我们需要在项目中添加 Steeltoe.CircuitBreaker.HystrixCore 或 Steeltoe.CircuitBreaker.PollyCore 这个 NuGet 包,并在 Startup.cs 中调用 services.AddHystrixCommand<TCommand, TService>() 或 services.AddPollyHttpClient<TClient, TImplementation>() 来启用断路器的功能。最后,在需要使用断路器的地方,我们可以使用 HystrixCommand<T> 或 IHttpClientFactory 这个类来执行命令,并处理故障或降级逻辑。

  • 负载均衡:负载均衡是微服务架构中的一个重要组件,它可以帮助微服务在多个实例之间分配请求,提高系统的可用性和性能。Steeltoe 支持多种负载均衡的工具,如 Ribbon、DiscoveryClient 等。为了使用 Steeltoe 实现负载均衡,我们需要在项目中添加 Steeltoe.Common.Http.LoadBalancer 这个 NuGet 包,并在 Startup.cs 中调用 services.AddLoadBalancerClient() 来启用负载均衡的功能。最后,在需要使用负载均衡的地方,我们可以使用 LoadBalancerHttpClientHandler 或 LoadBalancerHttpMessageHandler 来创建 HttpClient,并通过服务名来访问其他服务。


Steeltoe 的优点:

  • Steeltoe 提供了一系列通用的功能,如配置管理、服务发现、断路器、负载均衡、安全等,可以帮助开发者快速地构建和部署云原生微服务,提高系统的可用性、性能和安全性。

  • Steeltoe 是兼容 Spring Cloud 的框架,可以让开发者轻松地迁移或集成 Java 和 .NET 的微服务,实现跨平台和跨语言的互操作性。

  • Steeltoe 支持多种云平台和云服务,如 Azure、Cloud Foundry、Kubernetes、Consul、Eureka、Zipkin、RabbitMQ 等,可以让开发者根据自己的需求和场景选择合适的技术栈。

  • Steeltoe 是一个开源的项目,有着活跃的社区和完善的文档,可以让开发者方便地获取支持和反馈。


Steeltoe 的缺点:

  • Steeltoe 暂时不支持一些常用的功能,如网关、事件总线、链路追踪等,需要开发者自己寻找或集成其他的工具或框架。

  • Steeltoe 的版本更新可能比较频繁,需要开发者及时关注和适配新的特性和变化,避免出现兼容性或稳定性的问题。



版权声明:本文为polsnet原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。