当前位置:   article > 正文

Spring Boot集成sentinel快速入门Demo

Spring Boot集成sentinel快速入门Demo

1.什么是sentinel

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

Sentinel 基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。 只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

Sentinel 的使用可以分为两个部分:

  • 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)。
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

2.sentinel-dashboard搭建

下载地址

  • https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar

运行dashboard

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

访问http://127.0.0.1:8080,默认用户名和密码都是 sentinel。

3.代码工程

实验目标

利用Sentinel实现接口流量控制

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springboot-demo</artifactId>
  7. <groupId>com.et</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>sentinel</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-autoconfigure</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-test</artifactId>
  28. <scope>test</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>com.alibaba.csp</groupId>
  32. <artifactId>sentinel-transport-simple-http</artifactId>
  33. <version>1.8.6</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>com.alibaba.csp</groupId>
  37. <artifactId>sentinel-annotation-aspectj</artifactId>
  38. <version>1.8.6</version>
  39. </dependency>
  40. </dependencies>
  41. <build>
  42. <plugins>
  43. <plugin>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-maven-plugin</artifactId>
  46. </plugin>
  47. </plugins>
  48. </build>
  49. </project>

controller

  1. package com.et.sentinel.controller;
  2. import com.alibaba.csp.sentinel.slots.block.BlockException;
  3. import com.et.sentinel.service.TestService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. @RestController
  10. public class HelloWorldController {
  11. @Autowired
  12. TestService testService;
  13. @RequestMapping("/hello")
  14. public Map<String, Object> showHelloWorld() {
  15. Map<String, Object> map = new HashMap<>();
  16. try {
  17. map.put("msg", testService.sayHello("harries"));
  18. }catch (Exception e){
  19. System.out.println("sayHello blocked!");
  20. }
  21. return map;
  22. }
  23. }

service

使用资源(HelloWorld)

  1. package com.et.sentinel.service;
  2. import com.alibaba.csp.sentinel.annotation.SentinelResource;
  3. import org.springframework.stereotype.Service;
  4. @Service
  5. public class TestService {
  6. @SentinelResource(value = "HelloWorld",blockHandler = "sayHello block")
  7. public String sayHello(String name) {
  8. return "Hello, " + name;
  9. }
  10. }

config

配置注解

  1. package com.et.sentinel.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
  5. @Configuration
  6. public class SentinelAspectConfig {
  7. @Bean
  8. public SentinelResourceAspect sentinelResourceAspect(){
  9. return new SentinelResourceAspect();
  10. }
  11. }

DemoApplication.java

定义一个“HelloWorld”资源

  1. package com.et.sentinel;
  2. import com.alibaba.csp.sentinel.Entry;
  3. import com.alibaba.csp.sentinel.SphU;
  4. import com.alibaba.csp.sentinel.slots.block.BlockException;
  5. import com.alibaba.csp.sentinel.slots.block.RuleConstant;
  6. import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
  7. import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
  8. import org.springframework.boot.SpringApplication;
  9. import org.springframework.boot.autoconfigure.SpringBootApplication;
  10. import org.springframework.context.annotation.Bean;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. @SpringBootApplication
  14. public class DemoApplication {
  15. public static void main(String[] args) {
  16. SpringApplication.run(DemoApplication.class, args);
  17. // 配置规则.
  18. initFlowRules();
  19. /*while (true) {
  20. // 1.5.0 版本开始可以直接利用 try-with-resources 特性
  21. try (Entry entry = SphU.entry("HelloWorld")) {
  22. // 被保护的逻辑
  23. Thread.sleep(300);
  24. System.out.println("hello world");
  25. } catch (BlockException | InterruptedException ex) {
  26. // 处理被流控的逻辑
  27. System.out.println("blocked!");
  28. }
  29. }*/
  30. }
  31. private static void initFlowRules(){
  32. List<FlowRule> rules = new ArrayList<>();
  33. FlowRule rule = new FlowRule();
  34. rule.setResource("HelloWorld");
  35. rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
  36. // Set limit QPS to 20.
  37. rule.setCount(2);
  38. rules.add(rule);
  39. FlowRuleManager.loadRules(rules);
  40. }
  41. }

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

4.测试

打包Spring Boot应用

mvn install

运行程序(配置在application.yaml文件里面配追不生效,这块可能有一些bug,只能在启动的时候加上这个参数)

java -Dcsp.sentinel.dashboard.server=127.0.0.1:8080 -jar sentinel-1.0-SNAPSHOT.jar

多访问几次http://127.0.0.1:8088/hello,登陆sentinel-dashboad看结果

11

可以看到通过多少流量,拒绝多少流量

5.引用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/991919
推荐阅读
相关标签
  

闽ICP备14008679号