Nginx-Swagger-Sentinel微服务保护重点总结

Nginx · Swagger · Sentinel 微服务保护 · 重点总结

整理自:nginx.md + swagger.md + sentinel.md + nginx-swagger-sentinel.xmind


第一部分:Nginx

一、Nginx 概述

1.1 核心概念

项目 说明
定义 C 语言开发的高性能 HTTP 服务器 + 反向代理服务器
作者 俄罗斯程序设计师 Igor Sysoev
性能 官方测试可支撑 5 万并发连接,CPU/内存消耗低,运行稳定

1.2 三大应用场景

场景 说明
HTTP 服务器 部署前端静态项目(网页、CSS、JS、图片)
反向代理 隐藏真实服务端,客户端不知道实际谁提供服务
负载均衡 多服务器集群,平均分担压力

二、Nginx 安装与命令

2.1 Windows 安装

解压即安装,目录不能有中文

2.2 常用命令

命令 作用
start nginx 启动
nginx -t 检查配置文件语法错误
nginx -s reload 刷新配置(有时不生效,建议重启)
nginx -s stop 停止 Nginx

三、正向代理 vs 反向代理(⭐ 常考)

3.1 概念对比表

对比项 正向代理 反向代理
代理对象 代理客户端 代理服务端
隐藏方 隐藏真实客户端 隐藏真实服务端
服务端是否知道客户端 ❌ 不知道 ✅ 知道(代理转发后)
客户端是否知道服务端 ✅ 知道 ❌ 不知道
典型例子 翻墙、VPN Nginx 后挂多台 Tomcat

3.2 通俗理解(借钱故事)

场景 解释
正向代理 A 想找 C 借钱,C 不认识 A → A 通过 B 向 C 借钱(B 隐藏了 A)
反向代理 A 找 C 借钱,C 借给了 A,但钱实际是 C 从 B 那里借的(A 不知道真实出资方)

四、Nginx 配置文件 nginx.conf

4.1 主要结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
worker_processes 1;   # 工作进程数

events {
worker_connections 1024; # 每个进程最大连接数
}

http {
# 反向代理 + 负载均衡配置
upstream myserver {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}

server {
listen 80;
server_name localhost;

# 静态资源
location / {
root html;
index index.html;
}

# 反向代理
location /api/ {
proxy_pass http://myserver;
}
}
}

4.2 三种核心场景配置

场景①:作为 Web 服务器部署静态项目

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name localhost;

location / {
root html; # 静态资源目录
index index.html;
}
}

场景②:反向代理

1
2
3
4
5
6
server {
listen 80;
location / {
proxy_pass http://www.baidu.com; # 反向代理到后端
}
}

场景③:负载均衡

1
2
3
4
5
6
7
8
9
10
11
upstream myserver {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}

server {
listen 80;
location / {
proxy_pass http://myserver; # 转到 upstream 集群
}
}

4.3 三种负载均衡策略(⭐ 常考)

策略 配置 说明
轮询(默认) 不需额外配置 请求按顺序分配到各服务器
权重 server x.x.x.x weight=5; 配置高的服务器分配更多请求
ip_hash ip_hash; 同一 IP 固定访问同一服务器,解决 session 问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 轮询(默认)
upstream myserver {
server 192.168.1.10;
server 192.168.1.11;
}

# 权重
upstream myserver {
server 192.168.1.10 weight=5; # 5/8 流量
server 192.168.1.11 weight=3; # 3/8 流量
}

# IP Hash(保持会话)
upstream myserver {
ip_hash;
server 192.168.1.10;
server 192.168.1.11;
}

第二部分:Swagger

一、Swagger 概述

1.1 核心概念

项目 说明
作用 自动生成在线接口文档,方便前后端联调
优势 接口文档与代码同步更新,不会过时
本质 通过扫描注解,自动生成可视化 API 文档界面

二、Swagger 集成步骤(SpringDoc OpenAPI)

2.1 四步集成

步骤 操作
① 引入依赖 springdoc-openapi-starter-webmvc-ui
② 编写配置类 创建 OpenAPI Bean 配置文档信息
③ 配置 yml 启用 swagger-ui + 指定扫描包
④ 加注解 类/方法/参数上加 swagger 注解

2.2 引入依赖

1
2
3
4
5
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.5.0</version>
</dependency>

2.3 配置类

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.info(new Info()
.title("xx服务接口文档")
.description("shop-goods-service 接口文档")
.version("v1.0.0")
);
}
}

2.4 yml 配置

1
2
3
4
5
6
7
8
springdoc:
api-docs:
enabled: true
path: /v3/api-docs
swagger-ui:
enabled: true
path: /swagger-ui.html
packages-to-scan: com.cjc.controller # 改成自己的 Controller 包名

2.5 常用注解

