尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

go: Circuit-Breaker Pattern

go: Circuit-Breaker Pattern
📅 发布时间:2026/6/29 12:16:41

项目结构:

断路器模式是稳定性设计模式的核心之一,核心作用:当依赖服务持续失败时,自动切断请求调用,避免级联故障、耗尽系统资源,保护核心业务流程。
它有 3 种状态:
关闭 (Closed):正常放行所有请求
打开 (Open):连续失败达到阈值,直接拦截请求,快速失败
半开 (Half-Open):超时后尝试放行少量请求,验证服务是否恢复

/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:38 # User : geovindu # Product : GoLand # Project : godesginpattern # File : settings.go */ package config import "time" // CircuitBreakerConfig 断路器配置 type CircuitBreakerConfig struct { FailureThreshold int RecoveryTimeout time.Duration SuccessThreshold int } // JewelryBusinessConfig 珠宝业务配置 type JewelryBusinessConfig struct { FallbackGoldPrice float64 FailureRate float64 } // 全局单例配置 var ( CbConfig = CircuitBreakerConfig{ FailureThreshold: 3, RecoveryTimeout: 10 * time.Second, SuccessThreshold: 2, } JewelryConfig = JewelryBusinessConfig{ FallbackGoldPrice: 628.5, FailureRate: 0.7, } ) /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:38 # User : geovindu # Product : GoLand # Project : godesginpattern # File : exception.go */ package core import "fmt" // ServiceErr 业务基础异常 type ServiceErr struct { Msg string } func (e *ServiceErr) Error() string { return fmt.Sprintf("service error: %s", e.Msg) } // ExternalServiceErr 第三方外部服务异常 func NewExternalServiceErr(msg string) error { return &ServiceErr{Msg: msg} } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:39 # User : geovindu # Product : GoLand # Project : godesginpattern # File : base.go */ package circuitbreaker // State 断路器状态 type State string const ( StateClosed State = "CLOSED" StateOpen State = "OPEN" StateHalfOpen State = "HALF_OPEN" ) // CircuitBreaker 断路器接口 type CircuitBreaker interface { IsAllowed() bool OnSuccess() OnFailure() GetState() State } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:39 # User : geovindu # Product : GoLand # Project : godesginpattern # File : impl.go */ package circuitbreaker import ( "fmt" "godesginpattern/circuitbreaker/config" "time" ) // DefaultCircuitBreaker 默认断路器实现 type DefaultCircuitBreaker struct { failureThreshold int recoveryTimeout time.Duration successThreshold int state State failureCount int successCount int lastFailureTs int64 } func NewDefaultCircuitBreaker() *DefaultCircuitBreaker { cfg := config.CbConfig return &DefaultCircuitBreaker{ failureThreshold: cfg.FailureThreshold, recoveryTimeout: cfg.RecoveryTimeout, successThreshold: cfg.SuccessThreshold, state: StateClosed, } } func (d *DefaultCircuitBreaker) GetState() State { return d.state } func (d *DefaultCircuitBreaker) IsAllowed() bool { if d.state == StateOpen { now := time.Now().Unix() if now-d.lastFailureTs >= int64(d.recoveryTimeout.Seconds()) { d.state = StateHalfOpen d.successCount = 0 fmt.Println("🔄 断路器超时 → 进入半开状态") return true } return false } return true } func (d *DefaultCircuitBreaker) OnSuccess() { switch d.state { case StateClosed: d.failureCount = 0 case StateHalfOpen: d.successCount++ if d.successCount >= d.successThreshold { fmt.Println("✅ 半开状态连续成功 → 断路器关闭") d.reset() } } } func (d *DefaultCircuitBreaker) OnFailure() { switch d.state { case StateClosed: d.failureCount++ fmt.Printf("失败计数:%d/%d\n", d.failureCount, d.failureThreshold) if d.failureCount >= d.failureThreshold { fmt.Println("🔥 连续失败达到阈值 → 断路器打开") d.open() } case StateHalfOpen: fmt.Println("❌ 半开状态请求失败 → 重新打开断路器") d.open() } } func (d *DefaultCircuitBreaker) open() { d.state = StateOpen d.lastFailureTs = time.Now().Unix() d.successCount = 0 } func (d *DefaultCircuitBreaker) reset() { d.state = StateClosed d.failureCount = 0 d.successCount = 0 d.lastFailureTs = 0 } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:40 # User : geovindu # Product : GoLand # Project : godesginpattern # File : breaker_decorator.go */ package util import ( "fmt" "godesginpattern/circuitbreaker/config" "godesginpattern/circuitbreaker/core/circuitbreaker" ) // PriceResult 金价返回结构体 type PriceResult struct { Status string `json:"status"` GoldPrice float64 `json:"gold_price"` Message string `json:"message,omitempty"` UpdateTime string `json:"update_time,omitempty"` } // WrapBreaker 断路器包装函数(替代Python装饰器) func WrapBreaker(breaker circuitbreaker.CircuitBreaker, fn func() (PriceResult, error)) PriceResult { if !breaker.IsAllowed() { fmt.Printf("⚠️ 断路器已打开 | 当前状态:%s → 使用兜底金价\n", breaker.GetState()) return PriceResult{ Status: "fallback", Message: "断路器已开启,使用兜底数据", GoldPrice: config.JewelryConfig.FallbackGoldPrice, } } res, err := fn() if err != nil { breaker.OnFailure() fmt.Printf("❌ 请求失败 | 断路器状态:%s | 异常:%v\n", breaker.GetState(), err) return PriceResult{ Status: "error", Message: "第三方金价服务调用失败", GoldPrice: config.JewelryConfig.FallbackGoldPrice, } } breaker.OnSuccess() fmt.Printf("✅ 请求成功 | 断路器状态:%s\n", breaker.GetState()) return res }
/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:41 # User : geovindu # Product : GoLand # Project : godesginpattern # File : inventory.go */ package service // 库存服务 // StockResp 库存返回 type StockResp struct { Weight float64 `json:"weight"` Stock string `json:"stock"` Status string `json:"status"` } // InventoryService 珠宝库存服务 type InventoryService struct{} func NewInventoryService() *InventoryService { return &InventoryService{} } // CheckGoldStock 校验黄金库存 func (i *InventoryService) CheckGoldStock(weight float64) StockResp { return StockResp{ Weight: weight, Stock: "充足", Status: "success", } } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:41 # User : geovindu # Product : GoLand # Project : godesginpattern # File : price.go */ package service import ( "godesginpattern/circuitbreaker/config" "godesginpattern/circuitbreaker/core" "godesginpattern/circuitbreaker/core/circuitbreaker" "godesginpattern/circuitbreaker/util" "math/rand" "time" ) // 第三方金价服务 var globalBreaker = circuitbreaker.NewDefaultCircuitBreaker() // PriceService 金价服务 type PriceService struct{} func NewPriceService() *PriceService { return &PriceService{} } // GetRealtimePrice 获取实时金价(熔断保护) func (p *PriceService) GetRealtimePrice() util.PriceResult { // 包装断路器逻辑 return util.WrapBreaker(globalBreaker, func() (util.PriceResult, error) { rand.Seed(time.Now().UnixNano()) if rand.Float64() < config.JewelryConfig.FailureRate { return util.PriceResult{}, core.NewExternalServiceErr("第三方金价接口超时/500错误") } price := 630 + rand.Float64()*20 return util.PriceResult{ Status: "success", GoldPrice: float64(int(price*100)) / 100, UpdateTime: time.Now().Format("2006-01-02 15:04:05"), }, nil }) } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:42 # User : geovindu # Product : GoLand # Project : godesginpattern # File : order.go */ package service import ( "fmt" "time" ) // Order 订单结构体 type Order struct { OrderID string `json:"order_id"` UserID string `json:"user_id"` SKU string `json:"sku"` Weight float64 `json:"weight"` GoldPrice float64 `json:"gold_price"` TotalAmount float64 `json:"total_amount"` OrderStatus string `json:"order_status"` } // OrderService 订单服务(依赖注入库存、金价服务) type OrderService struct { inventory *InventoryService price *PriceService } // NewOrderService 构造函数注入依赖 func NewOrderService(inv *InventoryService, price *PriceService) *OrderService { return &OrderService{ inventory: inv, price: price, } } // CreateGoldOrder 创建黄金珠宝订单 func (o *OrderService) CreateGoldOrder(userID string, weight float64, sku string) Order { fmt.Println("\n==================================================") fmt.Printf("[订单服务] 开始创建订单 | 用户:%s | 克重:%.1fg\n", userID, weight) // 1. 库存校验 stock := o.inventory.CheckGoldStock(weight) fmt.Printf("[库存服务] %+v\n", stock) // 2. 获取金价(带熔断) priceInfo := o.price.GetRealtimePrice() fmt.Printf("[金价服务] %+v\n", priceInfo) // 3. 计算总价 total := float64(int(weight*priceInfo.GoldPrice*100)) / 100 // 4. 生成订单 orderID := fmt.Sprintf("ORD%d", time.Now().Unix()) order := Order{ OrderID: orderID, UserID: userID, SKU: sku, Weight: weight, GoldPrice: priceInfo.GoldPrice, TotalAmount: total, OrderStatus: "PENDING_PAYMENT", } fmt.Printf("[订单服务] 订单创建成功:%+v\n", order) return order }

