spring-cloud-alibaba微服务Sentinel-程序员宅基地

技术标签: 微服务  sentinel  架构  

Sentinel 官方网站

sentinel-dashboard-1.8.7.jar包下载地址

在这里插入图片描述

在window通过命令行启动(java -Dserver.port=8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.7.jar),可以通过 -Dserver.port修改控制台的端口

在这里插入图片描述

使用的版本最好都一致

在这里插入图片描述

注意:如果项目不是springcloud,不可以在yml配置dashboard的地址,配置也都是无效的。如果需要和dashboard整合有以下几种方法

方法一:启动参数配置项官网

-Dcsp.sentinel.dashboard.server=192.168.11.47:8858 #dashboard的访问路径

-Dcsp.sentinel.api.port=8869 #客户端监控 API 的端口(默认是 8719)

-Dproject.name=sentinel-name #指定应用的名称

-Dcsp.sentinel.heartbeat.client.ip=192.168.11.50 #客户端指定心跳包中本机的 IP

jar包启动的方式

java -Dproject.name=sentinel-name -Dcsp.sentinel.heartbeat.client.ip=192.168.11.50 -Dcsp.sentinel.api.port=8869 -Dcsp.sentinel.dashboard.server=192.168.11.47:8858 -jar sentinel-demo.jar

在代码中设置的方式

System.setProperty("project.name", "sentinel-name");
System.setProperty("csp.sentinel.heartbeat.client.ip", "192.168.11.50");
System.setProperty("csp.sentinel.api.port", "8869");
System.setProperty("csp.sentinel.dashboard.server", "192.168.11.47:8858");

idea配置的方式

在这里插入图片描述
在这里插入图片描述

pom的配置有两种方式,spring-cloud-starter-alibaba-sentinel包含sentinel全部的core和annotation等之类的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>sentinel-demo</artifactId>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2021.0.4.0</version>
        </dependency>
    </dependencies>
</project>

pom.xml:简约包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>sentinel-demo</artifactId>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--sentinel核心库-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
            <version>1.8.5</version>
        </dependency>

        <!--如果要使用注解@SentinelResource-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
            <version>1.8.5</version>
        </dependency>

        <!--客户端接入控制台-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
            <version>1.8.5</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
    </dependencies>
</project>

使用编写代码的方式实现(流控降级)熔断,不使用dashboard,这是流控规则,保存在代码中

package com.test.order.controller;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.Tracer;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description:
 * @Author: xu
 * @Data: 2024-2024/3/29-16
 * @Version: V1.0
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    

    private final static String resourceName = "flow";

    private static Logger log = LoggerFactory.getLogger(OrderController.class);

    @RequestMapping("/flow")
    public String flow() {
    
        System.out.println("aaaaaaaaaaaaaaaaa");
        Entry entry = null;
        //务必保证 finally 会被执行
        try {
    
            // 资源名可使用任意有业务语义的字符串开启资源的保护
            entry = SphU.entry(resourceName);
            //被保护的业务逻辑method
            //do something...
        } catch (BlockException ex) {
    
            //资源访问阻止,被限流或被降级
            //Sentinel定义异常 流控规则,降级规则,热点参数规则。。服务降级(降级规则)
            //进行相应的处理操作
            log.info("block!!!");
            return "被流控了";
        } catch (Exception ex) {
    

            //若需要配置降级规则,需要通过这种方式记录业务异常RuntimeExceptionmock feign:fallback
            Tracer.traceEntry(ex, entry);
        } finally {
    
            //务必保证 exit,务必保证每个 entry 与 exit 配对
            if (entry != null) {
    
                entry.exit();
            }
        }
        return "flow";
    }

    @PostConstruct
    private void initFlowQpsRule() {
    
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule(resourceName);
        // set limit qps to 20
        rule.setCount(2);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

}

可使用注解的方式简介编写@SentinelResource,使用@SentinelResource注意事项可以查看注解埋点官网

