说明
限流
限流是控制系统的的并发流量,通过限制请求流量的手段防止过度的流量导致系统崩溃。限流的指标有TPS, HPS、QPS等,限流的方法有流量计数器,滑动时间窗口,漏桶算法,令牌桶算法等。
熔断
熔断的概念来自电路保护,提供了断路开关,主要有三种状态,关闭状态,打开状态和半开状态。熔断可以防止应用程序不断地尝试可能超时和失败的服务,能达到应用程序执行而不必等待下游服务修正错误服务。
降级
降级是指当自身服务压力增大时,采取一些手段,增强自身服务的处理能力,以保障服务的持续可用。比如,下线非核心服务以保证核心服务的稳定、降低实时性、降低数据一致性等。
三者关系
限流、熔断和服务降级是系统容错的重要设计模式,从一定意义上讲限流和熔断也是一种服务降级的手段。
措施 | 产生原因 | 针对服务 |
---|---|---|
熔断 | 下游服务不可用 | 下游服务 |
降级 | 自身服务的处理能力不够 | 自身服务 |
限流 | 上游服务请求增多 | 上游服务 |
Sentinel
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
之前使用的是Spring Cloud 默认带的是 Hystrix,之前也没有用过Sentinel,这次按理是尝试使用Setinel。
依赖
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")
}
配置
solon.cloud.local:
breaker:
root: 1000
hello: 10
Controller
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;
/**
* @author airhead
*/
@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);
}
}
验证
需要通过多线程的方式来测试,写个单元测试。
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 中。如果需要用于生产,需要自己扩展下对应的插件,或者再等一等官方的更新。