1.引入依赖

    1. <dependency>
    2. <groupId>com.alibaba.cloud</groupId>
    3. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>org.springframework.boot</groupId>
    7. <artifactId>spring-boot-starter-actuator</artifactId>
    8. </dependency>

    spring-boot-starter-actuator是微服务监控的,sentinel需要这个

    2.添加yml配置,为微服务设置sentinel控制台地址
    添加Sentinel后,需要暴露/actuator/sentinel端点,而Springboot默认是没有暴露该端点的,所以需要设置,测试http://localhost:8800/actuator/sentinel

    server:
      port: 8800
    
    spring:
      application:
        name: mall-user-sentinel-demo
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
    
        sentinel:
          transport:
            # 添加sentinel的控制台地址
            dashboard: 127.0.0.1:8080
            # 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
            # port: 8719
    
    #暴露actuator端点   
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    

    3.在sentinel控制台中设置流控规则

    • 资源名: 接口的API
    • 针对来源: 默认是default,当多个微服务都调用这个资源时,可以配置微服务名来对指定的微服务设置阈值
    • 阈值类型: 分为QPS和线程数 假设阈值为10
    • QPS类型: 只得是每秒访问接口的次数>10就进行限流
    • 线程数: 为接受请求该资源分配的线程数>10就进行限流

    image.png
    测试: 因为QPS是1,所以1秒内多次访问会出现如下情形:
    image.png

    访问http://localhost:8800/actuator/sentinel, 可以查看flowRules

    Spring Cloud Alibaba整合Sentinel - 图3

    微服务和Sentinel Dashboard通信原理
    Sentinel控制台与微服务端之间,实现了一套服务发现机制,集成了Sentinel的微服务都会将元数据传递给Sentinel控制台,架构图如下所示:

    image.png

    浏览器访问: http://localhost:8719/api

    [
        {
            "url": "/cnode",
            "desc": "get clusterNode metrics by id, request param: id={resourceName}"
        },
        {
            "url": "/setParamFlowRules",
            "desc": "Set parameter flow rules, while previous rules will be replaced."
        },
        {
            "url": "/origin",
            "desc": "get origin clusterNode by id, request param: id={resourceName}"
        },
        {
            "url": "/cluster/server/flowRules",
            "desc": "get cluster flow rules"
        },
        {
            "url": "/cluster/server/modifyFlowConfig",
            "desc": "modify cluster server flow config"
        },
        {
            "url": "/cluster/server/modifyTransportConfig",
            "desc": "modify cluster server transport config"
        },
        {
            "url": "/basicInfo",
            "desc": "get sentinel config info"
        },
        {
            "url": "/getClusterMode",
            "desc": "get cluster mode status"
        },
        {
            "url": "/cluster/client/modifyConfig",
            "desc": "modify cluster client config"
        },
        {
            "url": "/setClusterMode",
            "desc": "set cluster mode, accept param: mode={0|1} 0:client mode 1:server mode"
        },
        {
            "url": "/getRules",
            "desc": "get all active rules by type, request param: type={ruleType}"
        },
        {
            "url": "/api",
            "desc": "get all available command handlers"
        },
        {
            "url": "/setRules",
            "desc": "modify the rules, accept param: type={ruleType}&data={ruleJson}"
        },
        {
            "url": "/cluster/server/modifyNamespaceSet",
            "desc": "modify server namespace set"
        },
        {
            "url": "/cluster/client/fetchConfig",
            "desc": "get cluster client config"
        },
        {
            "url": "/cluster/server/paramRules",
            "desc": "get cluster server param flow rules"
        },
        {
            "url": "/tree",
            "desc": "get metrics in tree mode, use id to specify detailed tree root"
        },
        {
            "url": "/cluster/server/fetchConfig",
            "desc": "get cluster server config"
        },
        {
            "url": "/version",
            "desc": "get sentinel version"
        },
        {
            "url": "/clusterNode",
            "desc": "get all clusterNode VO, use type=notZero to ignore those nodes with totalRequest <=0"
        },
        {
            "url": "/jsonTree",
            "desc": "get tree node VO start from root node"
        },
        {
            "url": "/getParamFlowRules",
            "desc": "Get all parameter flow rules"
        },
        {
            "url": "/cluster/server/modifyParamRules",
            "desc": "modify cluster param flow rules"
        },
        {
            "url": "/metric",
            "desc": "get and aggregate metrics, accept param: startTime={startTime}&endTime={endTime}&maxLines={maxLines}&identify={resourceName}"
        },
        {
            "url": "/systemStatus",
            "desc": "get system status"
        },
        {
            "url": "/cluster/server/modifyFlowRules",
            "desc": "modify cluster flow rules"
        },
        {
            "url": "/cluster/server/metricList",
            "desc": "get cluster server metrics"
        },
        {
            "url": "/getSwitch",
            "desc": "get sentinel switch status"
        },
        {
            "url": "/setSwitch",
            "desc": "set sentinel switch, accept param: value={true|false}"
        },
        {
            "url": "/clusterNodeById",
            "desc": "get clusterNode VO by id, request param: id={resourceName}"
        },
        {
            "url": "/cluster/server/info",
            "desc": "get cluster server info"
        }
    ]