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

推荐订阅源

Engineering at Meta
Engineering at Meta
月光博客
月光博客
WordPress大学
WordPress大学
C
Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园 - 【当耐特】
大猫的无限游戏
大猫的无限游戏
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
有赞技术团队
有赞技术团队
Microsoft Azure Blog
Microsoft Azure Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
小众软件
小众软件
H
Heimdal Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
W
WeLiveSecurity
量子位
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Fortinet All Blogs
T
Threat Research - Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
P
Privacy & Cybersecurity Law Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
NISL@THU
NISL@THU
Forbes - Security
Forbes - Security
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 热门话题
Google Online Security Blog
Google Online Security Blog
S
Security Affairs
V2EX - 技术
V2EX - 技术
TaoSecurity Blog
TaoSecurity Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
宝玉的分享
宝玉的分享
Project Zero
Project Zero
The Hacker News
The Hacker News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
PCI Perspectives
PCI Perspectives
G
GRAHAM CLULEY
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
S
Schneier on Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 聂微东

博客园 - 干炸小黄鱼

timex 处理时间戳 gorm-gen go 雪花算法 golang每日一库--协程池库ants golang每日一库--json解析库gjson python高级编程-asyncio python高级编程-condition python高级编程-event python装饰器-自动重试 EAP系统 go实现实现 SECS/GEM 协议 设备通信协议 SECS go项目使用Jenkins进行CICD go操作ES mongo db聚合查询 go如何使用mongodb Apache ShardingSphere paxos and raft (分布式一致性算法) go使用zookeeper分布式锁以及和redis差异 go使用 seata 示例 Alibaba 分布式事务 Seata go中使用saga go中使用TCC示例 分布式事务TCC k8s下部署consul and etcd Consul OR Etcd 【力扣hot100】双指针-盛水最多的容器 【力扣hot100】滑动窗口-最小覆盖子串 shell脚本合集 分布式id生成器 springboot通用CURD Python PB级检索系统架构设计 rancher 在三台机器搭建k8s集群 python ssh clinet 数据库排序Null值字段靠后/靠前 常规web项目 docker-compose 例子 手搓一个验证码 使用itertools 中的groupby 对字典数组进行分组后排序 使用开源库 geoip2 获取某ip的经纬度地理信息 python中 apscheduler.schedulers.blocking.BlockingScheduler 定时执行任务 简单的python web项目的docker-compose.yml 示例 python和sliver交互 golang sliver二次开发自定义命令(格式乱后面再调) pydantic做参数校验 基于rancher部署k8s 地理位置相关基础数据 flask migrate时报错 Can't locate revision identified by '3d80e4c025df'
熔断器 Hystrix OR Sentinel
干炸小黄鱼 · 2026-04-20 · via 博客园 - 干炸小黄鱼

Hystrix 是 Netflix 开源的一个用于处理分布式系统延迟和容错的库。它的名字来源于“豪猪”(Hystrix),象征着通过隔离和保护机制来防御系统中的故障,就像豪猪的刺一样。

它的核心目标是防止级联故障(即“雪崩效应”),通过熔断隔离降级等机制,提高系统的弹性和可用性。


🤔 Hystrix 的核心概念

Hystrix 通过以下几个核心机制来保护系统:

  1. 熔断器 (Circuit Breaker)
    这是 Hystrix 的标志性功能。它像一个电路开关,有三种状态:

    • 关闭 (Closed):正常状态。请求正常调用服务,并统计失败率。
    • 打开 (Open):当失败率达到预设阈值时,熔断器“跳闸”。所有新的请求会被立即拒绝,不再调用下游服务,而是直接执行降级逻辑。这可以防止故障服务被持续调用,给其恢复的时间。
    • 半开 (Half-Open):在熔断器打开一段时间后,会进入半开状态。此时允许少量请求尝试调用下游服务。如果请求成功,则认为服务已恢复,熔断器回到“关闭”状态;如果失败,则继续保持“打开”状态。
  2. 资源隔离 (Resource Isolation)
    Hystrix 通过舱壁模式 (Bulkhead Pattern) 将不同服务的调用隔离开。即使某个下游服务出现故障或响应缓慢,也只会耗尽分配给它的独立资源(如线程池或信号量),而不会拖垮整个应用的线程资源,从而避免“一损俱损”。

  3. 服务降级 (Fallback)
    当请求失败、超时或熔断器打开时,Hystrix 会执行预设的降级逻辑。这可以是一个默认值、一个缓存结果,或者调用一个备用服务。降级策略确保了在部分功能不可用时,系统仍能提供有限的服务能力,保证用户体验的连续性。


🛠️ 在 Go 微服务中使用 Hystrix

在 Go 语言中,我们使用 hystrix-go 这个库来实现 Hystrix 的功能。

1. 安装依赖

go get github.com/afex/hystrix-go/hystrix

2. 核心用法与配置

使用 hystrix-go 主要包含三个步骤:配置、执行命令和定义降级逻辑。

package main

import (
	"errors"
	"fmt"
	"net/http"
	"time"

	"github.com/afex/hystrix-go/hystrix"
)

