自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 收藏
  • 关注

原创 微服务分布式配置中心:Gin Web 服务层与 gRPC 服务层集成 Nacos 实战

在微服务架构中,分布式配置中心是不可或缺的一部分,它可以帮助我们更方便地管理和更新各个服务的配置信息。今天,我们将详细探讨如何将 Gin Web 服务层和 gRPC 服务层集成到 Nacos 分布式配置中心。

2025-07-08 10:16:04 280

原创 微服务分布式配置中心详解

在微服务架构中,随着服务数量的增多和复杂度的提升,配置管理变得至关重要。分布式配置中心应运而生,它专门用于管理微服务架构中的配置文件。以支持 Go 语言的viper为例,配置文件管理涵盖了增加、修改、删除配置项等操作,同时要实现配置项在测试、开发和生产环境的隔离。不同环境的配置可能存在差异,例如数据库连接地址、日志级别等,因此需要对这些配置进行有效的管理和区分。

2025-07-07 17:51:34 403

原创 Gin 集成 gRPC 负载均衡:从实践到原理拆解

通过改造代码,我们实现了Gin + gRPC + 负载均衡简化开发:借助 gRPC 和注册中心生态,省去手动服务发现、连接管理的繁琐。提升稳定性:负载均衡策略让请求合理分配,实例故障时自动切换。理解原理:明白 gRPC 客户端如何与注册中心协作,实现动态服务发现和负载均衡。下一章节预告:后续会深入分布式配置的另一关键概念(比如配置中心的动态刷新、多环境配置管理 ),让微服务的配置更灵活、可控。学习过程中,建议多动手测试(比如模拟实例上下线 ),观察 gRPC 客户端的行为,加深对负载均衡原理的理解。

2025-07-07 14:38:46 696

原创 GORM 预加载指南:从基础到高级优化

假设我们有一个用户模型User和订单模型Order,用户拥有多个订单。// 错误示例:会产生N+1查询上述代码会先查询所有用户(1 次查询),然后为每个用户查询其订单(N 次查询),总查询次数为 N+1 次,这就是典型的 N+1 查询问题,在数据量大时会严重影响性能。// 按订单金额降序预加载// 生成SQL:Preload:避免 N+1 查询的核心方法,适用于大多数场景Joins:单 SQL 查询,适合简单关联的高性能需求条件预加载:在预加载时过滤关联数据嵌套预加载:处理多层关联关系。

2025-07-07 14:37:56 369

原创 微服务负载均衡全解析:从原理到实践

负载均衡,简单说就是把网络或应用请求,合理分配到多个处理单元(比如服务器、服务实例)的技术。性能优化:高并发时,避免请求扎堆到单个实例,让每个实例 “各司其职”,提升整体响应速度。稳定性保障:分散负载,防止单点过载宕机,即便部分实例故障,也能靠其他实例支撑,增强系统容错性。吞吐量提升:充分利用多实例资源,挖掘系统处理请求的最大潜力,应对业务高峰。举个实际例子,电商大促时,用户下单请求如潮水般涌来,负载均衡能把这些请求均匀派发给多个订单服务实例,确保系统不崩溃,订单能顺利处理。

2025-07-06 18:44:35 966

原创 Gin Web 服务集成 Consul:从服务注册到服务发现实践指南(下)

API 网关:作为系统统一入口,处理跨域请求、身份认证、流量限流等非业务逻辑,避免底层服务重复实现通用功能服务聚合器:将多个底层微服务的能力组合成复合 API,减少客户端与后端的交互次数(如同时获取用户信息和订单列表)请求路由枢纽:根据业务逻辑将请求转发到对应服务,实现前端与后端服务的逻辑解耦。

2025-07-06 18:11:10 904

原创 将 gRPC 服务注册到 Consul:从配置到服务发现的完整实践(上)

