(五)MMA(OpenTelemetry/Rabbit MQ/ApiGateway/MongoDB)


文章目錄

  • 項目地址
  • 一、OpenTelemetry
    • 1.1 配置OpenTelemetry
      • 1. 服務添加
      • 2. 添加服務標識
      • 3. 添加請求的標識
      • 4. 添加中間價
  • 二、Rabbit MQ
    • 2.1 配置Rabbit MQ
      • 1. docker-compose
      • 2. 添加Rabbit MQ的Connect String
    • 2.2 替換成Rabbit MQ
      • 1. 安裝所需要的包
      • 2. 使用
  • 三、API Gateways
    • 3.1 創建Gateway
      • 1. 配置docker-compose
      • 2. 添加各種服務
      • 3. 添加jwt配置
      • 4. 添加日志追蹤
      • 5. 配置appsettings
      • 6. Yarp反向代理設置
  • 四、微服務拆分
    • 4.1 創建新的Ticketing api
      • 1. 創建.net webapi 項目
      • 2. 安裝包和引用
      • 3. 將公共api復制到該模塊
      • 4. appsettings


項目地址

  • 教程作者:
  • 教程地址:
  • 代碼倉庫地址:
  • 所用到的框架和插件:
dbt 
airflow

一、OpenTelemetry

1.1 配置OpenTelemetry

1. 服務添加

  1. namespace Evently.Common.Infrastructure; 配置
        services.AddOpenTelemetry().ConfigureResource(resource => resource.AddService(serviceName)).WithTracing(tracing =>{tracing.AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddEntityFrameworkCoreInstrumentation().AddRedisInstrumentation().AddNpgsql().AddSource(MassTransit.Logging.DiagnosticHeaders.DefaultListenerName);tracing.AddOtlpExporter();});

2. 添加服務標識

在這里插入圖片描述

  1. 創建服務標識
namespace Evently.Api.OpenTelemetry;public static class DiagnosticsConfig
{public const string ServiceName = "Evently.Api";
}
  1. program里注冊
    在這里插入圖片描述

3. 添加請求的標識

  • 在RequestLoggingPipelineBehavior添加的請求和服務的標識

在這里插入圖片描述

4. 添加中間價

在這里插入圖片描述

  • LogContextTraceLoggingMiddleware
namespace Evently.Api.Middleware;
internal sealed class LogContextTraceLoggingMiddleware(RequestDelegate next)
{public Task Invoke(HttpContext context){string traceId = Activity.Current?.TraceId.ToString();using (LogContext.PushProperty("TraceId", traceId)){return next.Invoke(context);}}
}
  • MiddlewareExtensions 用于將自定義日志追蹤中間件 LogContextTraceLoggingMiddleware 添加到 ASP.NET Core 的中間件管道中。
namespace Evently.Api.Middleware;
internal static class MiddlewareExtensions
{internal static IApplicationBuilder UseLogContextTraceLogging(this IApplicationBuilder app){app.UseMiddleware<LogContextTraceLoggingMiddleware>();return app;}
}
  • 中間件添加
    在這里插入圖片描述

二、Rabbit MQ

2.1 配置Rabbit MQ

1. docker-compose

  • docker-compose.yml
evently.queue:image: rabbitmq:management-alpinecontainer_name: Evently.Queuehostname: evently-queuevolumes:- ./.containers/queue/data/:/var/lib/rabbitmq- ./.containers/queue/log/:/var/log/rabbitmqenvironment:RABBITMQ_DEFAULT_USER: guestRABBITMQ_DEFAULT_PASS: guestports:- 5672:5672- 15672:15672

2. 添加Rabbit MQ的Connect String

  "ConnectionStrings": {"Database": "Host=evently.database;Port=5432;Database=evently;Username=postgres;Password=postgres;Include Error Detail=true","Cache": "evently.redis:6379","Queue": "amqp://evently-queue:5672"},

2.2 替換成Rabbit MQ

1. 安裝所需要的包

  • 替換之前內存為Rabbit MQ
  • 安裝所需要的包
    <PackageReference Include="AspNetCore.HealthChecks.Rabbitmq" Version="8.0.1" /><PackageReference Include="MassTransit.RabbitMQ" Version="8.2.1" />
  1. 創建MQ配置文件
namespace Evently.Common.Infrastructure.EventBus;
public sealed record RabbitMqSettings(string Host, string Username = "guest", string Password = "guest");

2. 使用

  1. 修改MassTransit,將內存改為MQ
    在這里插入圖片描述
  2. 注冊Ticketing的消費者
    在這里插入圖片描述
  3. 注冊Event的消費者
    在這里插入圖片描述
  4. Program里注冊
    在這里插入圖片描述

三、API Gateways

在這里插入圖片描述

3.1 創建Gateway

在這里插入圖片描述

