gRpc(1)
gRpc(1) 1. gRPC 是什么 & 基本概念 gRPC 是 Google 开源的高性能 RPC 框架,基于 HTTP/2 和 Protobuf。简单理解: RPC(远程过程调用):像调用本地函数一样调用远程服务。 Protobuf(Protocol Buffers):一种高效、结构化的二进制序列化格式,用 .proto 文件定义消息和服务接口。 在一个典型 gRPC 项目中你会看到: ...
gRpc(1) 1. gRPC 是什么 & 基本概念 gRPC 是 Google 开源的高性能 RPC 框架,基于 HTTP/2 和 Protobuf。简单理解: RPC(远程过程调用):像调用本地函数一样调用远程服务。 Protobuf(Protocol Buffers):一种高效、结构化的二进制序列化格式,用 .proto 文件定义消息和服务接口。 在一个典型 gRPC 项目中你会看到: ...
Go 开发框架三件套 1. Gorm - 强大的 ORM 框架深度扩展 1.1 基本使用增强版 1.1.1 完整 CRUD 操作示例 // 创建记录(批量插入) users := []User{ {Name: "Alice", Age: 25}, {Name: "Bob", Age: 30}, {Name: "Charlie", Age: 35}, } db.Create(&users) // 一次性插入所有记录 // 查询记录(带条件) var activeUsers []User db.Where("status = ? AND age > ?", "active", 25). Order("created_at desc"). Limit(10). Offset(0). Find(&activeUsers) // 更新多个字段 db.Model(&User{}).Where("role = ?", "admin"). Updates(map[string]interface{}{ "age": 40, "status": "inactive", }) // 删除记录(带条件) db.Where("email LIKE ?", "%@test.com").Delete(&User{}) 1.1.2 高级查询技巧 // 子查询 subQuery := db.Select("AVG(age)").Where("department = ?", "IT").Table("users") db.Where("age > (?)", subQuery).Find(&users) // 原生 SQL 执行 db.Exec("UPDATE users SET balance = balance * ? WHERE level > ?", 1.1, 3) // 查询结果映射到自定义结构体 type UserProfile struct { Name string Email string } db.Model(&User{}).Select("name, email").Scan(&UserProfile{}) 1.2 软删除进阶实践 1.2.1 自定义删除字段 type CustomModel struct { ID uint `gorm:"primarykey"` CreatedAt time.Time UpdatedAt time.Time Deleted gorm.DeletedAt `gorm:"index;column:deleted_at"` } type Product struct { CustomModel Name string Price float64 } // 使用自定义删除字段 db.Where("price < ?", 100).Delete(&Product{}) 1.2.2 软删除与关联关系 type Company struct { gorm.Model Name string Products []Product `gorm:"foreignKey:CompanyID"` } // 级联软删除 db.Select("Products").Delete(&company) 1.3 事务管理增强 1.3.1 分布式事务示例(Saga模式) // 创建订单事务 err := db.Transaction(func(tx *gorm.DB) error { // 扣减库存 if err := tx.Model(&Inventory{}). Where("product_id = ?", order.ProductID). Update("quantity", gorm.Expr("quantity - ?", order.Quantity)). Error; err != nil { return err } // 创建订单 if err := tx.Create(&order).Error; err != nil { return err } // 调用支付服务(外部系统) if err := paymentClient.Charge(order.Total); err != nil { return err // 自动回滚 } return nil }) 1.3.2 事务隔离级别配置 // 设置事务隔离级别为可重复读 tx := db.Set("gorm:query_options", "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ").Begin() // 在事务中执行操作 tx.Model(&User{}).Where("id = ?", 1).Update("balance", gorm.Expr("balance - ?", 100)) tx.Commit() 1.4 Hook 全生命周期管理 1.4.1 完整 Hook 列表及执行顺序 type Order struct { gorm.Model Status string TotalPrice float64 } // 创建流程 func (o *Order) BeforeCreate(tx *gorm.DB) error { o.Status = "pending" return nil } func (o *Order) AfterCreate(tx *gorm.DB) error { tx.Model(o).Update("order_no", generateOrderNo()) return nil } // 更新流程 func (o *Order) BeforeUpdate(tx *gorm.DB) error { if o.Status == "shipped" { o.TotalPrice *= 1.1 // 增加运费 } return nil } 1.4.2 审计日志实现 func (u *User) BeforeUpdate(tx *gorm.DB) error { if tx.Statement.Changed("Email") { oldEmail := tx.Statement.Old("Email").(string) newEmail := tx.Statement.New("Email").(string) audit := AuditLog{ UserID: u.ID, Action: "UPDATE_EMAIL", OldValue: oldEmail, NewValue: newEmail, } tx.Create(&audit) } return nil } 1.5 性能优化深度指南 1.5.1 连接池最佳配置 sqlDB, err := db.DB() if err != nil { panic("failed to get database handle") } // 连接池配置 sqlDB.SetMaxIdleConns(20) // 空闲连接数 sqlDB.SetMaxOpenConns(100) // 最大打开连接数 sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大生命周期 sqlDB.SetConnMaxIdleTime(30*time.Minute) // 空闲连接最大存活时间 1.5.2 索引优化策略 type Product struct { gorm.Model SKU string `gorm:"index:idx_sku,unique"` Category string `gorm:"index:idx_category"` Price float64 } // 复合索引 db.Model(&Order{}).AddIndex("idx_status_created", "status", "created_at") // 表达式索引(PostgreSQL) db.Exec("CREATE INDEX idx_lower_name ON users ((lower(name)))") 1.6 生态扩展实践 1.6.1 常用插件示例 // 分页插件 import "gorm.io/plugin/pagination" db.Use(pagination.Register) var users []User result := db.Scopes(pagination.Paginate(page, pageSize)).Find(&users) // 数据加密插件 import "github.com/go-gorm/gorm/v2/plugin/crypto" db.Use(crypto.NewCryptoPlugin(crypto.Config{ Keys: [][]byte{[]byte("32-byte-long-secret-key-here")}, })) 1.6.2 多数据库支持 // MySQL 配置 mysqlDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) // PostgreSQL 配置 postgresDB, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ TablePrefix: "tbl_", }, }) // SQLite 配置 sqliteDB, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, }) 1.7 高级特性 1.7.1 多租户架构实现 // 基于 schema 的多租户 db.Use(multitenancy.New(multitenancy.Config{ TenantKey: "X-Tenant-ID", Resolver: func(c *multitenancy.Context) string { return c.Request.Header.Get("X-Tenant-ID") }, })) // 自动路由到对应 schema db.Scopes(func(d *gorm.DB) *gorm.DB { return d.Table("tenant_" + tenantID + ".users") }) 1.7.2 版本化迁移 // 使用 Atlas 迁移工具 // 创建迁移文件 migrate create --dir migrations --format golang add_users_table // 执行迁移 migrate apply --dir migrations --dialect mysql 1.8 最佳实践总结 查询优化: ...
Go 并发与依赖管理 01 并发与并行 Go 语言以简洁、轻量级的方式支持并发编程,通过 Goroutine 和 Channel 可以充分利用多核 CPU,提高程序执行效率。理解 Go 的并发模型对于写出高效、稳定的程序至关重要。 ...
Go 高质量编程与性能调优 本文深入探讨 Go 语言的高质量编程和性能调优,结合具体示例,帮助你编写正确可靠、简洁清晰的代码,并掌握性能优化的核心方法。 01 高质量编程 高质量代码的目标是正确可靠、简洁清晰。以下是实现高质量编程的关键点。 ...
Go 内存管理与编译器优化 本文深入探讨 Go 语言的自动内存管理、垃圾回收机制以及编译器优化技术,结合具体示例和流程图,帮助你理解 Go 内存管理的核心原理和性能优化方法。 ...
Go语言基础 1. Go语言概述 高性能:适合并发编程,支持高并发、高性能场景。 简洁语法:Go的语法简洁,快速上手,去除了复杂的面向对象特性,保留了函数式编程的一些优势。 丰富标准库:内建强大的标准库,支持网络、文件操作、并发等。 静态链接:生成独立的可执行文件,无需依赖外部库,简化部署。 跨平台:支持Linux、Windows、macOS等多个平台。 垃圾回收:自动管理内存,减少开发人员的负担。 2. 环境搭建 Go安装:官方安装指南 推荐IDE:VSCode、GoLand,或者Gitpod等云开发环境。 Go Module go.mod:用于管理 Go 项目的依赖,记录模块路径、Go 版本和所依赖的包及其版本。 ...