func init() {
	// 1. 配置 Hystrix 命令
	hystrix.ConfigureCommand("user-service", hystrix.CommandConfig{
		// 超时时间:1000ms
		Timeout: 1000,
		// 最大并发请求数:用于限流和资源隔离
		MaxConcurrentRequests: 100,
		// 错误百分比阈值:错误率超过50%则触发熔断
		ErrorPercentThreshold: 50,
		// 请求量阈值:滑动窗口内至少有20个请求,才会计算错误率
		RequestVolumeThreshold: 20,
		// 熔断器打开后的休眠时间:5秒后进入半开状态
		SleepWindow: 5000,
	})
}

// 模拟调用下游用户服务
func callUserService(userID string) (string, error) {
	// 模拟网络请求
	time.Sleep(200 * time.Millisecond)
	if userID == "error" {
		return "", errors.New("用户服务调用失败")
	}
	return fmt.Sprintf("用户信息: %s", userID), nil
}

// 定义降级逻辑
func fallbackFunc(userID string) (string, error) {
	return "默认用户信息", nil
}

func main() {
	// 2. 使用 hystrix.Do 执行命令
	// 第一个参数是命令名,与配置对应
	// 第二个参数是具体的业务逻辑
	// 第三个参数是降级逻辑
	result, err := hystrix.Do("user-service", 
		func() error {
			_, err := callUserService("123")
			return err
		}, 
		func(err error) error {
			fmt.Printf("熔断或请求失败,执行降级逻辑: %v\n", err)
			// 这里可以调用降级函数
			_, _ = fallbackFunc("123")
			return nil // 降级成功,返回nil
		},
	)

	if err != nil {
		fmt.Printf("请求最终失败: %v\n", err)
	} else {
		fmt.Printf("请求成功: %v\n", result)
	}
}

3. 集成到 Web 框架 (以 Gin 为例)

在实际的微服务中,通常会将 Hystrix 集成到 HTTP 处理器中。

import (
	"github.com/gin-gonic/gin"
	// ... 其他 import
)

func GetUserHandler(c *gin.Context) {
	userID := c.Param("id")

	var userData string
	// 使用 hystrix.Do 包裹对下游服务的调用
	err := hystrix.Do("user-service", 
		func() error {
			var callErr error
			userData, callErr = callUserService(userID)
			return callErr
		}, 
		func(err error) error {
			// 执行降级逻辑,例如返回缓存数据或默认值
			userData = "默认用户信息"
			return nil
		},
	)

	if err != nil {
		c.JSON(http.StatusServiceUnavailable, gin.H{"error": "服务暂时不可用"})
		return
	}

	c.JSON(http.StatusOK, gin.H{"data": userData})
}

4. 关键配置参数说明

配置项 默认值 说明
Timeout 1000ms 命令执行的超时时间。
MaxConcurrentRequests - 最大并发请求数,用于限流。
ErrorPercentThreshold 50% 触发熔断的错误率百分比阈值。
RequestVolumeThreshold 20 触发熔断所需的最小请求数。
SleepWindow 5000ms 熔断器打开后,进入半开状态前的等待时间。

通过以上方式,你可以在 Go 微服务中有效地使用 Hystrix 来增强系统的容错能力和稳定性,防止因单个服务故障而导致整个系统崩溃。

Sentinel 是阿里巴巴开源的一款强大的流量控制组件,它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来维护系统的稳定性。

你可以把它看作是微服务架构中的“智能交通指挥官”,负责指挥流量,防止某个路口(服务)因为车太多(请求量过大)而发生拥堵或崩溃。

🛡️ Sentinel 的核心概念

与 Hystrix 类似,但 Sentinel 的设计更加丰富和轻量级:

  1. 流量控制 (Flow Control)

    • 原理:通过统计 QPS(每秒查询率)或线程数,当流量超过阈值时进行限制。
    • 模式:支持直接拒绝、排队等待(匀速器)、预热(Warm Up)等多种效果。
    • 场景:防止突发流量打垮数据库或服务。
  2. 熔断降级 (Circuit Breaking)

    • 原理:当检测到异常比例、响应时间过长或请求量过低时,自动切断对下游服务的调用。
    • 恢复:经过一段时间(熔断时长)后,会尝试放行少量请求探测服务是否恢复(类似 Hystrix 的半开状态)。
  3. 系统自适应保护 (System Protection)

    • 原理:这是 Sentinel 的一大特色。它不只看单个接口的指标,而是监控整个系统的 Load(CPU 负载)、入口 QPS、并发线程数等。
    • 作用:当系统整体负载过高时,自动限制入口流量,保证系统不被拖死。
  4. 热点参数限流

    • 原理:针对包含参数的资源(例如商品 ID),统计哪个参数访问最频繁(热点),并对该参数单独限流。

☸️ 如何在 Kubernetes (K8s) 中使用 Sentinel

