说明
限流
限流是控制系统的的并发流量,通过限制请求流量的手段防止过度的流量导致系统崩溃。限流的指标有TPS, HPS、QPS等,限流的方法有流量计数器,滑动时间窗口,漏桶算法,令牌桶算法等。
熔断
熔断的概念来自电路保护,提供了断路开关,主要有三种状态,关闭状态,打开状态和半开状态。熔断可以防止应用程序不断地尝试可能超时和失败的服务,能达到应用程序执行而不必等待下游服务修正错误服务。
降级
降级是指当自身服务压力增大时,采取一些手段,增强自身服务的处理能力,以保障服务的持续可用。比如,下线非核心服务以保证核心服务的稳定、降低实时性、降低数据一致性等。
三者关系
限流、熔断和服务降级是系统容错的重要设计模式,从一定意义上讲限流和熔断也是一种服务降级的手段。
| 措施 |
产生原因 |
针对服务 |
| 熔断 |
下游服务不可用 |
下游服务 |
| 降级 |
自身服务的处理能力不够 |
自身服务 |
| 限流 |
上游服务请求增多 |
上游服务 |
Sentinel
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
之前使用的是Spring Cloud 默认带的是 Hystrix,之前也没有用过Sentinel,这次按理是尝试使用Setinel。
依赖
1 2 3 4 5 6 7 8 9 10 11 12 13
| dependencies { implementation platform(project(":demo-parent"))
implementation("org.noear:solon-web") implementation("org.noear:solon-logging-logback") implementation("org.noear:solon-openapi2-knife4j") implementation("org.noear:sentinel-solon-cloud-plugin") implementation("com.alibaba.csp:sentinel-transport-simple-http:1.8.8")
annotationProcessor("org.mapstruct:mapstruct-processor:${mapstructVersion}")
testImplementation("org.noear:solon-test-junit5") }
|
配置
1 2 3 4
| solon.cloud.local: breaker: root: 1000 hello: 10
|
Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.example.demo.solon.controller;
import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.noear.solon.annotation.Controller; import org.noear.solon.annotation.Mapping; import org.noear.solon.annotation.Param; import org.noear.solon.cloud.annotation.CloudBreaker;
@Api("Demo") @Controller @Mapping public class DemoController { @ApiOperation("hello") @Mapping("/hello") @CloudBreaker("hello") public String hello(@Param(defaultValue = "world") String name) { return String.format("Hello %s!", name); } }
|
验证
需要通过多线程的方式来测试,写个单元测试。
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 31 32 33 34 35 36 37
| package com.example.demo.solon.controller;
import static org.junit.jupiter.api.Assertions.*;
import com.example.demo.solon.DemoCloudBreakerApp; import java.util.concurrent.CountDownLatch; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.noear.solon.Utils; import org.noear.solon.test.HttpTester; import org.noear.solon.test.SolonTest;
@Slf4j @SolonTest(DemoCloudBreakerApp.class) public class DemoControllerTest extends HttpTester { @Test public void test() throws Exception { CountDownLatch count = new CountDownLatch(100); for (int i = 0; i < 100; i++) { log.info("get hello start. i:{}", i); int finalI = i; Utils.async( () -> { try { path("/hello").get(); } catch (Exception e) { log.error("", e); }
log.info("get hello end. i:{}", finalI); count.countDown(); }); }
count.await(); } }
|
当超过限流时,提示错误。

问题
- 当前使用的版本3.0.9及 3.1.0-M3版本暂时不能把 CloudBreaker 注解在类上。
- 当前版本无法注册到 sentinel 的 dashboard 中,属于本地配置。
- 当前支持限流,没有熔断的支持。
小结
从测试使用的情况来看,Solon 目前只支持本地的限流处理,暂时不支持熔断,对 sentinel 的支持还不够完善,无法注册到 sentinel 的 dashboard 中。如果需要用于生产,需要自己扩展下对应的插件,或者再等一等官方的更新。