注解 位置 作用
@Tag(name="...") 类上 给 Controller 分组(如”品牌管理”)
@Operation(summary="..", description="..") 方法上 描述接口
@Parameter 方法参数 描述参数
@Schema 实体类属性 描述字段
1
2
3
4
5
6
7
8
9
10
11
@Tag(name = "品牌管理")
@RestController
@RequestMapping("/brand")
public class BrandController {

@Operation(summary = "保存操作", description = "保存品牌信息")
@PostMapping
public Result save(@RequestBody Brand brand) {
return Result.success();
}
}

2.6 访问地址

1
http://localhost:8081/swagger-ui.html

第三部分:Sentinel 微服务保护

一、雪崩问题

1.1 雪崩定义

微服务相互调用,调用链中某个服务故障,引起整个链路都无法访问的级联失败。

1.2 雪崩形成过程

1
2
3
4
5
服务 I 故障 → 依赖 I 的业务被阻塞 → 用户线程不释放

越来越多的请求阻塞 → 服务器线程耗尽 → 当前服务也不可用

依赖当前服务的其他服务也变得不可用 → 级联失败 → 雪崩

1.3 四大解决方案(⭐ 必记)

方案 思路 性质
超时处理 设定超时时间,超时返回错误信息 补救
仓壁模式(线程隔离) 每个业务限定线程数,避免耗尽 tomcat 资源 补救
熔断降级(断路器) 统计异常比例,超阈值则熔断,拦截所有请求 补救
限流 限制业务的 QPS,削峰填谷 预防

总结:限流是预防措施;超时/隔离/熔断是补救措施。


二、Sentinel 介绍

2.1 概念

项目 说明
来源 阿里巴巴开源的微服务流量控制组件
官网 https://sentinelguard.io/zh-cn/index.html
特性 丰富应用场景、完备实时监控、广泛开源生态
对比 早期 Netfix Hystrix;目前国内主流是 Sentinel

2.2 安装与启动

1
2
3
4
5
# 启动 Dashboard 控制台
java -jar sentinel-dashboard-1.8.8.jar

# 修改端口
java -Dserver.port=8888 -jar sentinel-dashboard-1.8.8.jar
配置项 默认值
server.port 8080
sentinel.dashboard.auth.username sentinel
sentinel.dashboard.auth.password sentinel

2.3 微服务整合 Sentinel

1
2
3
4
5
<!-- 引入依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
1
2
3
4
5
6
7
8
# 配置控制台地址
server:
port: 8088
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8888

2.4 簇点链路

簇点链路:请求进入微服务,依次访问 DispatcherServlet → Controller → Service → Mapper 的调用链。

Sentinel 默认监控 SpringMVC 的每一个 Controller 方法(端点)作为一个资源

2.5 四种规则按钮

按钮 作用
流控 流量控制(限流)
降级 降级熔断
热点 热点参数限流
授权 请求权限控制

三、流量控制(限流)

3.1 三种流控模式(⭐)

模式 说明 应用场景
直接 统计当前资源,超阈值直接限流(默认) 普通限流
关联 统计另一相关资源,超阈值时限流当前资源 优先保护高优先级业务(如优先支付,限流查询)
链路 只统计从指定链路进入本资源的请求 区分不同来源的请求做差异限流

3.2 关联模式示例

/update 触发阈值时,对 /query 限流。

1
2
3
4
5
6
7
配置:
资源名 = /query
阈值类型 = QPS,阈值 = 5
流控模式 = 关联
关联资源 = /update

效果:当 /update 的 QPS > 5 时,/query 请求被限流

3.3 链路模式示例

区分 /test1 → /common/test2 → /common,只统计从 /test2 进入的。

1
2
3
4
5
// 给 OrderService 的方法加 @SentinelResource 标记
@SentinelResource("goods")
public void queryGoods() {
System.err.println("查询商品");
}
1
2
3
4
5
# 链路模式必须配置(关闭 context 整合)
spring:
cloud:
sentinel:
web-context-unify: false

3.4 三种流控效果(⭐)

效果 说明 适用
快速失败(默认) 达到阈值直接拒绝并抛 FlowException 一般场景
warm up(预热) 阈值从 maxThreshold/coldFactor 逐渐增到 maxThreshold 服务冷启动保护
排队等待 请求进入队列按间隔执行,超过 timeout 拒绝 削峰填谷,平滑流量

3.5 warm up 计算

1
2
3
4
5
6
maxThreshold = 10
coldFactor = 3(默认)
预热时长 = 5 秒

初始阈值 = 10 / 3 = 3
然后 5 秒内逐渐增长到 10

3.6 排队等待计算

1
2
3
4
5
QPS     = 5  → 每 200ms 处理一个请求
timeout = 2000ms

第 6 个请求的预期等待 = 200 × (6-1) = 1000ms → 允许执行
第 12 个请求的预期等待 = 200 × (12-1) = 2200ms → 超时拒绝

四、线程隔离(舱壁模式)

4.1 概念

调用者给每个被调用服务分配独立线程池,故障时最多消耗该线程池资源,避免耗尽调用方所有资源

4.2 两种实现方式

方式 说明 Sentinel
线程池隔离 每个服务一个线程池 Hystrix 默认
信号量隔离(默认) 计数器模式,记录线程数,达上限禁止新请求 Sentinel 默认

