家用住宅主机Linux Sentinel流量防护熔断限流
适用场景与准备
如果你家用Linux主机上跑着个人网站或API接口,担心被恶意刷流量导致系统卡死,可以用Sentinel来做防护。
Sentinel是阿里巴巴开源的流量控制组件,支持限流、熔断和系统保护。
即使不熟悉Java,按照本文步骤也能在家用主机上快速部署并生效。
你需要提前准备好:
- 一台运行Linux(如Ubuntu 20.04+或CentOS 7+)的家用主机,并安装好Docker(
sudo apt install docker.io -y)。 - Java运行环境(JDK 8或以上),可以用
java -version检查,没有的话运行sudo apt install openjdk-11-jdk -y。 - 一个Spring Boot应用(后面会给出最简单的示例)。
第一步:用Docker启动Sentinel Dashboard
Sentinel Dashboard是图形化管理界面,用来配置限流规则和查看监控。
在家用主机上用Docker启动最省事:
# 拉取镜像(版本以官方为准,此处用1.8.6示例)
docker pull bladex/sentinel-dashboard:1.8.6
# 启动容器,映射8858端口(默认控制台端口)
docker run --name sentinel-dashboard -d -p 8858:8858 bladex/sentinel-dashboard:1.8.6
启动后通过http://你的主机IP:8858访问,默认账号密码都是sentinel。
登录后先不用操作,下一步让应用连上来。
第二步:创建一个带Sentinel客户端的Spring Boot应用
零基础用户可以直接使用官方提供的Demo,或者自己创建一个最简项目。
在Linux主机上任意目录创建pom.xml:
4.0.0
com.example
sentinel-demo
1.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.18
com.alibaba.csp
sentinel-core
1.8.6
com.alibaba.csp
sentinel-transport-simple-http
1.8.6
然后创建一个Java类DemoApp.java(放在src/main/java/com/example/DemoApp.java):
package com.example;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
public class DemoApp {
public static void main(String[] args) throws Exception {
// 配置Dashboard地址(改成你的主机IP)
System.setProperty("csp.sentinel.dashboard.server", "192.168.1.100:8858");
// 应用名,在Dashboard上会显示
System.setProperty("project.name", "home-api");
// 模拟业务——一个受保护的资源
while (true) {
try (Entry entry = SphU.entry("HelloWorld")) {
System.out.println("请求成功");
Thread.sleep(100);
} catch (BlockException ex) {
System.out.println("请求被限流/熔断");
}
}
}
}
用Maven编译并运行(如果没装Maven,可以用mvn clean package或者直接用javac编译,但建议提前装好Maven):
mvn clean package -DskipTests
java -jar target/sentinel-demo-1.0.0.jar
启动后回到Sentinel Dashboard,你应该能在左侧看到home-api应用,并且HelloWorld资源出现了。
第三步:配置限流与熔断规则
在Dashboard上点击home-api → 流控规则 → 新增流控规则。
- 资源名:
HelloWorld - 阈值类型:
QPS - 单机阈值:
5(表示每秒最多5次请求,超出就限流) - 点击
新增
同样的方式,可以配置熔断规则(熔断规则 → 新增):
- 资源名:
HelloWorld - 熔断策略:
慢调用比例(或异常比例) - 最大RT:200(毫秒)
- 比例阈值:0.5
- 最小请求数:5
- 统计时长:1000(毫秒)
- 熔断时长:10(秒)
点击新增后生效。
现在你的程序会因为每秒请求超过5次而输出“请求被限流/熔断”,说明防护已生效。
避坑指南
- 防火墙和端口:确保家用主机防火墙允许8858端口(Dashboard)和8719端口(Sentinel客户端心跳端口)的访问。运行
sudo ufw allow 8858 && sudo ufw allow 8719。 - 内存占用:Sentinel Dashboard默认使用512MB堆内存,如果家用主机内存紧张,可以用
-e JAVA_OPTS='-Xmx256m'限制Docker容器内存。 - 应用名称冲突:Dashboard上如果出现多个同名应用,检查
project.name属性是否一致。 - Dashboard连不上:先确认客户端能访问Dashboard的IP和端口,用
telnet 192.168.1.100 8858测试。
效果验证
运行Demo程序后,打开Dashboard的实时监控页面,可以看到HelloWorld的QPS曲线。
触发限流后,控制台会打印限流信息。
你也可以通过curl模拟请求来验证:
# 在另一终端不断发送请求(需要应用是Web服务,Demo是纯Java,此处仅演示)
# 实际生产环境可以访问Web接口
watch -n 0.1 curl http://your-app-url/hello
如果响应出现“Blocked by Sentinel”或类似错误,说明限流生效。
常见问题
Q:我家里没有Java应用,可以用Sentinel吗?
A:Sentinel是为Java设计的,如果你的服务不是Java写的,可以考虑用Nginx的limit_req模块或Linux的tc命令实现类似效果。但如果你未来打算用Java写接口,本文方法依然适用。
Q:Dashboard上一直看不到应用?
A:检查客户端启动参数中csp.sentinel.dashboard.server的IP和端口是否正确,以及防火墙是否放行。也可以查看客户端日志是否有SentinelTransport报错。
Q:配置了限流但不起作用?
A:确认阈值类型和统计窗口配置正确;对于QPS限流,确保请求频率超过阈值。可以用压力测试工具如ab持续发请求验证。
如果你正在处理自家Linux主机的流量防护需求,建议先按以上步骤部署Sentinel测试环境,熟悉后再应用到实际Web服务中。
遇到异常时优先检查防火墙和心跳连接。