本文详细介绍了gRPC服务与Consul注册中心的集成方案。主要内容包括:1)使用Viper和Zap实现Go微服务的配置管理和日志系统;2)通过Consul实现服务注册与发现的核心流程,包括健康检查配置;3)提供命令行和UI两种验证方法;4)给出生产环境优化建议。该方案解决了微服务架构中的配置管理、服务治理等关键问题,通过Go语言实践展示了从配置加载到服务注册的全过程,为构建弹性可扩展的分布式系统提供了可落地的技术方案。

2025-07-06 17:29:06 908

原创 Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)

假设我们有一个基于 Go 语言的微服务项目,其中 Gin 负责处理 HTTP 请求,Viper 管理项目的配置信息,Zap 记录项目运行过程中的日志。我们将参考已有的代码结构和功能,逐步完成集成。通过以上步骤,我们成功地在 Gin Web 层集成了 Viper 配置文件和 Zap 日志文件。Viper 帮助我们管理项目的配置信息,Zap 提供了高性能的日志记录功能,使得项目的配置管理和日志记录更加方便和高效。

2025-07-06 10:05:38 219

原创 GRPC 服务中 viper 与 zap 的配置日志集成实践(上)

在微服务架构中,GRPC 凭借其高性能、跨语言的特性成为服务间通信的重要选择。然而,一个完整且健壮的 GRPC 服务,离不开合理的配置管理和有效的日志记录。本文将深入探讨如何通过viper和fsnotify实现配置热更新,并完成配置文件与日志文件在 GRPC 服务中的集成,助力开发者打造更完善的微服务应用。在 GRPC 服务集成viper配置文件和zap日志文件之前,往往存在诸多问题。缺乏配置文件时,服务的各项参数,如端口号、数据库连接信息、注册中心地址等,通常被硬编码在代码中。这不仅导致代码的可维护性极差

2025-07-05 16:47:42 1019

原创 GRPC 连接中的拦截器与全局变量应用实践

在微服务架构中,GRPC 以其高性能、跨语言和流式通信特性成为服务间通信的首选方案。然而,随着业务逻辑的复杂化,如何高效管理 GRPC 连接、复用资源并实现全局功能拦截,成为开发者必须掌握的核心技能。

2025-07-05 14:37:56 982

原创 深入理解微服务中的服务注册与发现(Consul)

在微服务架构中,一个完整的应用被拆分成多个独立运行的微服务,每个微服务都承担着特定的业务功能。这些微服务之间需要相互协作、互相调用,以完成复杂的业务逻辑。而服务注册与发现,正是解决微服务之间互相调用问题的核心机制,它通过一套完整的流程,实现了服务实例的动态管理和自动发现,大大提高了系统的可维护性和可扩展性。想象一下,在一个庞大的城市中,有许多不同的商店(微服务),每个商店都有自己的特色商品(业务功能)。当一个顾客(调用方服务)想要购买某种商品时,他需要知道哪些商店有这种商品以及这些商店的具体位置。

2025-07-05 08:27:31 924

原创 前后端分离架构下的跨域问题与解决方案

定义跨域问题是指当一个资源试图从一个源加载时,如果该资源的域名、协议或端口号与当前网页的域名、协议或端口号不同,则会被浏览器阻止访问。这是为了防止恶意网站读取另一个网站的数据,从而保护用户的隐私和安全。跨域问题是Web开发中不可避免的一部分,尤其是在前后端分离的趋势下。了解其背后的原理有助于我们选择合适的解决方案。一般来说,后端通过配置CORS是最直接有效的方式,而前端则可以通过代理或者JSONP等方式作为补充。合理地应用这些技术,可以有效地提升用户体验,同时确保系统的安全性。

2025-07-04 15:09:05 896

原创 微服务架构下 Session 机制的弊端与解决方案

