惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
博客园 - 【当耐特】
NISL@THU
NISL@THU
IT之家
IT之家
博客园 - 叶小钗
M
MIT News - Artificial intelligence
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
量子位
The Register - Security
The Register - Security
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security Affairs
W
WeLiveSecurity
S
Security @ Cisco Blogs
Apple Machine Learning Research
Apple Machine Learning Research
V2EX - 技术
V2EX - 技术
The Last Watchdog
The Last Watchdog
Blog — PlanetScale
Blog — PlanetScale
美团技术团队
J
Java Code Geeks
P
Proofpoint News Feed
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Last Week in AI
Last Week in AI
腾讯CDC
Cisco Talos Blog
Cisco Talos Blog
C
Check Point Blog
人人都是产品经理
人人都是产品经理
Forbes - Security
Forbes - Security
SecWiki News
SecWiki News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog
S
Secure Thoughts
T
Threat Research - Cisco Blogs
P
Privacy & Cybersecurity Law Blog
N
News | PayPal Newsroom
The GitHub Blog
The GitHub Blog
Recorded Future
Recorded Future
Google DeepMind News
Google DeepMind News
博客园 - 聂微东
V
Visual Studio Blog
L
LINUX DO - 最新话题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
O
OpenAI News
Webroot Blog
Webroot Blog
Hacker News: Ask HN
Hacker News: Ask HN

博客园 - ®Geovin Du Dream Park™

go: Functional Options Pattern go:Timing Functions Pattern python: Timing Functions Pattern go: Steady-State Pattern python: Steady-State Pattern go: Handshaking Pattern python: Handshaking Pattern go: Fail-Fast Pattern python: Fail-Fast Pattern I go: Deadline Pattern python: Deadline Pattern python: Circuit-Breaker Pattern go: Bulkheads Pattern python: Bulkheads Pattern go: Push & Pull Pattern python: Push & Pull Pattern python: Publish/Subscribe Pattern II go: Publish/Subscribe Pattern python: Publish/Subscribe Pattern go: Futures & Promises Pattern python: Futures & Promises Pattern go: Worker Pool Pattern go:Pipeline Pattern python: Worker Pool Pattern python: Pipeline Pattern go: Fan-Out Pattern python: Fan-Out Pattern go: Fan-In Pattern python: Fan-In Pattern Fan-In go: Producer Consumer  Pattern python: Producer Consumer Pattern go: Parallelism Pattern python: Parallelism Pattern go: Reactor Pattern python: Reactor Pattern go: Generators Pattern python: speech to text offline python: Generators Pattern go: Coroutines Pattern python:Coroutines Pattern go: Broadcast Pattern python: Broadcast Pattern python: Bounded Parallelism Pattern go: Bounded Parallelism Pattern python: N-Barrier Pattern go: N-Barrier Pattern python: Semaphore Pattern go: Semaphore Pattern python: Read-Write Lock Pattern go: Read-Write Lock Pattern python: Monitor Pattern go: Monitor Pattern python: Mutex Pattern go: Lock/Mutex Pattern Python: Condition Variable Pattern go:Condition Variable Pattern python: Registry Pattern python: Interpreter Pattern go: Interpreter Pattern go: Registry Pattern go: Memento Pattern go: Command Pattern go: State Pattern go:Template Method Pattern go: Strategy Pattern go: Visitor Pattern go: Observer Pattern go: Mediator Pattern go: Iterator Pattern go: Chain of Responsibility Pattern go: Proxy Pattern go:Decorator Pattern go: Facade Pattern go: Flyweight Pattern go: Composite Pattern go: Singleton Pattern go: Prototype Pattern go: Bridge Pattern go: Adapter Pattern go: Builder Pattern 密码进行加盐哈希 using CSharp,Python,Go,Java go: Abstract Factory Pattern go: Model,Interface,DAL ,Factory,BLL using mysql go: Simple Factory Pattern go: Factory Method Pattern go: goLang 在Windows环境搭建Go语言开发环境 CSharp: Parallel Extensions cpp: class python: 蝴蝶跟随鼠标 javascript: 中国历史人物热力分布图using echart javascript: 中国历史人物热力图 python: 初养龙虾微信纯文字自动回复using workBuddy python: object 入门 python: Factory Method Pattern python: Simple Factory Pattern python: Abstract Factory Pattern 区域化 代码 python: Null Object Pattern python: Builder Pattern python: Adapter Pattern
go: Circuit-Breaker Pattern
®Geovin Du Dream Park™ · 2026-06-28 · via 博客园 - ®Geovin Du Dream Park™

项目结构:

image

断路器模式是稳定性设计模式的核心之一,核心作用:当依赖服务持续失败时,自动切断请求调用,避免级联故障、耗尽系统资源,保护核心业务流程。
它有 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()
}

输出:

52447260b75f995f72e4fb5b650d5ba2

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)