Fork me on GitHub

Spring Cloud Alibaba系列教程-05-Sentinel入门与整合

TIPS

本文基于:

  • Spring Boot 2.1.5
  • Spring Cloud Greenwich.SR1
  • Spring Cloud Alibaba 0.9.0
  • Nacos 1.0.0

Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

简单来说,Sentinel是一个轻量级的流量控制、熔断降级 Java 库。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

入门

  • 加依赖:

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>0.2.1.RELEASE</version>
    </dependency>
  • 写配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    server:
    port: 8010
    spring:
    application:
    # 指定注册到nacos server上的服务名称
    name: microservice-consumer-movie
    cloud:
    nacos:
    discovery:
    server-addr: 127.0.0.1:8848
    management:
    endpoints:
    web:
    exposure:
    include: '*'
  • 测试Controller:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @RequestMapping("/movies")
    @RestController
    public class MovieController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/users/{id}")
    public User findById(@PathVariable Long id) {
    // 这里用到了RestTemplate的占位符能力
    User user = this.restTemplate.getForObject(
    "http://microservice-provider-user/users/{id}",
    User.class,
    id
    );
    // ...电影微服务的业务...
    return user;
    }
    }

    由代码可知,这一个普通得不能再普通的Controller!由于Sentinel starter默认情况下就会为所有的 HTTP服务提供限流埋点,所以该Controller可以受到Sentinel保护(但现在还没有配置保护的规则,所以暂时还没有被保护)!

测试

  • 访问 http://localhost:8010/actuator/sentinel ,可获得类似如下的结果:

    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
    {
    "DegradeRules": [],
    "datasources": {},
    "ParamFlowRule": [],
    "SystemRules": [],
    "FlowRules": [],
    "properties": {
    "eager": false,
    "enabled": true,
    "datasource": {},
    "transport": {
    "port": "8719",
    "dashboard": "localhost:8080",
    "heartbeatIntervalMs": null
    },
    "metric": {
    "fileSingleSize": null,
    "fileTotalCount": null,
    "charset": "UTF-8"
    },
    "servlet": {
    "blockPage": null
    },
    "filter": {
    "order": -2147483648,
    "urlPatterns": ["/*"]
    },
    "flow": {
    "coldFactor": "3"
    },
    "log": {
    "dir": null,
    "switchPid": false
    }
    }
    }

    目前,我们还不知道 /actuator/sentinel 暴露出来的结果是什么含义,没有关系,请继续阅读下去。

总结

只需为应用添加 spring-cloud-starter-alibaba-sentinel 依赖,所有的HTTP接口都能获得Sentinel保护!当然,目前我们还没有为Sentinel配置保护的规则。

配套代码

GitHub

Gitee

相关文章

评论系统未开启,无法评论!