在微服务架构下,传统 Session 机制因状态共享和扩展性问题不再适用。Redis 分布式 Session通过集中存储解决了状态共享问题,但需依赖中间件;JWT则通过无状态设计彻底摆脱了 Session 管理,更适合现代微服务场景。优先 JWT:适用于高并发、无状态的 API 服务。优先 Redis:适用于需要保留 Session 机制的渐进式改造场景。通过理解两种方案的原理和实现,希望你可以更好地设计安全、高效的微服务认证体系。

2025-07-04 09:52:27 743

原创 Session 机制在单体框架中的实现流程详解

Session 是一种服务器端状态管理机制,用于跟踪用户会话。它通过在客户端存储会话标识(Session ID),在服务器端存储用户状态数据,实现跨请求的用户状态保持。单体框架中,Session 的实现通常与框架生命周期深度集成。

2025-07-03 20:01:45 984

原创 GORM 多对多关联(Many To Many)完全指南:从基础到高级实践

一个用户(User)可以拥有多个角色(Role)一篇文章(Article)可以属于多个标签(Tag)一个课程(Course)可以有多个学生(Student),一个学生可以选多门课程这种关系的特点是需要一张连接表(中间表)来记录两个模型的关联关系,例如user_roles等。// 用户模型gorm.Model// 多对多关联:用户拥有多个角色,中间表为user_roles"`// 角色模型gorm.Model// 反向关联:角色属于多个用户"`关联本质解析GORM 自动创建连接表。

2025-07-03 14:04:21 754

原创 GORM 一对多关联(Has Many)完全指南:从基础到实战

Has Many表示 "拥有多个" 关系,是一对多关联的实现方式。一个用户(User)拥有多张信用卡(CreditCard)一个订单(Order)包含多个订单项(OrderItem)一个分类(Category)下有多个产品(Product)一端模型实例拥有另一端模型的多个实例,在数据库中通过外键关联实现,是最常用的关联关系之一。// 用户模型(拥有者)gorm.Model// 拥有多张信用卡,切片类型表示多个关联// 信用卡模型(被拥有者)gorm.Model。

2025-07-03 10:46:16 679

原创 Go 语言开发中用户密码加密存储的最佳实践

用户密码的安全存储是系统安全的基石,本文从数据库模型设计出发,详细介绍了密码加密的相关知识和 Go 语言实现方案。永远不要以明文形式存储用户密码MD5 等哈希算法需要配合盐值和迭代使用推荐使用 bcrypt、Argon2 等专门为密码存储设计的算法盐值加密是防御彩虹表攻击的有效手段完整的密码安全方案需要考虑算法、盐值、存储和管理多个方面通过实施本文介绍的技术和最佳实践,可以大大提高用户密码的安全性,降低系统被攻击的风险。在实际开发中,应根据系统规模和安全需求,选择合适的加密方案并持续优化。

2025-07-02 15:22:13 903

原创 Gin 框架中的优雅退出