调用:

/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Circuit-Breaker Pattern 熔断器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/28 21:43 # User : geovindu # Product : GoLand # Project : godesginpattern # File : circuitbreakerbll.go */ package bll import ( "fmt" "godesginpattern/circuitbreaker/service" "time" ) // CircuitBreakerBll 业务入口封装类 type CircuitBreakerBll struct{} // InitDependencies DI依赖注入容器 func (c *CircuitBreakerBll) InitDependencies() *service.OrderService { inv := service.NewInventoryService() price := service.NewPriceService() orderSvc := service.NewOrderService(inv, price) return orderSvc } // Demo 模拟连续下单测试 func (c *CircuitBreakerBll) Demo() { fmt.Println("=== 企业级珠宝订单系统(断路器模式保护)===\n") orderSvc := c.InitDependencies() // 循环10次下单 for i := 1; i <= 10; i++ { fmt.Printf("\n====== 第 %d 次下单请求 ======\n", i) order := orderSvc.CreateGoldOrder( fmt.Sprintf("USER_%d", i), 10.0, "GOLD_999_001", ) fmt.Printf("✅ 最终订单结果:%+v\n", order) time.Sleep(1 * time.Second) } } func CircuitBreakerMain() { bll := &CircuitBreakerBll{} bll.Demo() }