4.3 两者对比

对比项 信号量隔离 线程池隔离
实现 计数器 线程池
开销 大(额外线程开销)
隔离强度
适用 简单业务 复杂业务

4.4 阈值类型

阈值类型 说明
QPS 每秒请求数
线程数 该资源能使用的最大 tomcat 线程数(线程隔离

五、熔断降级

5.1 概念

断路器统计服务调用的异常比例/慢请求比例,超阈值则熔断该服务(拒绝所有访问),服务恢复后再放行。

5.2 断路器状态机(⭐ 必记)

状态 说明
closed(关闭) 放行所有请求,统计异常比例。超阈值切换到 open
open(打开) 熔断,所有请求快速失败走降级。5 秒后进入 half-open
half-open(半开) 放行一次请求测试,成功→closed,失败→open
1
2
3
4
5
[closed]  → 异常超阈值 →  [open]  →  5秒后  →  [half-open]
↑ ↓
└──────────── 测试请求成功 ←─────────────────────┘

└──────────── 测试请求失败 → 回到 open

5.3 三种熔断策略(⭐)

策略 说明 适用
慢调用比例 RT > 阈值时长的调用占比超过比例则熔断 超时严重的服务
异常比例 异常请求占比超过比例则熔断 错误率高的服务
异常数 异常请求数量超过阈值则熔断 错误次数敏感的服务

5.4 熔断配置示例

慢调用:

1
2
3
4
5
6
RT 阈值       = 500ms
统计时长 = 10000ms
最小请求数 = 10
慢调用比例 = 0.5
熔断时长 = 5s
→ 10秒内请求超10次,慢调用占比 > 0.5 时熔断

异常比例:

1
2
3
4
5
统计时长   = 1000ms
最小请求数 = 10
异常比例 = 0.4
熔断时长 = 5s
→ 1秒内请求超10次,异常占比 > 0.4 时熔断

六、Feign 整合 Sentinel(实现客户端保护)

6.1 整合三步

步骤 操作
① 开启支持 application.ymlfeign.sentinel.enabled: true
② 编写降级类 实现 FallbackFactory<API>
③ 配置到 FeignClient @FeignClient(fallbackFactory = Xxx.class)

6.2 完整代码示例

1
2
3
4
# 开启 feign 对 sentinel 的支持
feign:
sentinel:
enabled: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 1. 编写降级工厂类(推荐 FallbackFactory,可处理异常)
@Slf4j
public class SellerFallback implements FallbackFactory<SellerAPI> {
@Override
public SellerAPI create(Throwable cause) {
return new SellerAPI() {
@Override
public TbSeller selectAdminByName(String userName) {
log.error("查询商户异常", cause);
return new TbSeller(); // 返回友好降级值
}
};
}
}

// 2. 注册为 Bean
@Configuration
public class FallbackConfig {
@Bean
public SellerFallback sellerFallback() {
return new SellerFallback();
}
}

// 3. FeignClient 接口指定 fallbackFactory
@FeignClient(value = "dd-seller-service", fallbackFactory = SellerFallback.class)
public interface SellerAPI {
@GetMapping("/seller/selectSellerByName")
TbSeller selectAdminByName(@RequestParam String userName);
}

6.3 两种降级方式对比

方式 说明 推荐
FallbackClass 直接实现 FeignClient 接口 ❌ 无法获取异常信息
FallbackFactory 工厂模式,可在 create() 中拿到 Throwable 推荐

七、综合速查

雪崩四大解决方案口诀

1
2
预防  → 限流(QPS 控制,削峰填谷)
补救 → 超时 + 仓壁 + 熔断

Sentinel 核心功能

1
2
3
4
流控(流量控制)   → 直接 / 关联 / 链路
流控效果 → 快速失败 / warm up / 排队等待
线程隔离 → 信号量(默认)/ 线程池
熔断降级 → 慢调用比例 / 异常比例 / 异常数

断路器状态切换图

1
2
3
4
closed ───异常超阈值───→ open ──5秒──→ half-open
↑ │
│←─────测试成功──────────────────────────┤
└─────测试失败─────────────→ open │

Nginx 三大场景速记

1
2
3
静态托管  → location / { root html; }
反向代理 → proxy_pass http://后端;
负载均衡 → upstream + proxy_pass http://upstream名;

负载均衡策略选型

1
2
3
轮询       → 默认,无差别分发
权重 → 服务器性能不一致时
ip_hash → 需要保持 session(同一 IP 固定后端)

Swagger 集成四步

1
2
3
4
① 引依赖 → springdoc-openapi-starter-webmvc-ui
② 写配置类 → OpenAPI Bean
③ yml 配置 → 启用 + 扫描包
④ 加注解 → @Tag / @Operation

Feign + Sentinel 三步集成

1
2
3
① feign.sentinel.enabled: true
② 实现 FallbackFactory + 注册为 Bean
③ FeignClient 指定 fallbackFactory