所谓优雅退出(Graceful Shutdown)是指:在程序接收到关闭信号时(比如用户按下Ctrl+C或者系统发送SIGTERM停止接收新的请求;完成当前正在处理的请求;执行一些清理操作(如注销服务、释放资源等);最后再安全地退出程序。这样可以避免服务中断、数据丢失或客户端连接异常等问题。内容说明监听系统信号(如 Ctrl+C)优雅关闭 HTTP 服务控制最大退出等待时间优雅退出的意义避免服务突然中断,提高系统稳定性应用场景微服务、云原生、Kubernetes、生产部署。

2025-07-02 09:26:40 1224

原创 GORM 一对一关联(Has One)完全指南:从基础到实战

Has One表示 "拥有一个" 关系,是一对一关联的实现方式。一个用户(User)拥有一张信用卡(CreditCard)一个订单(Order)拥有一个配送地址(ShippingAddress)一个产品(Product)拥有一个库存记录(Stock)一端模型实例拥有另一端模型的一个实例,在数据库中通过外键关联实现,与Belongs To关系形成互补。// 用户模型(拥有者)gorm.Model// 拥有一张信用卡// 信用卡模型(被拥有者)gorm.Model。

2025-07-02 09:26:21 601

原创 GORM 关联关系之 Belongs To:多对一关联的实现与实践

Belongs To表示 "属于" 关系,是多对一关联的实现方式。一个用户(User)属于一个公司(Company)一篇文章(Article)属于一个作者(Author)一个订单(Order)属于一个用户(User)多端模型实例属于一端模型的一个实例,在数据库中通过外键关联实现。// 公司模型(一端模型)ID int// 用户模型(多端模型,属于一个公司)gorm.ModelAge intCompanyID int // 外键,关联Company的ID。

2025-07-02 09:25:14 833

原创 GORM 删除的重要特性:软删除实践案例(优化版)

在实际项目中,软删除是一种非常实用的数据管理技术,它允许我们在不真正删除数据的情况下标记数据为 "已删除",从而保留数据的可追溯性和可恢复性。这个特性在项目的开发中很常见,也非常重要,因此我单独出了一篇关于软删除的实践案例,以帮助大家更好地理解。

2025-07-01 15:05:45 134

原创 GORM 删除操作实战指南:从单条记录到软删除最佳实践

/ 使用插件实现不同软删除标志// 场景1:Unix时间戳作为删除标志ID uint// 生成SQL: UPDATE users SET deleted_at = 1688275200 WHERE id = 1;// 场景2:使用1/0标志位ID uint// 生成SQL: UPDATE users SET is_del = 1 WHERE id = 1;// 场景3:混合模式(标志位+删除时间)ID uint。

2025-07-01 15:01:19 720

原创 Gin 中间件详解与实践

你可以通过定义一个类型的函数来创建自定义中间件。基础结构示例// 前置处理(请求进入时执行)log.Println("请求开始")c.Next() // 调用后续处理// 后置处理(响应返回前执行)log.Println("请求结束")认证中间件详解(用户代码优化)// 正确的Token认证中间件实现if token!= "Lu" {c.JSON(http.StatusUnauthorized, gin.H{"msg": "未登录"})c.Abort() // 终止请求处理。

2025-07-01 14:53:59 873

原创 GORM 更新操作完全指南:从基础到高级实战

更新单个字段按主键更新:若要更新User表中ID为 1 的记录的Name字段为 "Bob",可以使用以下代码。基于表达式更新:若要将User表中所有记录的Age字段增加 1,可利用gorm.Expr实现。更新多个字段使用结构体更新:当有一个包含新数据的User结构体实例,想根据主键更新对应记录的字段时,可这样操作。假设user是一个User结构体,包含Name和Age字段的新值,要更新ID为 1 的用户记录。使用 Map 更新:若需灵活更新多个字段,可使用map。例如更新ID为 1 的用户的。

2025-07-01 09:51:09 704

原创 Go语言中map[string]interface{} 和 map[string]string的区别

在 Go 语言中,和是两种不同类型的 map,它们的主要区别在于值的类型以及这种差异带来的使用场景和灵活性的不同。

2025-06-30 16:06:03 176

原创 深入比较 Gin 与 Beego:Go Web 框架的两大选择

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范全栈式框架:集成了路由、ORM、日志、配置管理等众多功能,适合构建大型应用。模块化设计:内置了许多开箱即用的功能模块,减少了开发者的负担。文档丰富:拥有详细的官方文档,便于学习和使用。

2025-06-30 15:32:30 1023

原创 GORM 高级查询实战:从性能优化到业务场景解决方案

GORM中的Scopes是一个强大的特性,它允许你将常用的查询条件定义为可重用的方法。这些作用域可以很容易地在查询中引用,从而使代码更加模块化和可读。// 定义订单查询作用域// 大额订单(金额>1000)", 1000)// 已支付订单", "paid")// 按状态筛选的动态作用域字段选择原则永远只查询需要的字段,使用Select或模式敏感字段(如密码)绝不返回锁机制使用场景FOR UPDATE:库存扣减、资金转账等强一致性场景FOR SHARE:多人同时查看但不修改的场景。

2025-06-30 15:04:05 1342

原创 GORM 查询指南:从基础到条件查询深度解析

单个对象检索FirstTakeLast是首选,注意处理错误String 条件支持所有 SQL 原生条件表达式(=, <>, IN, LIKE 等)内联条件可简化代码,但可读性略低于链式调用NOT和OR可构建复杂逻辑查询Struct & Map 条件Struct 条件基于模型字段,自动忽略零值,适合「按对象属性查询」Map 条件灵活支持任意键值对,包括零值,适合动态条件指定结构体查询字段可强制包含特定字段,解决零值忽略问题最佳实践避免主键冲突,查询前重置主键值始终限制查询结果集(

2025-06-30 14:51:39 961

原创 GORM 部分关键字详解与关联查询实战:Preload 与 Association 的使用对比

方法使用方式是否一次性加载关联是否适合修改关联数据场景建议Preload✅ 是❌ 否展示数据、读取为主❌ 否✅ 是操作关联数据、业务逻辑中。

2025-06-30 14:45:04 841

原创 深入学习 GORM:记录插入与数据检索

在使用 GORM 进行数据库操作时,掌握如何高效地插入记录和检索数据是非常重要的。本文将详细介绍通过 方法插入记录、批量插入、以及各种数据检索方法,并结合实际示例进行讲解。GORM 提供了简单易用的 方法来插入单条记录。以下是一个基本示例:执行上述代码后, 将被自动设置为新插入记录的主键值。当你需要插入大量数据时,可以使用 方法来指定批量插入的批次大小,以提高性能。示例 2:大批量插入用户数据根据 Map 创建记录除了直接使用结构体插入数据外,还可以通过 来创建记录。

2025-06-29 17:04:15 303

原创 深入探索 GORM:Go 语言中的强大 ORM 工具

通过上述详细的介绍,你应该已经掌握了 GORM 的基本用法及其部分高级特性。无论是简单的 CRUD 操作还是复杂的关联查询、事务处理,GORM 都能提供强有力的支持。希望这篇文章能够帮助你在项目中充分利用 GORM 的优势,提高开发效率和代码质量。

2025-06-29 16:59:09 792

原创 Go 中的 range 表达式详解:遍历数组、切片、字符串与 Map

range类型第一个返回值第二个返回值切片/数组索引 (int)元素 (element)字符串索引 (int)runeMapKeyValueChannel接收的值——写法是否推荐说明✅ 推荐获取索引和元素✅ 推荐忽略索引,只要元素❌ 不推荐错误地将索引赋给 user⚠️ 警告只获取索引或 key,容易误解。

2025-06-29 16:57:06 568

原创 SQL关键字三分钟入门:ROW_NUMBER() —— 窗口函数为每一行编号

是 SQL 中用于为分区或整个结果集中的行生成唯一行号的窗口函数。它会根据指定的排序规则为每条记录分配一个连续的行号,即使存在相同的值也不会导致行号跳过。你可以把它理解为:“按照某个标准给每条记录打上独一无二的行号标签”。场景SQL 示例按单一条件编号按部门内条件编号结合其他聚合函数使用希望这篇简短的指南帮助你快速了解了窗口函数的强大功能。

2025-06-28 22:00:07 749

原创 SQL关键字三分钟入门:RANK() —— 窗口函数

RANK()是 SQL 中用于计算分区或整个结果集中行的排名的窗口函数。它会根据指定的排序规则为每条记录分配一个排名值,允许存在并列排名(即相同的值会有相同的排名,但接下来的排名会跳过相应的数字)。你可以把它理解为:“按照某个标准给每条记录打上排名标签”。场景SQL 示例按单一条件排名按部门内条件排名结合其他聚合函数使用。

2025-06-28 21:26:11 650

原创 从单体架构到微服务:微服务架构演进与实践

通过从单体架构到微服务架构的演进,系统将获得更高的可扩展性、可维护性和故障隔离能力,而分层微服务架构则进一步优化了服务间通信效率,使复杂系统能够以更灵活的方式应对业务快速变化。然而,随着业务规模扩大和功能复杂度提升,单体架构逐渐暴露出不可忽视的问题,推动着系统向微服务架构演进。微服务架构下服务调用关系呈网状结构,例如用户下单时需调用商品服务查询库存、订单服务创建订单、支付服务处理付款,需通过服务注册与发现(如 Consul、Nacos)、API 网关(如 Kong、APISIX)等组件管理调用链路。

2025-06-28 16:24:05 1224

原创 Go中interface接口的设计理念

Go语言中的接口(interface)是一种非常强大的抽象机制,它允许开发者定义行为的集合,而不必关心这些行为是如何具体实现的。接口在Go中扮演着核心角色,尤其是在实现多态性和代码解耦方面。

2025-06-27 21:14:45 892

原创 gRPC 认证机制详解:基于拦截器和 Metadata 的实现

首先,我们通过.protoproto";这定义了一个简单的Greeter服务,包含一个SayHello方法,接收并返回HelloReply。通过拦截器和 Metadata 实现 gRPC 认证是一种优雅且高效的方式,它将认证逻辑与业务逻辑分离,提供了统一的错误处理和灵活的扩展性。客户端可以选择直接在拦截器中添加元数据,或通过实现接口提供更标准化的认证方案。这种模式特别适合微服务架构中的跨服务认证,能够有效保护 API 安全,同时保持代码的简洁性和可维护性。

2025-06-27 18:40:00 761

原创 Go 中 gRPC Metadata 使用详解

Metadata 是一种键值对结构,它可以在不改变请求或响应消息体的情况下携带额外的信息。这些信息通常用于认证(如 token)、追踪(如 trace id)等场景。值得注意的是,Metadata 键是大小写不敏感的,并且仅支持 ASCII 字符串作为键名。.proto在 gRPC 中,Metadata 是 key-value 形式的附加信息。可以用来传输 session id、认证 token、trace id 等信息。不属于请求体,而是类似于 HTTP Header 的存在。

2025-06-27 15:28:05 759

原创 gRPC 超时处理详解:构建健壮的分布式服务通信

实践建议说明✅ 明确设置客户端超时防止请求无限等待,提高系统可用性✅ 服务端监听上下文取消事件及时释放资源,避免资源浪费✅ 合理配置超时时间不宜过长或过短,应根据业务需求调整✅ 结合重试机制对于幂等操作可尝试重试,提升容错能力✅ 使用拦截器统一控制减少重复代码,增强一致性✅ 记录超时日志用于监控和后续分析,识别性能瓶颈gRPC 的超时机制不仅是一种错误处理手段,更是构建高可用、低延迟服务的重要保障。

2025-06-26 22:03:17 1078

原创 gRPC 的高级错误处理与重试机制:构建高可用服务的关键

项目建议状态码使用明确区分业务错误与系统错误,避免滥用 UNKNOWN 和 INTERNAL错误详情使用errdetails传递结构化错误信息,提高客户端可解析性客户端重试只对可重试状态码进行重试,结合指数退避和最大次数控制幂等性保障在服务端确保幂等操作的正确性,避免因重试导致数据混乱日志记录服务端记录完整的错误日志,包括状态码、消息和上下文信息测试覆盖编写单元测试模拟各种错误码,验证客户端重试逻辑是否符合预期gRPC 的错误处理和重试机制是构建高可用服务的重要组成部分。

2025-06-26 19:45:30 957

DynamicArray02.java

DynamicArray02.java

2024-04-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除