package com.test.order.controller;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.Tracer;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description:
 * @Author: xu
 * @Data: 2024-2024/3/29-16
 * @Version: V1.0
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    

    private final static String resourceName = "flow";

    private static Logger log = LoggerFactory.getLogger(OrderController.class);


    //blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。
    // blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。
    // blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析
    //fallback / fallbackClass:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。
    // fallback 函数可以针对所有类型的异常
    //blockHandler的优先级比fallback高,官网中都有讲解 https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
   
    @RequestMapping("/flow")
    @SentinelResource(value = resourceName, blockHandler = "exceptionHandler",fallback = "helloFallback")
    public String flow() {
    
        System.out.println("aaaaaaaaaaaaaaaaa");
       //被保护的业务逻辑method
       //do something...
        return "flow";
    }

    public String exceptionHandler(BlockException ex) {
    
        // Do some log here.
        ex.printStackTrace();
        return "被流控了";
    }
    
    // Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.
    public String helloFallback(long s) {
    
        return String.format("Halooooo %d", s);
    }

    @PostConstruct
    private void initFlowQpsRule() {
    
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule(resourceName);
        // set limit qps to 20
        rule.setCount(2);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

}

这是降级规则,保存在代码中

@PostConstruct
private void initDegradeRule() {
    
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(resourceName);
    // set threshold RT, 10 ms
    rule.setCount(10);
    rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
    rule.setTimeWindow(10);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

    @RequestMapping("/degrade")
    @SentinelResource(value = resourceName, entryType = EntryType.IN,  blockHandler = "exceptionHandler2", fallback = "helloFallback2")
    public String degrade() {
    
        throw new RuntimeException("异常");
    }

其他的规则都是类似的原理可以查看官网使用

全局异常处理捕抓(注意必须和方法返回值类型一样),这样只需要添加规则后,有任何sentinel动作就会执行以下语句

package com.test.order.exception;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description:
 * @Author: xu
 * @Data: 2024-2024/4/15-15
 * @Version: V1.0
 */
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
    

    Logger logger = LoggerFactory.getLogger(MyBlockExceptionHandler.class);

    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
    

        logger.info(e.getRule().toString());

        if (e instanceof FlowException) {
    
            logger.error("接口限流了");

        } else if (e instanceof DegradeException) {
    
            logger.error("服务降级了");

        } else if (e instanceof ParamFlowException) {
    
            logger.error("热点参数限流了");
        } else if (e instanceof SystemBlockException) {
    
            logger.error("触发系统保护规则了");
        } else if (e instanceof AuthorityException) {
    
            logger.error("授权规则不通过");
        }

        //返回json数据
        httpServletResponse.setStatus(500);
        httpServletResponse.setCharacterEncoding("utf-8");
        httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
        new ObjectMapper().writeValue(httpServletResponse.getWriter(),"异常");
    }
}

整合后可以在界面查看

在这里插入图片描述

如果项目是springcloud项目,可以直接在yml配置

server:
  port: 8079
spring:
  application:
    name: order-sentinel
  cloud:
    sentinel:
      transport:
        dashboard: 192.168.11.47:8858
        #注意:yml配置client-ip 是本地ip才行
        client-ip: 192.168.11.50
        port: 8719

pom.xml依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_19891197/article/details/137723377

智能推荐

关于simplis仿真和驱动方法-程序员宅基地

文章浏览阅读9k次,点赞4次,收藏34次。转自:http://bbs.21dianyuan.com/thread-233723-1-1.html1.1.4 驱动线路(死区控制、隔离变压器)A.互补驱动(带死区控制)实现方式,UC3843的PWM输出用逻辑非门芯片取反,然后利用RCD做死区,经驱动IC HIP2101(仿真软件自带驱动芯片模型),得到两路带死区的互补驱动信号PWM1和PWM2,如下图所示:该电路可用来做同步Buck,同..._simplis

软件构建(转)_软件构建是什么意思-程序员宅基地

文章浏览阅读5.2k次。1、什么是构建你一定知道“构建(construction)”一次在软件开发领域以外的含义。“构建”就是“建筑工人(construction workers)”在建设一栋房屋,一所学校,乃至一座摩天大楼时所做的工作。在你年轻时,可能也曾用“硬纸板(construction paper)”构建过什么东西吧。按照一般的用法,“构建”是指建设的过程。构建过程可能包含有计划、设计、检查工作的一些方面,但..._软件构建是什么意思

