Spring Cloud Alibaba —Sentinel

简介: Sentinel分享篇

2.Sentinel

spring cloud alibaba 整合 sentinel

1.引入alibaba-sentinel的starter依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>


2.配置application.yml文件

server:
  port: 8010
spring:
  application:
    name: order-sentinel-dev
  cloud:
    sentinel:
      transport:
 #注意 这里是我的vmware centos服务器的IP 
 #需要把这里的ip和端口换成你自己的sentinel dashboard的jar包进程端口
        dashboard: 192.168.86.88:8333


上面提及的sentinel的dashboard需要提供一个jar包进程

并不是内嵌在上面的maven依赖里面的是一个单独的服务

如何 下载jar 并启动该dashboard  

找到sentinel的github 下载对应的jar      https://github.com/alibaba/Sentinel/releases

#8333是我自定义的  可以替换修改

java -Dserver.port=8333 -Dcsp.sentinel.dashboard.server=localhost:8333 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.x.x.jar

启动好之后 运行项目  先请求几次接口  随后访问dashboard      

访问的url是我们  

yml里面配置的  192.168.86.88:8333

Sentinel

QPS   线程数

  1. 流量控制
  • 直接流控
  • 关联流控  
  • 链路流控

自定义流量控制

@RequestMapping("/hello")
@SentinelResource(value="hello",blockHandler="helloBlockHandler")
publicStringgetHello() {
return"hello! hello!";
    }
@RequestMapping("/helloThread")
@SentinelResource(value="helloThread",blockHandler="helloBlockHandler")
publicStringgetHelloThread() throwsInterruptedException {
TimeUnit.SECONDS.sleep(5);
return"hello! hello!";
    }
//BlockException publicStringhelloBlockHandler(BlockExceptione){
return"服务被流控了!";
    }
自定义异常统一处理packagecom.example.ordersentinel.domain;
/*** @ClassName Result* @Description* @Author Jackson* @Date 2023/4/13* @Version 1.0**/publicclassResult<T> {
privateIntegercode;
privateStringmsg;
privateTdata;
publicResult() {
    }
publicResult(Integercode, Stringmsg) {
this.code=code;
this.msg=msg;
    }
publicResult(Integercode, Stringmsg, Tdata) {
this.code=code;
this.msg=msg;
this.data=data;
    }
publicIntegergetCode() {
returncode;
    }
publicvoidsetCode(Integercode) {
this.code=code;
    }
publicStringgetMsg() {
returnmsg;
    }
publicvoidsetMsg(Stringmsg) {
this.msg=msg;
    }
publicTgetData() {
returndata;
    }
publicvoidsetData(Tdata) {
this.data=data;
    }
publicstaticResulterror(Integercode, Stringmsg) {
returnnewResult(code, msg);
    }
}
packagecom.example.ordersentinel.exception;
importcom.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
importcom.alibaba.csp.sentinel.slots.block.BlockException;
importcom.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
importcom.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
importcom.alibaba.csp.sentinel.slots.block.flow.FlowException;
importcom.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
importcom.alibaba.csp.sentinel.slots.system.SystemBlockException;
importcom.example.ordersentinel.domain.Result;
importcom.fasterxml.jackson.databind.ObjectMapper;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.http.MediaType;
importorg.springframework.stereotype.Component;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/*** @ClassName MyBlockExceptionHandler* @Description* @Author Jackson* @Date 2023/4/13* @Version 1.0**/@ComponentpublicclassMyBlockExceptionHandlerimplementsBlockExceptionHandler {
privatestaticfinalIntegerFLOWEXCECODE=100;
privatestaticfinalIntegerDEGRADEEXCECODE=101;
privatestaticfinalIntegerPARAMFLOWEXCECODE=102;
privatestaticfinalIntegerSYSTEMBLOCKEXCECODE=103;
privatestaticfinalIntegerAUTHORITYEXCECODE=104;
Loggerlogger=LoggerFactory.getLogger(this.getClass());
@Overridepublicvoidhandle(HttpServletRequesthttpServletRequest, HttpServletResponsehttpServletResponse, BlockExceptione) throwsException {
logger.info("BlockExceptionHandler-----------------{}", e.getRule());
Resultr=null;
if (einstanceofFlowException) {
r=Result.error(FLOWEXCECODE, "接口限流");
        } elseif (einstanceofDegradeException) {
r=Result.error(DEGRADEEXCECODE, "服务降级");
        } elseif (einstanceofParamFlowException) {
r=Result.error(PARAMFLOWEXCECODE, "热点参数限流");
        } elseif (einstanceofSystemBlockException) {
r=Result.error(SYSTEMBLOCKEXCECODE, "触发系统保护规则");
        } elseif (einstanceofAuthorityException) {
r=Result.error(AUTHORITYEXCECODE, "授权不通过");
        }
httpServletResponse.setStatus(500);
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
newObjectMapper().writeValue(httpServletResponse.getWriter(), r);
    }
}



流控效果

  • 快速失败  
  • Warm up
  • 排队等待
目录
相关文章
|
1月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
1448 53
|
1月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
2803 42
|
1月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
2月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
1698 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
7月前
|
人工智能 Java API
MCP协议重大升级,Spring AI Alibaba联合Higress发布业界首个Streamable HTTP实现方案
本文由Spring AI Alibaba Contributor刘军、张宇撰写,探讨MCP官方引入的全新Streamable HTTP传输层对原有HTTP+SSE机制的重大改进。文章解析Streamable HTTP的设计思想与技术细节,并介绍Spring AI Alibaba开源框架提供的Java实现,包含无状态服务器模式、流式进度反馈模式等多种场景的应用示例。同时,文章还展示了Spring AI Alibaba + Higress的完整可运行示例,分析当前实现限制及未来优化方向,为开发者提供参考。
|
3月前
|
人工智能 Java 开发者
邀您参与 “直通乌镇” Spring AI Alibaba 开源竞技挑战赛!
邀您参与 “直通乌镇” Spring AI Alibaba 开源竞技挑战赛!

热门文章

最新文章