1. 配置docker-compose

在這里插入圖片描述

2. 添加各種服務

  • 在Gateway的program.cs里添加服務
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog((context, loggerConfig) => loggerConfig.ReadFrom.Configuration(context.Configuration));
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));builder.Services.AddOpenTelemetry().ConfigureResource(resource => resource.AddService(DiagnosticsConfig.ServiceName)).WithTracing(tracing =>{tracing.AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddSource("Yarp.ReverseProxy");tracing.AddOtlpExporter();});builder.Services.AddAuthorization();
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.ConfigureOptions<JwtBearerConfigureOptions>();
WebApplication app = builder.Build();
app.UseLogContextTraceLogging();
app.UseSerilogRequestLogging();
app.UseAuthentication();
app.UseAuthorization();
app.MapReverseProxy();
app.Run();

3. 添加jwt配置

namespace Evently.Gateway.Authentication;
internal sealed class JwtBearerConfigureOptions(IConfiguration configuration): IConfigureNamedOptions<JwtBearerOptions>
{private const string ConfigurationSectionName = "Authentication";public void Configure(JwtBearerOptions options){configuration.GetSection(ConfigurationSectionName).Bind(options);}public void Configure(string? name, JwtBearerOptions options){Configure(options);}
}

4. 添加日志追蹤

  1. 添加日志追蹤
using System.Diagnostics;
using Serilog.Context;
namespace Evently.Gateway.Middleware;
internal sealed class LogContextTraceLoggingMiddleware(RequestDelegate next)
{public Task Invoke(HttpContext context){string traceId = Activity.Current?.TraceId.ToString();using (LogContext.PushProperty("TraceId", traceId)){return next.Invoke(context);}}
}
  1. 注冊
namespace Evently.Gateway.Middleware;
internal static class MiddlewareExtensions
{internal static IApplicationBuilder UseLogContextTraceLogging(this IApplicationBuilder app){app.UseMiddleware<LogContextTraceLoggingMiddleware>();return app;}
}

