- 博客(111)
- 收藏
- 关注
原创 .NET 微服务 Ocelot 网关实现方案
Ocelot是.NET生态中常用的API网关,能够实现路由转发、负载均衡、限流和安全管控等核心功能。通过以上配置,Ocelot网关可以为.NET微服务架构提供统一的入口,简化客户端调用,并增强系统的安全性和可扩展性。
2025-09-01 09:23:11
288
原创 .NET 微服务日志系统:Serilog + Loki + Grafana 实践指南
点击左侧菜单;点击,选择 Loki 数据源;配置图表类型:日志列表:展示原始日志,适合实时查看;柱状图:统计不同日志级别的数量(如 Error/Warning/Info 的占比);表格:按字段(如 OrderId、UserId)汇总日志,便于排查特定业务问题;保存仪表盘,命名为“Order-Service 日志监控”,后续可直接访问。
2025-09-01 09:05:24
1093
1
原创 .net 微服务jeager链路跟踪
Route[HttpGet// 创建自定义跨度 using var customSpan = _tracer . StartActiveSpan("CustomWeatherProcessing");try {// 添加自定义标签 customSpan . SetAttribute("location" , "Beijing");
2025-09-01 08:55:42
492
原创 不要在构造函数中进行数据库查询,io操作
保证对象创建的安全性:避免因外部操作失败导致对象处于无效状态。提升代码可维护性:分离初始化与业务逻辑,降低耦合度。增强可测试性:便于隔离外部依赖,编写稳定的单元测试。实际开发中,应优先通过“依赖注入+显式初始化方法”或“工厂模式”实现资源操作与对象构造的分离,让代码更健壮、更易扩展。
2025-08-29 08:35:57
481
原创 处理异常时,finally关键字有什么作用?
finally的核心价值是保证“清理逻辑的必然性”,尤其适用于需要手动管理的资源(文件、数据库连接等)。在实际开发中,结合using语句(自动资源管理)和finally块(手动特殊清理),可有效避免资源泄漏,提升程序的健壮性。
2025-08-29 08:32:44
260
原创 C#中常见的异常类有哪些?
抛出具体异常:避免直接抛出Exception,而是选择最匹配的子类(如参数为null时抛针对性捕获:根据业务场景捕获特定异常(如文件操作捕获),避免滥用。查看文档:不确定方法会抛出哪些异常时,可参考 .NET 官方文档(如的文档会说明可能抛出的异常)。通过合理使用异常类,能让错误信息更清晰,便于调试和问题定位。
2025-08-29 08:30:01
962
原创 Ocelot VS Nginx
Ocelot是 .NET 微服务的“最佳拍档”,功能丰富且贴近业务,适合中低流量、强业务定制场景。Nginx是性能优先的通用网关,适合高并发、跨语言架构,作为流量入口或基础反向代理。选择时需结合技术栈、流量规模和业务复杂度综合判断,必要时可采用分层网关架构发挥两者优势。
2025-08-26 16:52:16
458
原创 如何在C#中使用Ocelot构建微服务网关?
在C#中使用Ocelot构建微服务网关是一个常见且高效的方案,Core/.NET 5+设计,提供了完整的微服务网关功能。
2025-08-26 16:20:20
469
原创 在 C# 中使用 Consul 客户端库实现服务发现
在 C# 中使用 Consul 客户端库实现服务发现,主要通过查询 Consul 服务器获取指定服务的健康实例列表。
2025-08-26 15:16:17
257
原创 consul的作用
Consul 是 HashiCorp 公司推出的一款,核心作用是解决分布式系统中服务的“定位、通信、管控与安全”问题,确保微服务或分布式架构下各组件能高效、可靠地协同工作。其功能覆盖服务发现、配置管理、健康检查、分段隔离等核心场景,广泛应用于云原生、微服务、多数据中心等架构中。
2025-08-25 18:57:28
892
原创 Consul 在 Windows 上的启动方法
Consul 是一个支持服务发现和配置共享的工具,以下是如何在 Windows 系统上启动 Consul 的详细步骤。通过以上步骤,您可以轻松在 Windows 系统上启动并运行 Consul。consul agent -dev -client <你的IPv4地址>,如果能看到 Consul 的 Web UI,则启动成功。,点击“编辑”,添加 Consul 的安装路径(如。在“高级”选项卡中,点击“环境变量”。的访问,以便正常使用 Web UI。保存后,在任意命令行窗口中输入。并回车,打开命令行窗口。
2025-08-25 18:54:25
405
原创 ASP.NET Core 中的构建者模式
理解ASP.NETCore 框架中的构建者模式后,可尝试自定义构建者类,模拟框架设计思路。示例:自定义一个 "订单构建者"csharp// 复杂对象:订单set;set;set;set;// VIP打9折// 构建者接口// 构建者实现// 返回自身,支持链式调用// 构建最终对象前的计算// 使用构建者.SetProduct("笔记本电脑", 5000m).Build();构建者模式是ASP.NET。
2025-08-25 15:20:14
774
原创 领域驱动中IUnitOfWork是干什么的
在领域驱动设计(DDD)中,(工作单元接口)是一种设计模式,主要用于。它的核心作用是将一组相关的数据库操作(如新增、修改、删除)封装为一个 “原子单元”,要么全部成功提交,要么全部失败回滚,避免部分操作成功导致的数据不一致问题。
2025-08-21 17:41:03
654
原创 CQRS 的优缺点
CQRS 的价值在于解决复杂系统中读写场景的差异化需求,通过分离职责实现针对性优化,但代价是系统复杂度和一致性管理成本的上升。因此,它更适合高并发、读写压力不均衡、业务逻辑复杂的大型系统,而对于简单应用则可能 "得不偿失"。实际使用中,常结合 DDD、事件驱动等思想,平衡其优势与挑战。
2025-08-21 16:52:19
280
原创 在.NET 8 中使用中介模式优雅处理多版本 API 请求
首先我们定义中介者和处理器的核心接口:data);data);data);在.NET 8 中使用中介模式处理多版本 API 请求,为我们提供了一种优雅、可扩展的解决方案。它不仅解决了 API 版本管理的核心问题,还带来了松耦合、易扩展、易维护等诸多优势。这种设计模式特别适合中大型 API 项目,能够有效应对业务需求的变化和系统的长期演进。通过集中化的中介者协调不同版本的交互,我们可以更专注于业务逻辑的实现,而不必过多关注版本间的依赖和兼容性处理。
2025-08-21 10:02:47
761
原创 软件开发:一场精密的生命构建
忽视任何一环,系统便如残缺的生命:架构薄弱则“骨质疏松”;唯有深刻理解并精心雕琢每一部分,让骨骼强健、经络通畅、肌肉有力、血液鲜活、皮肤润泽,方能构建出真正强大、灵动、持久的软件生命体。想象构建一个生命体:它需要支撑的骨骼、传导能量的经络、驱动行动的肌肉、维系生机的血液、感知世界的皮肤。软件开发亦是如此,它并非冰冷代码的堆砌,而是一场精密、有机的系统构建工程。如同骨骼为人体的形态、运动与生长提供基础框架,架构是软件系统的核心骨架。业务逻辑如同遍布周身的经络,虽不可见,却是驱动系统行为的核心脉络。
2025-08-11 17:31:58
337
原创 win11 命令禁用客户体验改善计划
若问题持续,需进一步排查其他系统服务或硬件兼容性问题。重启系统后再次检查事件查看器,确认。的条目,双击进入属性窗口。并回车打开服务管理器。启动本地组策略编辑器。服务,最后确认退出。在右侧策略列表中双击。
2025-08-01 15:15:07
500
原创 使用 SourceTree 合并多次提交:轻松实现批量 Cherry Pick
本文介绍使用SourceTree合并多个提交的方法:首先找到待合并提交的共同祖先节点,通过"变基"功能进入合并模式;然后选中最后一个提交,使用"squash"功能批量合并相关提交;接着编辑合并后的统一提交信息;最后将整合后的提交通过cherrypick应用到其他分支。这一操作能简化提交历史,提升跨分支代码管理效率,特别适合功能开发完成后统一提交到测试或生产分支的场景。
2025-07-24 11:14:57
619
原创 避坑:C# json反序列化为float精度丢失
场景推荐做法需要高精度计算使用decimal需要保留原始字符串格式使用或字符串不需要精度(如图形坐标)floatdouble可接受如需进一步处理高精度 JSON 数值(如科学计数法或超长小数),建议使用decimal或自定义进行转换。
2025-07-23 15:46:06
327
原创 C# Linq 左关联查询详解与实践
在 C# 开发中,Linq(Language Integrated Query)提供了强大的数据查询能力,尤其是在处理集合间的关联操作时。本文将详细解析 C# Linq 中的左关联查询,并通过实际案例说明其用法。
2025-07-15 14:23:01
452
原创 C# IIncrementalGenerator干点啥
在依赖项=》分析器=》项目生成g.cs,注意变更源生成器需要重新打开工程来刷新新生成的代码。
2025-07-08 16:07:11
282
原创 具体类型的不同,占用的字节大小
本文详细介绍了C#中常见数据类型的内存占用情况。值类型包括整数(sbyte、short、int、long等)、浮点(float、double、decimal)、布尔(bool)和字符(char),其字节大小固定(1-16字节)。引用类型(string、class、array等)在32位系统中占用4字节,64位系统占用8字节。结构体作为值类型,其大小为各字段之和并受内存对齐影响。文章还说明了dynamic和void等特殊类型,并通过表格总结了各类型字节大小,强调了解这些信息对内存优化和性能调优的重要性。
2025-06-17 17:28:11
857
原创 OWASP Top 10
OWASPTop10揭示2024年Web应用十大安全威胁:注入攻击、身份验证失效、敏感数据泄露、XXE注入、权限控制缺陷、安全配置错误、XSS跨站脚本、反序列化漏洞、组件已知漏洞及监控不足。这些风险可能导致数据泄露、权限提升和系统入侵,开发者需重点防范。(148字)
2025-06-17 16:37:34
1897
原创 ABP中的模块概念详解
ABP框架的模块化系统详解:ABP通过模块机制实现应用功能解耦,每个模块继承AbpModule类并定义明确的生命周期方法(如ConfigureServices、OnApplicationInitialization)。模块通过[DependsOn]特性声明依赖关系,支持分层结构设计和动态加载。核心优势包括:功能隔离、依赖管理、扩展性强(支持服务替换和实体扩展)。典型模块包含领域层、应用层、API层等项目,遵循单一职责原则。这种模块化设计是构建可维护、可扩展企业应用的基础设施,有效支持领域驱动设计和微服务架构
2025-06-16 14:24:16
318
原创 如何在ABP中定义实体、值对象和聚合根?
ABP框架中定义领域对象需遵循DDD原则:实体(Entity)继承Entity<TKey>基类,包含唯一标识和业务逻辑;值对象(ValueObject)通过[ComplexType]标记,重写Equals方法实现相等性比较;聚合根(AggregateRoot)作为唯一入口,维护业务规则和数据一致性。设计时应遵循聚合边界、封装不变性约束、使用工厂模式创建对象,并通过领域事件处理跨聚合逻辑。EF Core映射时需配置实体关系和值对象所有权,保持聚合轻量级并合理封装业务方法。
2025-06-16 14:18:54
377
原创 Nginx负载均衡功能
Nginx负载均衡功能解析:通过反向代理实现流量分发,支持四层/七། photo: 轮询、加权、最少连接等策略material,提供健康检查和高可用方案。核心配置包括定义upstream组、设置权重参数,可通过IP哈希实现会话保持。优化建议涉及连接数调整、请求分流,并需注意会话丢失等问题。实践表明合理配置Nginx负载均衡能有效提升系统性能和可用性,需根据业务场景选择合适策略并配合监控调优。
2025-06-16 09:46:10
873
原创 Redis的持久化功能
Redis提供RDB和AOF两种持久化方式:RDB通过定时快照保存数据,速度快但可能丢失最新数据;AOF记录写操作更安全但性能较低。Redis 4.0支持混合模式(RDB+AOF),结合两者优势。建议根据数据安全需求选择配置:高安全性场景可同时启用RDB+AOF,注重性能则可单独使用RDB。通过合理配置save参数和appendfsync策略,可平衡数据安全与系统性能。
2025-06-16 09:37:00
317
原创 rabbitmq 交换机、队列和消息概念
RabbitMQ 是一个功能强大的消息中间件,它采用发布-订阅模式进行消息传递。下面为你详细介绍 RabbitMQ 中交换机、队列和消息的核心概念。
2025-06-16 09:33:47
687
原创 C#实现RabbitMQ消息持久化
摘要:本文展示了使用C#实现RabbitMQ消息持久化的完整方案。通过RabbitMQ.Client库创建持久化交换机(ExchangeDeclare设置durable:true)、持久化队列(QueueDeclare设置durable:true)和持久化消息(BasicProperties.Persistent=true)。代码包含生产者和消费者示例,强调三者必须同时持久化才能确保消息不丢失,并指出持久化会带来性能开销。关键步骤包括:声明持久化组件、设置消息属性、通过NuGet安装客户端库(RabbitM
2025-06-16 09:13:28
222
原创 在C#中乐观锁的实现
C#中实现乐观锁的几种方法:1.版本号机制:使用Interlocked.CompareExchange原子操作检查版本号是否变化;2.时间戳机制:类似版本号,通过比较时间戳检测修改;3.ConcurrentDictionary:利用其线程安全的AddOrUpdate方法;4.数据库实现:在SQL语句中检查版本号字段。这些方法都通过冲突检测而非直接锁定来保证线程安全,适用于读多写少的并发场景。实现时需根据具体需求选择合适方案。
2025-06-13 16:14:14
521
原创 在C#中的乐观锁和悲观锁
C#中的乐观锁与悲观锁是两种并发控制策略,核心区别在于对数据冲突的处理方式。悲观锁(如lock关键字)提前锁定资源,适合写操作频繁场景,但可能导致性能瓶颈;乐观锁(如版本号机制)仅在提交时检查冲突,适合读多写少场景,能提高并发性能但需处理冲突。数据库中分别对应SELECT FOR UPDATE和版本号检查的实现方式。开发者应根据具体场景(如银行转账用悲观锁、电商库存用乐观锁)选择合适机制,权衡并发性能与冲突处理成本。
2025-06-13 15:56:05
748
原创 在C#中的锁
lock关键字:最简单易用的锁机制,适合大多数场景。Monitor类:提供了更多控制能力,适合需要等待/通知的场景。Mutex类:适合跨进程同步。Semaphore类:适合限制并发数量的场景。类:适合读多写少的场景。在实际开发中,可以根据具体需求选择合适的锁机制。
2025-06-13 15:02:13
776
1
原创 对称加密和非对称加密
对称加密优点:加密效率高,适合处理大量数据。缺点:密钥分发和管理复杂,安全性依赖于密钥的保密性。非对称加密优点:密钥分发简单,安全性高,支持身份认证和数字签名。缺点:加密和解密速度慢,不适合处理大量数据。在实际应用中,通常会结合使用对称加密和非对称加密,发挥各自的优势。例如,在SSL/TLS协议中,使用非对称加密进行密钥交换,然后使用对称加密进行数据传输,既保证了密钥的安全性,又提高了数据传输的效率。
2025-06-13 14:52:02
757
原创 .NET 中 Task 和 Thread 的根本区别
都用于实现多线程编程,但它们代表了不同的抽象层次和设计理念。理解它们的根本区别对于编写高效、可扩展的代码至关重要。的本质区别,结合具体场景合理选择,是编写高性能、可维护异步代码的关键。
2025-06-10 13:04:13
824
原创 .NET 异步编程的核心优势
摘要:.NET异步编程通过async/await关键字显著提升应用性能与用户体验,主要优势包括:1)提高I/O密集型应用吞吐量;2)避免UI线程阻塞;3)减少线程资源消耗;4)简化异步代码结构;5)统一错误处理机制;6)全面兼容现代框架。其适用于网络请求、数据库操作等I/O场景,以及需要保持UI响应的客户端应用。开发者需注意区分I/O密集型与CPU密集型任务,合理使用Task.Run,避免在不必要场景过度使用异步。该模型有效平衡了性能、资源利用和代码可维护性。
2025-06-10 11:28:53
856
原创 Redis 发布订阅(Pub/Sub)模式详解
Redis发布订阅(Pub/Sub)是一种消息通信模式,支持发布者向频道发送消息,订阅者接收特定频道的实时消息。核心功能包括:通过SUBSCRIBE订阅频道、PUBLISH发布消息、PSUBSCRIBE模式匹配订阅。该模式适用于实时聊天、事件通知等场景,特点是一对多通信、消息不持久化。Python示例展示了如何使用redis-py实现发布/订阅功能。需注意消息可能丢失、性能影响等问题,建议根据业务需求考虑Redis Streams等替代方案。
2025-06-10 11:22:50
924
原创 容器那个端口是对外暴露的
连接到 Docker 中运行的 Redis 容器有多种方式,取决于你的客户端环境和网络配置。根据你的具体场景选择合适的连接方式,确保网络配置和认证信息正确。8000:6379 其中8000是对外暴露的。
2025-06-10 11:18:19
923
原创 使用 Docker Compose 编排本地容器
通过这些配置,你可以高效地使用 Docker Compose 管理本地开发环境中的多个容器。Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。文件,你可以轻松地将多个本地容器组合成一个完整的应用。
2025-06-10 10:22:01
279
查看 Loki 版本的方法取决于 Loki 的安装方式,以下是几种常见的查看方法: 二进制安装:如果是通过下载二进制文件安装的 Loki,可以在命令行中通过执行loki -version命令来查看版本
2025-08-29
开源项目源码,openapi接口转markdown文档
2024-12-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人