在 K8s 环境中使用 Sentinel,通常有两种主要模式:

  1. SDK 集成模式(推荐):在你的 Go 代码中引入 Sentinel SDK,配合 Sentinel Dashboard 进行规则管理。
  2. Sidecar/Proxy 模式:利用 Envoy 等代理配合 Sentinel 适配器(较少见,通常直接用 Istio 做 Sidecar,用 Sentinel 做 SDK)。

下面重点介绍最常用的 SDK 集成 + Dashboard 部署 方案。

第一步:部署 Sentinel Dashboard (控制台)

Sentinel Dashboard 是一个 Java 应用,用于配置规则和查看监控。你需要将其部署在 K8s 中,以便统一管理规则。

1. 准备配置文件 (sentinel-deployment.yaml)

这里我们使用 StatefulSet 或 Deployment 部署 Dashboard,并暴露 Service。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sentinel-dashboard
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sentinel-dashboard
  template:
    metadata:
      labels:
        app: sentinel-dashboard
    spec:
      containers:
      - name: dashboard
        image: bladex/sentinel-dashboard:1.8.7 # 推荐使用官方或社区维护的镜像
        ports:
        - containerPort: 8858
        env:
        - name: SERVER_PORT
          value: "8858"
        # 生产环境建议修改默认账号密码
        - name: SENTINEL_DASHBOARD_AUTH_USERNAME
          value: "admin"
        - name: SENTINEL_DASHBOARD_AUTH_PASSWORD
          value: "your_secure_password"
---
apiVersion: v1
kind: Service
metadata:
  name: sentinel-dashboard
  namespace: default
spec:
  type: ClusterIP # 内部访问即可
  ports:
  - port: 8858
    targetPort: 8858
  selector:
    app: sentinel-dashboard

2. 执行部署

kubectl apply -f sentinel-deployment.yaml

部署完成后,你可以通过端口转发访问 Dashboard:kubectl port-forward svc/sentinel-dashboard 8858:8858,然后在浏览器访问 localhost:8858

第二步:Go 微服务集成 Sentinel

在 Go 语言中,我们使用 alibaba/sentinel-golang 库。

1. 安装依赖

go get github.com/alibaba/sentinel-golang

2. 初始化与配置
你需要配置 Sentinel 客户端,使其连接到 K8s 中的 Dashboard 以拉取规则。

package main

import (
	"fmt"
	"log"
	"time"

	sentinel "github.com/alibaba/sentinel-golang/api"
	"github.com/alibaba/sentinel-golang/core/config"
	"github.com/alibaba/sentinel-golang/logging"
)

func main() {
	// 1. 初始化 Sentinel
	err := sentinel.InitDefault()
	if err != nil {
		log.Fatalf("Unexpected error: %+v", err)
	}

	// 2. 动态规则数据源配置 (连接 Dashboard)
	// 注意:Sentinel Go 客户端目前主要通过文件数据源或自定义数据源同步规则
	// 如果要实现推模式,通常需要自己写一个 DataStore 监听 Nacos/Etcd/Zookeeper
	// 或者使用 Dashboard 推送功能(Dashboard 端需改造或使用 Nacos 持久化)
	
	// 这里演示最简单的本地限流逻辑
	entry, b := sentinel.Entry("HelloWorld", sentinel.WithTrafficShaping(
		sentinel.NewQpsRule(10), // 限制 QPS 为 10
	))
	if b != nil {
		// 被限流了
		fmt.Println("Blocked!")
	} else {
		defer entry.Exit()
		fmt.Println("Passed!")
	}
}

关于持久化与规则同步的重要说明
原生的 Sentinel Dashboard 是无状态的,重启后规则会丢失。在生产环境 K8s 中,通常的做法是:

  1. Dashboard + Nacos/Etcd:将 Sentinel 的规则持久化到 Nacos 或 Etcd 中。
  2. 流程:你在 Dashboard 配置规则 -> Dashboard 推送到 Nacos -> Go 应用监听 Nacos 变化 -> 实时更新限流规则。

第三步:高级用法 - 结合 K8s Ingress 或 Gateway

除了代码层面的限流,你还可以在 K8s 的网络入口层使用 Sentinel。

  • Sentinel API Gateway Adapter:如果你使用 Spring Cloud Gateway 或 Zuul,Sentinel 有现成的适配器。
  • Envoy + Sentinel:虽然 Istio 默认使用 Envoy 的限流,但你也可以配置 Envoy 调用外部 Sentinel 服务进行限流判断(External Authorization),但这属于较复杂的架构,一般业务场景直接使用 Go SDK 集成 即可满足需求。

📌 总结

在 K8s 中使用 Sentinel 的最佳实践路径:

  1. 部署 Dashboard:在集群内运行 Sentinel Dashboard,用于可视化配置。
  2. 代码埋点:在 Go 代码的关键函数处使用 sentinel.Entry()entry.Exit() 进行埋点。
  3. 规则持久化:搭建 Nacos/Etcd 作为配置中心,让 Dashboard 和 Go 应用都连接它,确保 Pod 重启后限流规则依然存在。
  4. 监控告警:利用 Sentinel 提供的指标,结合 Prometheus + Grafana 监控系统负载和限流情况。