5. 配置appsettings

  • 基礎設置
{"Authentication": {"Audience": "account","TokenValidationParameters": {"ValidIssuers": [ "http://evently.identity:8080/realms/evently", "http://localhost:18080/realms/evently" ]},"MetadataAddress": "http://evently.identity:8080/realms/evently/.well-known/openid-configuration","RequireHttpsMetadata": false},"Serilog": {"Using": ["Serilog.Sinks.Console","Serilog.Sinks.Seq"],"MinimumLevel": {"Default": "Information","Override": {"Microsoft": "Information"}},"WriteTo": [{ "Name": "Console" },{"Name": "Seq","Args": { "serverUrl": "http://evently.seq:5341" }}],"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],"Properties": {"Application": "Evently.Gateway"}},"OTEL_EXPORTER_OTLP_ENDPOINT": "http://evently.jaeger:4317",
}

6. Yarp反向代理設置

在這里插入圖片描述

四、微服務拆分

我現在有個單體架構的票務系統,但是當業務高峰期的時候,突然訂票劇增,我想單獨把票務拆出來做微服務可以嗎,其次由于我想控制成本,平時只想一個實例運行這個微服務,當業務高峰期,需要自動擴充到4個

4.1 創建新的Ticketing api

1. 創建.net webapi 項目

在這里插入圖片描述

2. 安裝包和引用

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><UserSecretsId>ab603965-9d79-46f7-b0fd-56e950ec7073</UserSecretsId><DockerDefaultTargetOS>Linux</DockerDefaultTargetOS><DockerfileContext>..\..\..</DockerfileContext><DockerComposeProjectPath>..\..\..\docker-compose.dcproj</DockerComposeProjectPath></PropertyGroup><ItemGroup><PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="8.0.1" /><PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.4" /><PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.4"><PrivateAssets>all</PrivateAssets><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference><PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" /><PackageReference Include="Serilog.AspNetCore" Version="8.0.1" /><PackageReference Include="Serilog.Sinks.Seq" Version="7.0.0" /><PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /></ItemGroup><ItemGroup><ProjectReference Include="..\..\Modules\Ticketing\Evently.Modules.Ticketing.Infrastructure\Evently.Modules.Ticketing.Infrastructure.csproj" /></ItemGroup>
</Project>

3. 將公共api復制到該模塊

在這里插入圖片描述

4. appsettings

  1. appsettings.json
{"ConnectionStrings": {"Database": "","Cache": "","Queue": ""},"AllowedHosts": "*","Authentication": {"Audience": "","TokenValidationParameters": {"ValidIssuers": []},"MetadataAddress": "","RequireHttpsMetadata": false},"KeyCloak": {"HealthUrl": ""},"Serilog": {"Using": ["Serilog.Sinks.Console"],"MinimumLevel": {"Default": "Information","Override": {"Microsoft": "Information"}},"WriteTo": [{ "Name": "Console" }],"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],"Properties": {"Application": "Evently.Ticketing.Api"}},"OTEL_EXPORTER_OTLP_ENDPOINT": ""
}
  1. appsettings.Development.json
{"ConnectionStrings": {"Database": "Host=evently.database;Port=5432;Database=evently;Username=postgres;Password=postgres;Include Error Detail=true","Cache": "evently.redis:6379","Queue": "amqp://evently-queue:5672"},"Authentication": {"Audience": "account","TokenValidationParameters": {"ValidIssuers": [ "http://evently.identity:8080/realms/evently", "http://localhost:18080/realms/evently" ]},"MetadataAddress": "http://evently.identity:8080/realms/evently/.well-known/openid-configuration","RequireHttpsMetadata": false},"KeyCloak": {"HealthUrl": "http://evently.identity:8080/health/"},"Serilog": {"Using": ["Serilog.Sinks.Console","Serilog.Sinks.Seq"],"MinimumLevel": {"Default": "Information","Override": {"Microsoft": "Information","Evently.Modules.Ticketing.Infrastructure.Outbox": "Warning","Evently.Modules.Ticketing.Infrastructure.Inbox": "Warning"}},"WriteTo": [{ "Name": "Console" },{"Name": "Seq","Args": { "serverUrl": "http://evently.seq:5341" }}],"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],"Properties": {"Application": "Evently.Ticketing.Api"}},"OTEL_EXPORTER_OTLP_ENDPOINT": "http://evently.jaeger:4317"
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83042.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

格恩朗超聲波水表 助力農業精準灌溉與振興?

在農業現代化的征程中&#xff0c;水資源的精準利用至關重要&#xff0c;而這離不開高精度計量設備的支持。大連格恩朗品牌積極響應國家全面推進鄉村振興、加快農業農村現代化的號召&#xff0c;精心打造的超聲波水表&#xff0c;憑借其超高精度&#xff0c;成為綠色灌溉領域的…

微信小程序頁面嵌套web-view點擊系統導航返回時進行彈窗處理

實現效果&#xff1a;微信小程序頁面嵌套web-view點擊系統導航返回時進行彈窗處理 首先在web-view里是不可實現的&#xff08;據我了解下來&#xff09; 參考小程序文檔&#xff1a;page-container 大致邏輯&#xff1a; 1、page-container可實現頁面離開前攔截 2、由于web-vie…

設計模式25——中介者模式

寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用&#xff0c;主要是下面的UML圖可以起到大作用&#xff0c;在你學習過一遍以后可能會遺忘&#xff0c;忘記了不要緊&#xff0c;只要看一眼UML圖就能想起來了。同時也請大家多多指教。 中介者模式&#xff08;Mediat…

Java基礎 Day25

一、線程通信 1、簡介 確保線程能夠按照預定的順序執行并且能夠安全地訪問共享資源 使多條線程更好的進行協同工作 2、常用方法 void wait() 使當前線程進入等待狀態 void notify(); 隨機喚醒單個等待的線程&#xff08;可以空喚醒&#xff09; void notifyAll(); 喚醒…

WebSocket與實時對話式AI服務的集成

WebSocket與實時對話式AI服務的集成 在現代對話式AI系統中,傳統的HTTP請求-響應模型已難以滿足實時交互的體驗需求。特別是用戶對響應速度、逐字輸出、會話上下文保持等方面提出更高要求時,需要一種能夠建立持久連接并支持雙向通信的協議。WebSocket正是在這一背景下,成為A…

iOS 集成網易云信IM

云信官方文檔在這 看官方文檔的時候&#xff0c;版本選擇最新的V10。 1、CocoPods集成 pod NIMSDK_LITE 2、AppDelegate.m添加頭文件 #import <NIMSDK/NIMSDK.h> 3、初始化 NIMSDKOption *mrnn_option [NIMSDKOption optionWithAppKey:"6f6568e354026d2d658a…

人工智能100問?第37問:什么是擴散模型?

目錄 ??一、通俗解釋 二、專業解析?? 三、權威參考 擴散模型是一種??通過系統性地添加再去除噪聲來生成新數據(如圖像)的生成式AI技術??,其核心機制分為兩個階段:正向擴散??:對原始數據(如清晰圖片)逐步添加噪聲,直至完全變成隨機噪點(類似老照片逐漸模糊…

傳輸層核心技術解析

目錄 一、端口號機制 二、網絡診斷工具 1. netstat命令 2. pidof工具 三、UDP協議詳解 協議特征 典型應用場景 四、TCP協議深度解析 核心機制 狀態轉換模型 特殊狀態說明 五、協議對比分析 六、開發實踐要點 一、端口號機制 核心作用&#xff1a;標識主機唯一進程…

IO Vs NIO

一、IO(傳統阻塞式) 全稱?&#xff1a;Input/Output(輸入/輸出) 定義?&#xff1a;Java 1.0 引入的基礎 I/O 模型&#xff0c;基于流&#xff08;Stream&#xff09;的同步阻塞操作&#xff0c;線程在讀寫數據時會阻塞直到操作完成。 二、NIO(新式非阻塞式) ?全…

基于原生JavaScript前端和 Flask 后端的Todo 應用

Demo地址&#xff1a;https://gitcode.com/rmbnetlife/todo-app-js-flask.git Python Todo 應用 這是一個使用Python Flask框架開發的簡單待辦事項(Todo)應用&#xff0c;采用前后端分離架構。本項目實現了待辦事項的添加、刪除、狀態切換等基本功能&#xff0c;并提供了直觀…

005 ElasticSearch 許可證過期問題

ElasticSearch 許可證過期問題 項目啟動報錯 org.elasticsearch.client.ResponseException: method [GET], host [http://127.0.0.1:9200], URI [/_cluster/health/], status line [HTTP/1.1 403 Forbidden] {"error":{"root_cause":[{"type":…

哪些崗位最易被AI替代?

隨著AI技術高速演進&#xff0c;一場“職場大洗牌”正悄然上演。當ChatGPT出口成章、機器人能精準執勤&#xff0c;AI時代的“就業焦慮”已不再是空談。你是否認真思考過&#xff0c;自己所處的崗位是否也正面臨被AI邊緣化的風險&#xff1f; 以下幾類職業&#xff0c;已成為AI…

信號槽中 sender() 的作用

好的,sender() 是 Qt 框架中的一個重要函數,它用于獲取觸發當前槽函數的對象。在 Qt 的信號和槽機制中,一個信號可以連接到多個槽函數,而一個槽函數也可以被多個信號觸發。sender() 函數允許你在槽函數中確定是哪個對象觸發了當前信號。 信號和槽機制 在 Qt 中,信號和槽…

深度學習|pytorch基本運算

【1】引言 pytorch是深度學習常用的包&#xff0c;顧名思義&#xff0c;就是python適用的torch包&#xff0c;在python里面使用時直接import torch就可以調用。 需要注意的是&#xff0c;pytorch包與電腦配置、python版本有很大關系&#xff0c;一定要仔細閱讀安裝要求、找到…

DeepSeek 賦能數字人直播帶貨:技術革新重塑電商營銷新生態

目錄 一、引言二、DeepSeek 技術探秘2.1 DeepSeek 技術原理剖析2.2 DeepSeek 與其他大模型對比優勢 三、數字人直播帶貨現狀洞察3.1 數字人直播帶貨發展歷程回顧3.2 市場規模與增長趨勢分析3.3 現存問題與挑戰探討 四、DeepSeek 在數字人直播帶貨中的應用實例4.1 交個朋友的成功…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.11 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.11 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖。 dataframe<-data.frame( densityc(570,565,…

四、關系數據庫標準語言SQL_1

四、關系數據庫標準語言SQL_1 主要內容 4.1 SQL概述 SQL簡介 4.2 SOL的系統結構4.3 SQL數據定義 SQL的數據定義 4.5 SQL數據查詢4.6 SQL數據更新4.7 SQL中的視圖4.8 SQL的數據控制4.9 嵌入式SQL小結 4.1 SQL概述 主要內容 SQL簡介SQL的特點SQL的系統結構 SQL簡介 SQL&…

vscode的Embedded IDE創建keil項目找不到源函數或者無法跳轉

創建完Embedded IDE項目后跳轉索引很容易找不到源函數或者無法跳轉&#xff0c;原因是vscode工作區被eide覆蓋了&#xff0c;需要手動往當前目錄下的.vscode/c_cpp_properties.json里添加路徑 打開eide.json &#xff0c;找到folders&#xff0c; 里面的name是keil里工程的虛擬…

【Docker管理工具】部署Docker管理面板DweebUI

【Docker管理工具】部署Docker管理面板DweebUI 一、DweebUI介紹1.1 DweebUI 簡介1.2 主要特點1.3 使用場景 二、本次實踐規劃2.1 本地環境規劃2.2 本次實踐介紹 三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本 四、下載DweebUI鏡像五、…

CentOS7.9環境離線部署docker和docker-compose的兩種方式

目 錄 一、yum安裝&#xff0c;使用rpm安裝包和相關依賴 1.1 準備rpm安裝包 1.2 將docker-23.0.4.tar.gz上傳至/opt目錄下 二、二進制文件方式安裝 三、安裝docker-compose 一、yum安裝&#xff0c;使用rpm安裝包和相關依賴 1.1 準備rpm安裝包 1&#xff09;在一臺與…