1. Sentinel ��浠�涔�锛�

����寰����$��娴�琛�锛����″�����′��寸��绋冲���у��寰�瓒��ヨ���瑕���Sentinel 浠ユ���涓哄���ョ�戊寅�浠�娴����у�躲��������绾с��绯荤�璐�潘戒��ょ��澶�涓�缁村害淇��ゆ���$��绋冲���с��

Sentinel �锋��浠ヤ��瑰�锛�

  • 涓板����搴��ㄥ�烘��锛�Sentinel �挎�ヤ��块��宸村反杩�10骞寸������涓�澶т�娴������稿��烘��锛�岛�濡�绉�����娑�����宄板~璋枫����缇ゆ����у�躲��疏浚��剁����涓�娓镐����ㄥ��ㄧ����
  • 疏浚�澶���疏浚��剁����锛�Sentinel ���舵��岛�疏浚��剁�����у���姐��浣���浠ュ�ㄦ�у�跺�颁腑���版�ュ�ュ��ㄧ�����版�哄�ㄧ�绾ф�版��锛����� 500 �颁互涓�瑙�妯$����缇ょ��姹��昏�琛����点��
  • 骞挎���寮�婧�����锛�Sentinel ��岛�寮�绠卞�崇�ㄧ��涓��跺��寮�婧�妗���/搴����村��妯″��锛�岛�濡�涓� Spring Cloud��Dubbo��gRPC ���村��������瑕�寮��ョ�稿���岛�璧�骞惰�琛�绠�������缃��冲��蹇����版�ュ�� Sentinel��
  • 疏浚�����SPI�╁���锛�Sentinel ��岛�绠������ㄣ��疏浚����� SPI �╁��ュ�c���ㄥ��浠ラ��杩�疏浚��版�╁��ュ�f�ュ揩���板���堕�昏���岛�濡�疏浚��惰���绠$���������ㄦ���版��婧�绛���
  • Sentinel ��涓昏��规�э�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    Sentinel ��寮�婧�����锛�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    Sentinel ��涓轰袱涓��ㄥ��锛�

  • �稿�搴�锛�Java 疏浚㈡�风��锛�涓�岛�璧�浠讳�妗���/搴�锛��藉�杩�琛�河渠����� Java 杩�琛��剁��澧�锛����跺�� Dubbo / Spring Cloud 绛�妗��朵���杈�濂界��������
  • �у�跺�起�Dashboard锛��轰� Spring Boot 寮���锛���������浠ョ�存�ヨ�琛�锛�涓���瑕�棰�澶��� Tomcat 绛�搴��ㄥ�瑰�ㄣ��
  • 2. Sentinel 蹇���寮�彭�

    兄弟���锛�寮��� Sentinel 岛�璧�

     <dependency>
         <groupId>com.alibaba.csp</groupId>
         <artifactId>sentinel-core</artifactId>
         <version>1.7.1</version>
     </dependency> 

    �ョ��锛�疏浚�涔�璧�婧�

    璧�婧���� Sentinel 涓����稿�姒�蹇典�涓�����甯哥�ㄧ��璧�婧�����浠�浠g��涓��� Java �规��� 褰��讹��ㄤ���浠ユ�寸�垫椿��疏浚�涔�浣���璧�婧�锛�岛�濡�锛�����瑕��у�舵�����浠g���� Sentinel API SphU.entry("HelloWorld") �� entry.exit() ���磋捣�ュ�冲�����ㄤ��㈢��岛�海洋�涓�锛���浠�广大� System.out.println("hello world"); 浣�涓鸿�婧�锛�琚�淇��ょ���昏�锛�锛��� API ��瑁�璧锋�ャ��岛�濡�锛�

    try (Entry entry = SphU.entry("HelloWorld")) {
         // Your business logic here.
         System.out.println("hello world");
     } catch (BlockException e) {
         // Handle rejected request.
         e.printStackTrace();
     }
     // try-with-resources auto exit 

    杩���浠ヤ娇�ㄦ拓宽瑙e��涔�璧�婧���https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81

    岛�濡�锛�

     @SentinelResource("HelloWorld")
     public void helloWorld() {
         // 璧�婧�涓����昏�
         System.out.println("hello world");
     } 

    ����锛�疏浚�涔�瑙���

    �ヤ��ワ���杩�娴��ц����ユ��疏浚���璁歌�ヨ�婧���杩���璇锋�娆℃�起�岛�濡�涓��㈢��浠g��疏浚�涔�河渠�璧�婧� HelloWorld 姣�绉���澶����介��杩� 20 涓�璇锋���

     private static void initFlowRules(){
         List<FlowRule> rules = new ArrayList<>();
         FlowRule rule = new FlowRule();
         rule.setResource("HelloWorld");
         rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
         // Set limit QPS to 20.
         rule.setCount(20);
         rules.add(rule);
         FlowRuleManager.loadRules(rules);
     } 

    疏浚���锛�

    疏浚��寸��浠g��濡�涓�锛�

    pom.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     4     <modelVersion>4.0.0</modelVersion>
     5     <parent>
     6         <groupId>org.springframework.boot</groupId>
     7         <artifactId>spring-boot-starter-parent</artifactId>
     8         <version>2.2.2.RELEASE</version>
     9         <relativePath/> <!-- lookup parent from repository -->
    10     </parent>
    11     <groupId>com.cjs.example</groupId>
    12     <artifactId>sentinel-example</artifactId>
    13     <version>0.0.1-SNAPSHOT</version>
    14     <name>sentinel-example</name>
    15 
    16     <properties>
    17         <java.version>1.8</java.version>
    18         <spring-cloud.version>Greenwich.SR4</spring-cloud.version>
    19         <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
    20     </properties>
    21 
    22     <dependencies>
    23         <dependency>
    24             <groupId>org.springframework.boot</groupId>
    25             <artifactId>spring-boot-starter-actuator</artifactId>
    26         </dependency>
    27         <dependency>
    28             <groupId>org.springframework.boot</groupId>
    29             <artifactId>spring-boot-starter-web</artifactId>
    30         </dependency>
    31         <dependency>
    32             <groupId>com.alibaba.cloud</groupId>
    33             <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    34         </dependency>
    35 
    36     </dependencies>
    37 
    38     <dependencyManagement>
    39         <dependencies>
    40             <dependency>
    41                 <groupId>org.springframework.cloud</groupId>
    42                 <artifactId>spring-cloud-dependencies</artifactId>
    43                 <version>${spring-cloud.version}</version>
    44                 <type>pom</type>
    45                 <scope>import</scope>
    46             </dependency>
    47 
    48             <dependency>
    49                 <groupId>com.alibaba.cloud</groupId>
    50                 <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    51                 <version>${spring-cloud-alibaba.version}</version>
    52                 <type>pom</type>
    53                 <scope>import</scope>
    54             </dependency>
    55         </dependencies>
    56     </dependencyManagement>
    57 
    58     <build>
    59         <plugins>
    60             <plugin>
    61                 <groupId>org.springframework.boot</groupId>
    62                 <artifactId>spring-boot-maven-plugin</artifactId>
    63             </plugin>
    64         </plugins>
    65     </build>
    66 
    67 </project>

    application.properties

     server.port=8084
     spring.application.name=sentinel-example
     spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080

    SentinelExampleApplication.java

     1 package com.cjs.example.sentinel;
     2 
     3 import com.alibaba.csp.sentinel.Entry;
     4 import com.alibaba.csp.sentinel.SphU;
     5 import com.alibaba.csp.sentinel.slots.block.BlockException;
     6 import com.alibaba.csp.sentinel.slots.block.RuleConstant;
     7 import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
     8 import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
     9 import org.springframework.boot.SpringApplication;
    10 import org.springframework.boot.autoconfigure.SpringBootApplication;
    11 
    12 import java.util.ArrayList;
    13 import java.util.List;
    14 
    15 @SpringBootApplication
    16 public class SentinelExampleApplication {
    17 
    18     public static void main(String[] args) {
    19         SpringApplication.run(SentinelExampleApplication.class, args);
    20 
    21 
    22         // ��缃�瑙���.
    23         initFlowRules();
    24 
    25         while (true) {
    26             // 1.5.0 ����寮�彭���浠ョ�存�ュ�╃�� try-with-resources �规�э����� exit entry
    27             try (Entry entry = SphU.entry("HelloWorld")) {
    28                 // 琚�淇��ょ���昏�
    29                 System.out.println("hello world");
    30             } catch (BlockException ex) {
    31                 // 澶���琚�娴��х���昏�
    32                 System.out.println("blocked!");
    33             }
    34         }
    35     }
    36 
    37 
    38     private static void initFlowRules() {
    39         List<FlowRule> rules = new ArrayList<>();
    40 
    41         FlowRule rule = new FlowRule();
    42         rule.setResource("HelloWorld");
    43         rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    44         // Set limit QPS to 20.
    45         rule.setCount(20);
    46         rules.add(rule);
    47 
    48         FlowRuleManager.loadRules(rules);
    49 
    50     }
    51 }

    TestController.java

     1 package com.cjs.example.sentinel;
     2 
     3 import com.alibaba.csp.sentinel.annotation.SentinelResource;
     4 import org.springframework.web.bind.annotation.GetMapping;
     5 import org.springframework.web.bind.annotation.RestController;
     6 
     7 @RestController
     8 public class TestController {
     9 
    10     @GetMapping("/hello")
    11     @SentinelResource("hello")
    12     public String hello() {
    13         return "hello";
    14     }
    15 
    16 }

    3. Sentinel �у�跺��

    Sentinel �у�跺�版��广大�搴�璇ュ����濡�涓����斤�

  • �ョ���哄�ㄥ��琛ㄤ互���ュ悍���碉��堕�� Sentinel 疏浚㈡�风��������蹇�璺冲��锛��ㄤ��ゆ���哄�ㄦ�����ㄧ嚎��
  • ���� (���哄����缇よ����)锛���杩� Sentinel 疏浚㈡�风���拈�茬������ API锛�疏浚�������骞朵�����搴��ㄧ���т俊��锛���缁���浠ュ���扮演�绾х��疏浚��剁���с��
  • 瑙���绠$�����ㄩ��锛�缁�涓�绠$���ㄩ��瑙�����
  • �存��锛���河渠х��澧�涓��存����甯搁��瑕���
  • https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

    �山���у�跺�起�

    �瑰�涓�锛�涓�潘藉凡缁���濂界����

    https://github.com/alibaba/Sentinel/releases

    wget https://github.com/alibaba/Sentinel/releases/download/1.7.1/sentinel-dashboard-1.7.1.jar
    �瑰�河渠�锛���杩�婧�����浠堵�

    mvn clean package�

    ���ㄦ�у�跺��

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

    榛�璁ょ�ㄦ�山��瀵����芥��sentinel�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    4. Sentinel 娉ㄨВ����

    @SentinelResource �ㄤ�疏浚�涔�璧�婧�锛�骞舵��岛�������寮�甯稿����� fallback ��缃�椤�

    @SentinelResource 娉ㄨВ��灞��э�

  • value 锛�璧�婧���绉�
  • entryType 锛�the entry type (inbound or outbound)
  • blockHandler/blockHandlerClass 锛��blockHandler ��瀵瑰�澶��� BlockException ���芥�板��绉般��blockHandler �芥�拌�块�����拈��瑕��� public锛�杩���绫诲����瑕�涓����规��稿�归��锛����扮演被����瑕������规��稿�归��骞朵�������涓�涓�棰�澶������起�绫诲��涓� BlockException��blockHandler �芥�伴�璁ら��瑕������规��ㄥ��涓�涓�绫讳腑���ュ���浣跨�ㄥ�朵�绫荤���芥�起�����浠ユ��疏浚�blockHandlerClass��blockHandlerClass 涓哄�瑰��芥�版���ㄧ把�� Class 瀵硅薄锛�娉ㄦ��瀵瑰����芥�板���涓� static �芥�起�������娉�瑙f����
  • fallback 锛�fallback �芥�板��绉帮�����椤癸��ㄤ��ㄦ���哄�甯哥���跺����岛� fallback 澶����昏���fallback �芥�板��浠ラ��瀵规����绫诲����寮�甯革��や��exceptionsToIgnore����㈡���ゆ����寮�甯哥被��锛�杩�琛�澶�����fallback �芥�扮演�惧����浣�缃�瑕�姹�锛�defaultFallback 锛�榛�璁ょ�� fallback �芥�板��绉帮�����椤癸���甯哥�ㄤ����ㄧ�� fallback �昏�

  • 杩����肩被��蹇�椤讳����芥�拌����肩被��涓��达�
  • �规����板��琛ㄩ��瑕������芥�颁��达�������浠ラ�澶�澶�涓�涓��Throwable�绫诲�������扮演�ㄤ��ユ�跺�瑰���寮�甯革�
  • fallback �芥�伴�璁ら��瑕������规��ㄥ��涓�涓�绫讳腑���ュ���浣跨�ㄥ�朵�绫荤���芥�起�����浠ユ��疏浚��fallbackClass�涓哄�瑰���绫荤���Class�瀵硅薄锛�娉ㄦ��瀵瑰����芥�板���涓� static �芥�起�������娉�瑙f��锛���
  • exceptionsToIgnore 锛��ㄤ���疏浚���河渠�寮�甯歌����ゆ��锛�涓�浼�璁″�ュ�甯哥�璁′腑锛�涔�涓�浼�杩��� fallback �昏�涓�锛�����浼����锋���郝�
  • ��瑕�娉ㄦ������锛��� blockHandler �� fallback �借�琛�河渠���缃�锛���琚���娴���绾ц������ BlockException �跺��浼�杩��� blockHandler 澶����昏����ユ����缃� blockHandler��fallback �� defaultFallback锛���琚���娴���绾ф�朵�广大� BlockException �存�ユ���虎��ユ�规���韬���疏浚�涔� throws BlockException ��浼�琚� JVM ��瑁�涓�灞� UndeclaredThrowableException锛����

    绀轰�锛�

     1 public class TestService {
     2 
     3     // 瀵瑰��� `handleException` �芥�伴��瑕�浣�河渠� `ExceptionUtil` 绫讳腑锛�骞朵�蹇�椤讳负 static �芥��.
     4     @SentinelResource(value = "test", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})
     5     public void test() {
     6         System.out.println("Test");
     7     }
     8 
     9     // ���芥��
    10     @SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")
    11     public String hello(long s) {
    12         return String.format("Hello at %d", s);
    13     }
    14     
    15     // Fallback �芥�起��芥�扮演�惧��涓����芥�颁��存����涓�涓� Throwable 绫诲��������.
    16     public String helloFallback(long s) {
    17         return String.format("Halooooo %d", s);
    18     }
    19 
    20     // Block 寮�甯稿����芥�起����版����澶�涓�涓� BlockException锛��朵�涓����芥�颁���.
    21     public String exceptionHandler(long s, BlockException ex) {
    22         // Do some log here.
    23         ex.printStackTrace();
    24         return "Oops, error occurred at " + s;
    25     }
    26 } 

    ��浠ョ���起�blockHandler��fallback蹇�椤讳����规��ㄥ��涓�涓�绫讳腑��濡���涓��冲���ㄥ��涓�涓�绫讳腑锛���浠ュ�╃��blockHandlerClass�ユ��疏浚�绫伙��跺����杩�blockHandler��疏浚��规�����

    濡������堕��缃�河渠�blockHandler��fallback锛���BlockException��浼�杩���blockHandler澶����昏�涓���

    5. Sentinel �烘��姒�蹇�

    璧�婧�

    ��瑕���杩� Sentinel API 疏浚�涔���浠g��锛�广大辨��璧�婧�锛��藉�琚� Sentinel 淇��よ捣�ャ��澶ч�ㄥ�����仪式�锛���浠ヤ娇�ㄦ�规�绛惧��锛�URL锛����虫���″��绉颁�涓鸿�婧����ユ��绀鸿�婧����

    瑙���

    �寸�璧�婧���疏浚��剁�舵��璁惧����瑙���锛���浠ュ����娴����у�惰�����������绾ц���浠ュ��绯荤�淇��よ���������瑙�����浠ュ�ㄦ��疏浚��惰��淬���

    娴����у��

    娴����у�跺�ㄧ�缁�浼�杈�涓���涓�涓�甯哥�ㄧ��姒�蹇碉�疏浚��ㄤ�璋��寸�缁����������版�����惰��锛�浠�绯荤�绋冲���ц�搴�����锛��ㄥ���璇锋�����搴�涓�锛�涔�����甯稿���璁茬┒��浠绘���堕�村�版�ョ��璇锋�寰�寰������轰����х��锛���绯荤���澶����藉��������������浠���瑕��规��绯荤���澶����藉��瀵规���杩�琛��у�躲��Sentinel 浣�涓轰�涓�璋�����锛���浠ユ�规����瑕������雾��璇锋�璋��存��������褰㈢�讹�濡�涓��炬��绀猴��

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    娴����у�舵��浠ヤ���涓�瑙�搴�锛�

  • 璧�婧���璋��ㄥ�崇郴锛�岛�濡�璧�婧���璋��ㄩ�捐矾锛�璧�婧���璧�婧�涔��寸���崇郴锛�
  • 杩�琛�����锛�岛�濡� QPS��绾跨�姹���绯荤�璐�潘界��锛�
  • �у�剁������锛�岛�濡��存�ラ��娴����山���ㄣ������绛�锛��
  • Sentinel ��璁捐�$��蹇垫��璁╂�ㄨ���遍���╂�у�剁��瑙�搴�锛�骞惰�琛��垫椿缁���锛�浠���杈惧�版�宠���������

    ������绾�

    Sentinel �� Hystrix ��������涓��寸��: 褰�妫�娴��拌��ㄩ�捐矾涓���涓�璧�婧��雾�颁�绋冲����琛ㄧ�起�岛�濡�璇锋���搴��堕�拈�挎��寮�甯告��岛���楂����跺��锛���瀵硅�涓�璧�婧���璋��ㄨ�琛����讹�璁╄�锋�蹇���澶辫触锛��垮��褰卞���板�跺����璧�婧���瀵艰�寸骇��������

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    �ㄩ���剁����娈典�锛�Sentinel �� Hystrix ����河渠�疏浚��ㄤ�涓��风���规���

    Hystrix ��杩�绾跨�姹���绂荤���瑰�锛��ュ�逛�璧�锛��� Sentinel ��姒�蹇典腑瀵瑰��璧�婧�锛�杩�琛�河渠���绂汇��杩��山����濂藉���璧�婧���璧�婧�涔��村���颁���褰诲�����绂汇��缂虹�规���や�澧���河渠�绾跨����㈢������锛�杩�澶���绾跨�姹�瀵艰�寸嚎绋��扮演��杩�澶�锛�锛�杩���瑕�棰���缁���涓�璧�婧���绾跨�姹�澶у����������濡�涓��撅�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    Sentinel 瀵硅�涓���棰�����河渠�涓ょ���娈�:

  • ��杩�骞跺��绾跨��拌�琛�����
  • ��璧�婧�姹���绂荤���规�涓���锛�Sentinel ��杩����惰�婧�骞跺��绾跨����伴��锛��ュ��广大�涓�绋冲��璧�婧�瀵瑰�跺��璧�婧���褰卞����杩��蜂�浣�娌℃��绾跨����㈢������锛�涔�涓���瑕��ㄩ�������绾跨�姹���澶у���褰���涓�璧�婧��雾�颁�绋冲�������仪式�锛�岛�濡���搴��堕�村���救救�瀵硅�婧����存�ュ奖��广大辨��浼�����绾跨��扮演����姝ュ��绉���褰�绾跨��板�ㄧ�瑰��璧�婧�涓���绉��颁�疏浚����伴��涔���锛�瀵硅�ヨ�婧����拌�锋�广大变�琚���缁�����绉���绾跨�疏浚���浠诲�″����寮�彭�缁х图�ユ�惰�锋���

  • ��杩���搴��堕�村�硅�婧�杩�琛���绾�
  • �や�瀵瑰苟��绾跨��拌�琛��у�朵互澶�锛�Sentinel 杩���浠ラ��杩���搴��堕�存�ュ揩����绾т�绋冲����璧�婧���褰�岛�璧���璧�婧��雾�板��搴��堕�磋��垮��锛�����瀵硅�ヨ�婧���璁块���戒�琚��存�ユ��缁�锛��村�拌�河渠���疏浚����堕�寸���d��������版�㈠���

    绯荤�璐�潘戒���

    Sentinel ���舵��岛�绯荤�缁村害������搴�淇��よ�藉�����叉�㈤��宕╋���绯荤��叉�や腑��瑕���涓�����褰�绯荤�璐�潘借�楂����跺��锛�濡���杩���缁�璁╄�锋�杩��ワ����戒�瀵艰�寸郴缁�宕╂�锛���娉���搴����ㄩ��缇ょ��澧�涓�锛�缃�缁�璐�潘藉��琛′�����搴�杩��版�哄�ㄦ�胯浇��娴���潘����板�跺�����哄�ㄤ��汇��濡���杩�涓��跺���跺�����哄�ㄤ�澶��ㄤ�涓�杈圭��舵�����跺��锛�杩�涓�澧�����娴���广大变�瀵艰�磋��版�哄�ㄤ�宕╂�锛�����瀵艰�存�翠釜��缇や����ㄣ��

    ��瀵硅�涓����碉�Sentinel ��岛�河渠�瀵瑰���淇��ゆ�哄�讹�璁╃郴缁����ュ�f�����绯荤���璐�潘借揪�颁�涓�骞宠 锛�淇�璇�绯荤��ㄨ�藉�����翠���澶�����澶���璇锋���

    6. 濡�浣�浣跨��Sentinel

    Sentinel ��浠ョ��������涓� Sentinel �稿�搴��� Dashboard���稿�搴�涓�岛�璧� Dashboard锛�浣���缁��� Dashboard ��浠ュ��寰���濂界��������

    璧�婧�锛���浠ユ��浠讳�涓�瑗匡����★����¢�����规�锛����虫��涓�娈典唬����浣跨�� Sentinel �ヨ�琛�璧�婧�淇��わ�涓昏���涓哄��涓�姝ラ�わ�

    1. 疏浚�涔�璧�婧�
    2. 疏浚�涔�瑙���
    3. 妫�楠�瑙������������

    �ㄧ������跺��锛�����瑕�����杩�涓�浠g��������瑕�淇��わ�濡�����瑕�淇��わ�广大卞�涔�疏浚�涔�涓轰�涓�璧�婧���

    疏浚�涔�璧�婧���甯哥�ㄦ�瑰�

    �瑰�涓�锛�����哄�甯哥���瑰�疏浚�涔�璧�婧�

    SphU�����河渠� try-catch 椋��肩�� API���ㄨ�绉��瑰�锛�褰�璧�婧�����河渠���娴�涔���浼����郝�BlockException��杩�涓��跺����浠ユ����寮�甯革�杩�琛���娴�涔������昏�澶�����绀轰�浠g��濡�涓�锛�

    1 // 1.5.0 ����寮�彭���浠ュ�╃�� try-with-resources �规��
    2 // 璧�婧�����浣跨�ㄤ换����涓��¤��涔���海洋�绗�涓诧�姣�濡��规������ュ�e�����跺������涓���璇���海洋�绗�涓层��
    3 try (Entry entry = SphU.entry("resourceName")) {
    4   // 琚�淇��ょ��涓��¢�昏�
    5   // do something here...
    6 } catch (BlockException ex) {
    7   // 璧�婧�璁块���绘��锛�琚���娴���琚���绾�
    8   // �ㄦ�ゅ�杩�琛��稿���澶�����浣�
    9 }

    �瑰���起��� entry ���跺��浼��ヤ����瑰���起��d� exit ���跺��涔�涓�疏浚�瑕�甯�涓�瀵瑰������起�exit(count, args)锛�锛��������戒���缁�璁¢��璇���杩�涓��跺��涓��戒娇�� try-with-resources ���瑰�����澶���杩� Tracer.trace(ex) �ョ�璁″�甯镐俊���讹��变� try-with-resources 璇�娉�涓� catch 璋��ㄩ『搴�����棰�锛�浼�瀵艰�存��娉�姝g‘缁�璁″�甯告�起���姝ょ�璁″�甯镐俊���朵�涓��藉�� try-with-resources �� catch ��涓�璋��� Tracer.trace(ex)��

    ���� exit 绀轰�锛�

     1 Entry entry = null;
     2 // �″�淇�璇� finally 浼�琚��ц�
     3 try {
     4   // 璧�婧�����浣跨�ㄤ换����涓��¤��涔���海洋�绗�涓诧�娉ㄦ���扮演��涓��藉お澶�锛�瓒�杩� 1K锛�锛�瓒��哄����璇蜂�涓哄���颁��ヨ��涓�瑕��存�ヤ�涓鸿�婧���
     5   // EntryType 浠h〃娴���绫诲��锛�inbound/outbound锛�锛��朵腑绯荤�瑙�����瀵� IN 绫诲�������圭����
     6   entry = SphU.entry("��疏浚�涔�璧�婧���");
     7   // 琚�淇��ょ��涓��¢�昏�
     8   // do something...
     9 } catch (BlockException ex) {
    10   // 璧�婧�璁块���绘��锛�琚���娴���琚���绾�
    11   // 杩�琛��稿���澶�����浣�
    12 } catch (Exception ex) {
    13   // �ラ��瑕���缃���绾ц���锛���瑕���杩�杩�绉��瑰�璁板�涓��″�甯�
    14   Tracer.traceEntry(ex, entry);
    15 } finally {
    16   // �″�淇�璇� exit锛��″�淇�璇�姣�涓� entry 涓� exit ��瀵�
    17   if (entry != null) {
    18     entry.exit();
    19   }
    20 }

    ���瑰���板���圭ず岛�锛�

     1 Entry entry = null;
     2 try {
     3     // �ラ��瑕���缃�岛�澶�椤癸���浼��ョ�����板�������烘��绫诲����
     4     // EntryType 浠h〃娴���绫诲��锛��朵腑绯荤�瑙�����瀵� IN 绫诲�������圭����
     5     // count 澶у��版���甸�藉~ 1锛�浠h〃缁�璁′负涓�娆¤��ㄣ��
     6     entry = SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB);
     7     // Your logic here.
     8 } catch (BlockException ex) {
     9     // Handle request rejection.
    10 } finally {
    11     // 娉ㄦ��锛�exit ���跺��涔�涓�疏浚�瑕�甯�涓�瀵瑰������起��������戒���缁�璁¢��璇���
    12     if (entry != null) {
    13         entry.exit(1, paramA, paramB);
    14     }
    15 }

    SphU.entry()������版��杩股�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    �瑰�河渠���娉ㄨВ�瑰�疏浚�涔�璧�婧�

    Sentinel ������杩��@SentinelResource�娉ㄨВ疏浚�涔�璧�婧�骞堕��缃��blockHandler����fallback��芥�版�ヨ�琛���娴�涔�����澶�����绀轰�锛�

     1 // ������涓��℃�规�.
     2 @SentinelResource(blockHandler = "blockHandlerForGetUser")
     3 public User getUserById(String id) {
     4     throw new RuntimeException("getUserById command failed");
     5 }
     6 
     7 // blockHandler �芥�起����规�璋��ㄨ���娴�/��绾�/绯荤�淇��ょ���跺��璋���
     8 public User blockHandlerForGetUser(String id, BlockException ex) {
     9     return new User("admin");
    10 }

    娉ㄦ���blockHandler��芥�颁��ㄥ���规�琚���娴�/��绾�/绯荤�淇��ょ���跺��璋���锛����fallback��芥�颁���瀵规����绫诲����寮�甯搞����澶�璇锋敞���blockHandler����fallback��芥�扮演��褰㈠�瑕�姹����

    �瑰�涓�������寮�姝ヨ���

    Sentinel ����寮�姝ヨ��ㄩ�捐矾��缁�璁°���ㄥ�姝ヨ��ㄤ腑锛���瑕���杩��SphU.asyncEntry(xxx)��规�疏浚�涔�璧�婧�锛�骞堕��甯搁��瑕��ㄥ�姝ョ����璋��芥�颁腑璋����exit��规���绀轰�锛�

     1 try {
     2     AsyncEntry entry = SphU.asyncEntry(resourceName);
     3 
     4     // 寮�姝ヨ���.
     5     doAsync(userId, result -> {
     6         try {
     7             // �ㄦ�ゅ�澶���寮�姝ヨ��ㄧ��缁���.
     8         } finally {
     9             // �ㄥ��璋�缁����� exit.
    10             entry.exit();
    11         }
    12     });
    13 } catch (BlockException ex) {
    14     // Request blocked.
    15     // Handle the exception (e.g. retry or fallback).
    16 }

    7. Sentinel 宸ヤ�涓绘�绋�

    �� Sentinel ����锛�������璧�婧��藉�瑰�涓�涓�璧�婧���绉帮�resourceName锛�锛�姣�娆¤�婧�璋��ㄩ�戒���寤轰�涓��Entry�瀵硅薄��Entry ��浠ラ��杩�瀵逛富娴�妗��剁���������ㄥ��寤猴�涔���浠ラ��杩�娉ㄨВ���瑰���璋����SphU�API �惧���寤恒��Entry ��寤虹���跺��锛����朵�浼���寤轰�绯诲�����芥��妲斤�slot chain锛�锛�杩�河渠���妲芥��涓�������璐o�岛�濡�:

  • NodeSelectorSlot�锛�璐�璐f�堕��璧�婧���璺�寰�锛�骞跺�杩�河渠�璧�婧���璋��ㄨ矾寰�锛�浠ユ���剁���海洋��ㄨ捣�ワ��ㄤ��规��璋��ㄨ矾寰��ラ��娴���绾э��
  • ClusterBuilderSlot�锛����ㄤ�海洋��ㄨ�婧���缁�璁′俊��浠ュ��璋��ㄨ��淇℃��锛�岛�濡�璇ヨ�婧��� RT, QPS, thread count 绛�绛�锛�杩�河渠�淇℃��广大��ㄤ�涓哄�缁村害��娴�锛���绾х��岛���锛�
  • StatisticSlot�锛����ㄤ�璁板���缁�璁′���绾�搴��� runtime �������т俊��锛�
  • FlowSlot�锛��ㄤ��规��棰�璁剧����娴�瑙���浠ュ������ slot 缁�璁$���舵��锛��ヨ�琛�娴����у�讹�
  • AuthoritySlot�锛����规����缃���榛��藉������璋��ㄦ�ユ�淇℃��锛��ュ��榛��藉�����у�讹�
  • DegradeSlot�锛�����杩�缁�璁′俊��浠ュ��棰�璁剧��瑙���锛��ュ��������绾э�
  • SystemSlot�锛�����杩�绯荤����舵��锛�岛�濡� load1 绛�锛��ユ�у�舵�荤���ュ�f���锛�
  • �讳��舵���惧�涓�锛�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    杩�涓�褰╄�茬���捐�浼兼�村ソ��涓��瑰��

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    Sentinel 广大��SlotChainBuilder�浣�涓� SPI �ュ�h�琛��╁�锛�浣垮� Slot Chain �山�河渠��╁����藉�����ㄥ��浠ヨ��琛����ヨ��疏浚�涔��� slot 骞剁��� slot �寸��椤哄�锛�浠�����浠ョ� Sentinel 娣诲����疏浚�涔������姐��

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    8. Sentinel 娴����у��

    娴����у�讹�flow control锛�锛��跺���������у��ㄦ����� QPS ��骞跺��绾跨��扮演������锛�褰�杈惧�版��疏浚������兼�跺�规���杩�琛��у�讹�浠ラ�垮��琚����剁��娴���楂�宄板�插��锛�浠���淇���搴��ㄧ��楂����ㄦ�с��

    FlowSlot�浼��规��棰�璁剧��瑙���锛�缁������⒙�NodeSelectorSlot��ClusterNodeBuilderSlot��StatisticSlot�缁�璁″�烘�ョ��疏浚��朵俊��杩�琛�娴����у�躲��

    ��娴����存�ヨ〃�版���ㄦ�ц��Entry nodeA = SphU.entry(resourceName)����跺�����郝�FlowException�寮�甯搞��FlowException����BlockException���海洋�绫伙��ㄥ��浠ユ�����BlockException��ヨ��疏浚�涔�琚���娴�涔�����澶����昏���

    ��涓�涓�璧�婧���浠ュ��寤哄��¢��娴�瑙�����FlowSlot�浼�瀵硅�ヨ�婧���������娴�瑙���岛�娆¢����锛��村�版��瑙���瑙�����娴���������瑙�������疏浚�姣���

    涓��¢��娴�瑙���涓昏��变��㈠��涓���绱�缁���锛���浠���浠ョ���杩�河渠���绱��ュ���颁�������娴�����锛�

  • resource 锛�璧�婧���锛��抽��娴�瑙�����浣��ㄥ�硅薄
  • count 锛���娴�����
  • grade 锛���娴����肩被��锛�QPS ��骞跺��绾跨��起�
  • limitApp 锛�娴��ч��瀵圭��璋��ㄦ�ユ�锛��ヤ负 default ��涓��哄��璋��ㄦ�ユ�
  • strategy 锛�璋��ㄥ�崇郴��娴�绛���
  • controlBehavior 锛�娴����у�舵����锛��存�ユ��缁���Warm Up����������锛��
  • 8.1. �轰�QPS/骞跺���扮演��娴����у��

    娴����у�朵富瑕���涓ょ�缁�璁$把��锛�涓�绉���缁�璁″苟��绾跨��起���澶�涓�绉�����缁�璁� QPS��绫诲���甭�FlowRule����grade�海洋�娈垫�ュ��涔����朵腑锛�0 浠h〃�规��骞跺���伴���ラ��娴�锛�1 浠h〃�规�� QPS �ヨ�琛�娴����у�躲���朵腑绾跨��般��QPS �硷��芥���甭�StatisticSlot�疏浚��剁�璁¤�山������

    ��浠ラ��杩�涓��㈢���戒护�ョ��疏浚��剁�璁′俊��锛�

    curl http://localhost:8719/cnode?id=resourceName

    骞跺��绾跨��版����у��

    骞跺��绾跨��伴��娴��ㄤ�淇��や��$嚎绋��颁�琚���广大姐��岛�濡�锛�褰�搴��ㄦ��岛�璧���涓�娓稿��ㄧ�变���绉�����瀵艰�存���′�绋冲������搴�寤惰�澧���锛�瀵逛�璋��ㄨ���ヨ�达����崇��������涓������村���绾跨��板����锛���绔����仪式����冲�艰�寸嚎绋�姹���广大姐��涓哄�瀵瑰お澶�绾跨����ㄧ�����碉�涓�����浣跨�ㄩ��绂荤���规�锛�姣�濡���杩�涓���涓��¢�昏�浣跨�ㄤ���绾跨�姹��ラ��绂讳��¤��韬�涔��寸��璧�婧�河渠���锛�绾跨�姹���绂伙���杩�绉���绂绘�规��界�堕��绂绘�ф��杈�濂斤�浣���浠d环灏辨��绾跨��扮演��澶�澶�锛�绾跨�涓�涓������㈢�� overhead 姣�杈�澶э��瑰����瀵逛�寤舵�剁��璋��ㄦ��姣�杈�澶х��褰卞����Sentinel 骞跺��绾跨��伴��娴�涓�璐�璐e��寤哄��绠$��绾跨�姹�锛�����绠���缁�璁″���璇锋�涓�涓�����绾跨��扮演��锛�濡���瓒��洪���硷��扮演��璇锋�浼�琚�绔��虫��缁�锛�����绫讳技浜�淇″�烽����绂汇��

    QPS娴����у��

    褰� QPS 瓒�杩���涓����肩���跺��锛����������借�琛�娴����у�躲��娴����у�剁����������浠ヤ���绉�锛��存�ユ��缁���Warm Up������������瀵瑰��FlowRule�涓����controlBehavior�海洋�娈点��

    8.2. �轰�璋��ㄥ�崇郴��娴����у��

    璋��ㄥ�崇郴����璋��ㄦ�无边��琚�璋��ㄦ�戊寅�涓�涓��规������戒�璋��ㄥ�跺���规�锛�褰㈡��涓�涓�璋��ㄩ�捐矾��灞�娆″�崇郴��Sentinel ��杩��NodeSelectorSlot�寤虹��涓���璧�婧��寸��璋��ㄧ���崇郴锛�骞朵���杩��ClusterNodeBuilderSlot�璁板�姣�涓�璧�婧���疏浚��剁�璁′俊����

    ��河渠�璋��ㄩ�捐矾��缁�璁′俊��锛���浠���浠ヨ����哄�绉�娴����у�舵��娈点��

    �规��璋��ㄦ�归��娴�

    ContextUtil.enter(resourceName, origin)��规�涓����origin����版����河渠�璋��ㄦ�硅韩浠姐��杩�河渠�淇℃��浼����ClusterBuilderSlot�涓�琚�缁�璁°������杩�浠ヤ��戒护�ュ�绀轰�����璋��ㄦ�瑰�瑰��涓�涓�璧�婧���璋��ㄦ�版��锛��

    �规��璋��ㄩ�捐矾�ュ�i��娴�锛��捐矾��娴��

    NodeSelectorSlot�涓�璁板�河渠�璧�婧�涔��寸��璋��ㄩ�捐矾锛�杩�河渠�璧�婧���杩�璋��ㄥ�崇郴锛��镐�涔��存����涓�妫佃��ㄦ����杩�妫垫�����硅���规��涓�涓���海洋�涓郝�machine-root����������戊寅�璋��ㄩ�剧���ュ�i�芥��杩�涓������圭��海洋����无边��

    涓�妫靛�稿����璋��ㄦ��濡�涓��炬��绀猴�

    Sentinel锛�涓�海洋�璇�瑙e井���$���ㄥ�垫�哄�讹���璺�河渠�

    �锋���崇郴��璧�婧�娴����у�讹��宠��娴����у��

    褰�涓や釜璧�婧�涔��村�锋��璧�婧�河渠��㈡����岛�璧��崇郴���跺��锛�杩�涓や釜璧�婧�岛垮�锋��河渠��宠����姣�濡�瀵规�版��搴���涓�涓�海洋�娈电��璇绘��浣�������浣�海洋��ㄤ���锛�璇荤����搴�杩�楂�浼�褰卞����寰���搴�锛�������搴�杩�楂�浼�褰卞��璇荤����搴���濡����句换璇诲����浣�河渠��㈣�婧�锛���河渠��㈡��韬�甯��ョ��寮���浼���浣��翠�������������浣跨�ㄥ�宠����娴��ラ�垮���锋���宠���崇郴��璧�婧�涔��磋�搴���河渠���锛�涓句��ヨ�达�read_db����write_db�杩�涓や釜璧�婧�����浠h〃�版��搴�璇诲��锛���浠���浠ョ��read_db�璁剧疆��娴�瑙����ヨ揪�板��浼���������锛�璁剧疆�FlowRule.strategy�涓郝�RuleConstant.RELATE����惰�剧疆�FlowRule.ref_identity�涓郝�write_db��杩��山���搴���浣�杩�河渠�棰�绻��讹�璇绘�版����璇锋�浼�琚���娴���