CrazyAirhead

疯狂的傻瓜,傻瓜也疯狂——傻方能执著,疯狂才专注!

0%

Solon Cloud —— 熔断与限流

说明

限流

限流是控制系统的的并发流量,通过限制请求流量的手段防止过度的流量导致系统崩溃。限流的指标有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;

/**
* @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);
}
}

验证

需要通过多线程的方式来测试,写个单元测试。

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();
}
}

当超过限流时,提示错误。

img

问题

  1. 当前使用的版本3.0.9及 3.1.0-M3版本暂时不能把 CloudBreaker 注解在类上。
  2. 当前版本无法注册到 sentinel 的 dashboard 中,属于本地配置。
  3. 当前支持限流,没有熔断的支持。

小结

从测试使用的情况来看,Solon 目前只支持本地的限流处理,暂时不支持熔断,对 sentinel 的支持还不够完善,无法注册到 sentinel 的 dashboard 中。如果需要用于生产,需要自己扩展下对应的插件,或者再等一等官方的更新。

欢迎关注我的其它发布渠道