reboot后centos服务器无法ssh连接_服务器重启reboot 无法连接-程序员宅基地

文章浏览阅读9.4k次,点赞2次,收藏10次。问题描述安装好了centOS服务器,一直用Secure CRT工具通过ssh服务来远程连接linux,很方便的进行各种操作。今天偶然尝试了一下在非root的一般用户下执行重启服务器的命令,发现一般用户是没有权限执行重启的,果断使用sudo命令再次执行,终于重启成功,却发现Secure CRT再也连不上服务器了,郁闷不已,去网上查找各种资料总算有了一点粗浅的认识,记录下来,也让其他的linux beginner们能够少走些弯路吧。普通用户下执行重启命令:shutdown -r now 或者 _服务器重启reboot 无法连接

启动Tomcat时报错:java.util.zip.ZipException: invalid LOC header (bad signature)_"[\"ajp-nio-8012\"]"-程序员宅基地

文章浏览阅读916次。详细错误:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/coin-deal]] at java...._"[\"ajp-nio-8012\"]"

神奇的layer,layer 的使用方法详解(转载官网,你想要的提示框都有)_doc/modules/layer.html-程序员宅基地

文章浏览阅读5.7k次,点赞2次,收藏11次。转载:http://www.layui.com/doc/modules/layer.html弹层组件文档 - layui.layerlayer 至今仍作为 layui 的代表作,她的受众广泛并非偶然,而是这数年来的坚持、不弃的执念,将那些不屑的眼光转化为应得的尊重,不断完善和维护、不断建设和提升社区服务,在 Web 开发者的圈子里口口相传,乃至于成为今天的 layui 最强劲的源动力。目前,lay..._doc/modules/layer.html

8086CPU汇编语言程序格式_8086汇编 精简教程-程序员宅基地

文章浏览阅读871次,点赞19次,收藏18次。汇编语言程序格式_8086汇编 精简教程

随便推点

LDPC译码:和积译码算法(SPA)、最小和算法(MSA)、分层译码算法(LBP)、动态信息更新策略IDS(含RBP、NW-RBP、SVNF-RBP)的MATLAB实现_最小和译码算法-程序员宅基地

文章浏览阅读1.8w次,点赞32次,收藏232次。LDPC各类译码方法的MATLAB实现主要内容新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入主要内容LDP..._最小和译码算法

新手C语言开发详细教程_安装c语言-程序员宅基地

文章浏览阅读1.1k次。C语言开发编译工具gcc的详细安装教程(图文)_安装c语言

【前端】前端及其技术栈_前端技术栈-程序员宅基地

文章浏览阅读1.5w次,点赞32次,收藏272次。文章目录0)前端1、什么是前端?2、为什么需要前端?前端的发展简史:3、前端开发的类型Web前端开发:客户端(APP)开发:4、前端与后端的交互Ajax:Socket:*前端技术栈1)核心语言1.1 HTML什么是HTML?HTML如何描述网页?HTML文档与网页的关系?1.2 CSS什么是CSS?为什么使用CSS?1.3 JavaScript(JS)什么是JavaScript?JavaScript的作用?2)基础技术2.1 AJAX什么是AJAX?AJAX的工作原理?2.2 JSON什么是JSON?为什么_前端技术栈

JWT单点登录功能_jeeccg 登录功能-程序员宅基地

文章浏览阅读1k次。如题,要使用Spring Boot + JWT + VUE + Node.js实现单点登录功能_jeeccg 登录功能

05-RabbitMQ 面试题-程序员宅基地

文章浏览阅读894次,点赞21次,收藏11次。rabbit mq 面试题

全开源即时通讯(IM)系统 高仿微信_wildfirechat-程序员宅基地

文章浏览阅读3.5w次,点赞19次,收藏67次。android-chat项目地址:wildfirechat/android-chat简介:全开源即时通讯(IM)系统 高仿微信更多:作者提 Bug官网标签:野火 IM 是一套跨平台、全开源的即时通讯解决方案,主要包含以下内容。仓库 说明 备注 android-chat 野火 IM Android SDK 源码和 App 源码..._wildfirechat