微服务-数据库
学习内容
微服务架构下使用数据库的最佳实践。 包括数据库部署、数据迁移、数据备份策略等方面。 推荐阅读资料:Seata微服务架构下数据分布式事务和一致性
微服务-监控与日志
学习内容
如何使用容器构建环境、实现安全性和可扩展性。 推荐阅读资料:Prometheus监控及Grafana可视化;(2)ELK日志收集系统;
微服务-网关
学习内容
APIGateWay,Zuul 推荐阅读资料:(1)深度剖析Spring Cloud 源码与实战;(2)深入浅出JHipster
微服务-服务治理
学习内容
服务的注册,发现。服务网关,负载均衡,熔断,限流,链路追踪 推荐资料:Spring Cloud微服务架构开发权威指南
微服务-限流
限流的定义
指定应用服务器的请求频次,用以防止因请求数量过大,而导致服务宕机。
限流的算法
固定窗体|计数器算法
系统维护一个计数器,记录单位时间内请求的次数,当请求次数大于设定的阈值时,拒绝请求。
滑动窗口
滑动时间窗口算法是将请求量限制在一个滑动的时间窗口内,滑动窗口的长度可以动态调整。相对于固定时间窗口算法,滑动时间窗口算法可以更灵活地适应流量的变化。
漏斗算法
请求按照一定的速率进行处理。当请求的输入量大于消费请求的速率,导致漏斗的容量满载时,开启拒绝策略。
令牌桶算法
令牌桶算法是将请求按照一定速率发放令牌,当请求到达时,只有当有可用令牌时才能继续处理,否则将被拒绝或者延迟处理。相对于固定时间窗口算法和滑动时间窗口算法,令牌桶算法能够更加平滑地控制流量。
限流实现的方式
配置级
nginx 中配置限流
- limit_conn_zone 模块 - 限制同一IP地址并发连接数。
http{
# 针对客户端地址,进行连接数限制
limit_conn_zone $binary_remote_addr zone=perip:10m;
# 针对域名,进行连接数限制
limit_conn_zone $server_name zone=perserver:10m;
limit_conn_log_level error;
limit_conn_status 503;
server {
# 每个IP仅允许发起10个连接
limit_conn perip 10;
# 每个域名仅允许发起100个连接
limit_conn perserver 100;
}
}
-
limit_request 模块 - 限制同一 IP 某段时间的访问量。 请求速率的限制
01 http { 02 limit_req_zone$binary_remote_addr zone=mylimit:10m rate=10r/s; 03 04 server { 05 location /test/ { 06 limit_reqzone=mylimit; 07 08 proxy_pass http://api; 09 } 10 } 11 }配置说明
- 第02 行声明限制请求域
- 1.1, binary_remote_addr 客户端的IP 的二进制表示
- 1.2, zone 限制域名称为myLimit 设定内存大小为10m。依据经验 1m 可存储16000 个IP,则10M 可存储160000个客户端IP
- 1.3, rate= 10r/s 对于任意的客户端IP 限制其请求速率为 每秒10次请求
- 第 06 行应用02 行定义的限流策略,应用于具体的请求 http://api
- 在限流策略中也可按需配置峰值
limit_reqzone=mylimit burst=20在06行追加关键字 burst 配置其请求峰值
-
core 模块提供 - limit_rate 限制同一 IP 流量。
并发链接数的限制