如何将 c# dotnet core 3.1 微服务流绑定到涡轮服务器流

Posted

技术标签:

【中文标题】如何将 c# dotnet core 3.1 微服务流绑定到涡轮服务器流【英文标题】:How to bind c# dotnet core 3.1 microservice stream to turbine server stream 【发布时间】:2021-08-14 07:50:16 【问题描述】:

我有一个在 openshift 3 上运行的涡轮服务器,并使用 steeltoe 3.0.2 断路器库部署了一个 donet core 3.1 c# 微服务。我可以通过服务流 url (/hystrix/hystrix.stream) 监控 hystrix 仪表板上的微服务流。我要做的是将微服务 hystrix 事件流注册到涡轮服务器事件流中。有谁知道如何做到这一点?任何参考链接也会有很大帮助。

更新:项目参考和设置文件配置

myproject.csproj:

<ItemGroup>
  <PackageReference Include="Steeltoe.CircuitBreaker.Hystrix.MetricsEventsCore" Version="3.0.2" />
  <PackageReference Include="Steeltoe.CircuitBreaker.HystrixCore" Version="3.0.2" />
<ItemGroup>

startup.cs:ConfigureServices 部分

services.AddMvc(options => options.EnableEndpointRouting = false);
services.AddHystrixCommand<MyCircuitBreakerCommand>("MyCircuitBreakerGroup", Configuration);
services.AddHystrixMetricsStream(Configuration);

startup.cs -> 配置部分

app.UseHystrixRequestContext();
app.UseHystrixMetricsStream();
app.UseMvc();

我也没有修改 program.cs 或任何 .json 设置文件。

最近尝试访问这些微服务资源:/hystrix/config.stream、/hystrix/request.stream 和/hystrix/utilization.stream,但是得到这个内部服务器错误:

连接 ID“0HM90GL5F64RK”,请求 ID“0HM90GL5F64RK:00000003”:应用程序引发了未处理的异常。 System.InvalidOperationException:尝试激活“Steeltoe.CircuitBreaker.Hystrix.MetricsEvents.Controllers.HystrixConfigStreamController”时无法解析“Steeltoe.CircuitBreaker.Hystrix.Config.HystrixConfigurationStream”类型的服务。 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型类型,类型 requiredBy,布尔 isDefaultParameterRequired) 在 lambda_method(闭包,IServiceProvider,对象 []) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.c__DisplayClass4_0.b__0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.c__DisplayClass5_0.g__CreateController|0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(状态&下一个,范围&范围,对象&状态,布尔& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|24_0(ResourceInvoker 调用程序,任务 lastTask,下一个状态,作用域范围,对象状态,布尔 isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed 上下文) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(状态&下一个,范围&范围,对象&状态,布尔& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Logged|17_1(ResourceInvoker 调用程序) 在 Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) 在 Steeltoe.CircuitBreaker.Hystrix.HystrixRequestContextMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 应用程序) 失败:Microsoft.AspNetCore.Server.Kestrel[13]

【问题讨论】:

您能否更新此问题以包含 .csproj、program.cs 和 startup.cs 的相关 sn-ps,以便我们查看您正在使用哪些包以及如何使用?另外为了确保我理解这个问题,您是说您可以使用本地 hystrix 仪表板(使用 HTTP 流),但不能使用服务绑定(通过 RabbitMQ)? 您好@Tim,感谢您的评论!问题已更新。真的不知道我在容器日志中发现的内部服务器错误是否与我遇到的问题有关.. 【参考方案1】:

此错误消息告诉我们HystrixConfigurationStream 尚未注册到服务容器。可以在 startup.cs 中使用此代码添加:

services.AddHystrixConfigStream(Configuration);

但我认为更好的选择是将AddHystrixMetricsStream 复数化为AddHystrixMonitoringStreams,这也注册了a couple other things。

我个人并没有在这段代码上花费很多时间,所以我不知道到底发生了什么,但我已经 filed an issue 获取文档,如果有错误,我们应该能够跟进有一个修复。

【讨论】:

嗨@Tim,通过使用 AddHystrixConfigStream 解决了容器日志中显示的异常!我会将您的答案标记为解决方案,因为我需要将服务 hystrix 流绑定到涡轮服务器是使用您之前提到的 RabbitMQ 服务器,一开始并不知道,但给了我这个想法。我正在寻找它,但听起来它不会那么容易。当然,非常感谢您的大力帮助! 假设您正在获得一个 RabbitMQ 服务绑定,那么将您的包引用从 MetricsEventsCore 更改为 MetricsStreamCore 或许看看 this Steeltoe sample 并尝试一下出去。我不确定它之前是否在 openshift 上运行过,但我希望它“正常工作”

以上是关于如何将 c# dotnet core 3.1 微服务流绑定到涡轮服务器流的主要内容,如果未能解决你的问题,请参考以下文章

Dotnet Core 3.1:如何将 AddJsonFile 与文件的绝对路径一起使用?

抛出异常:'System.PlatformNotSupportedException'。如何在 dotnet core 3.1 中加密和解密安全字符串?

在 Visual Studio 16.6 中将仅内容包导入 DotNet Core 3.1 项目

dotNet Core 3.1 使用 Aspose (部署 Docker)

如何使用 dotnet cli 命令以 VB.NET 语言创建 ASP.NET Core 项目?

同时针对 ef core 3.1 和 5 是个好主意吗?