(五)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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;在一台与…