输出:

相关新闻

  • Unity Mod Manager:告别手动安装烦恼,开启游戏模组管理新时代
  • 如何快速清理重复图片:专业级存储优化工具实战指南
  • DNS域名系统介绍(将域名解析成IP地址)FQDN完整域名、完全限定域名、根域、TLD顶级域名、主域名、子域名、主机名(如www)、DNS查询、递归DNS、权威DNS、TTL缓存时间、DNSSEC

最新新闻

  • 云原生技术23-GitOps进阶:从入门到生产级部署的完整指南,多环境管理:用GitOps实现Dev/Staging/Prod无缝切换
  • Res-Downloader终极指南:一键解锁全网视频音频图片资源
  • TPIC7710EVM评估板实战指南:从硬件解析到软件操作与安全测试
  • 智能自动化配置实战:5个League Akari自动秒选高级技巧深度解析
  • 9大网盘免费下载加速终极指南:告别限速的完整解决方案
  • Plex服务器安全加固指南:以WebTools.bundle为例构建隐私防线

日新闻

  • ENVI5.3.1实战:基于Landsat 8影像的区域无缝镶嵌与精准裁剪
  • 3步完成HS2-HF Patch安装:新手快速打造完美HoneySelect2体验
  • 微信好友检测终极指南:3分钟发现谁已悄悄删除你

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号