编辑
2025-10-18
java
00

目录

1.下载sentinaljar包
2.启动jar包
3.进入控制台
4.配置sentinel
5.在项目中引入sentinal
6.配置sentinel
(1)关联限流
(2)链路模式
(3)流控效果
(4)排队等待
(5)热点参数配置
7.线程隔离和降级
(1)FegienClient整合Sentienl
8.授权规则

1.下载sentinaljar包

image.png

2.启动jar包

image.png

cmd
java -jar sentinel-dashboard-1.8.1.jar

3.进入控制台

image.png

4.配置sentinel

image.png

5.在项目中引入sentinal

POM
<!-- sentinel依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>

配置XML

XML
sentinel: transport: dashboard: localhost:8070

image.png

6.配置sentinel

簇点链路

image.png

image.png

高级选项

image.png

(1)关联限流

当一个服务请求达到阈值对另一个服务做限制

image.png

案例

image.png

编写测试服务端点

java
@GetMapping("query") public String queryOrderTest(){ return "查询数据"; } @GetMapping("update") public String updateOrderTest(){ return "更新数据"; }

发送请求使Sentinel监控服务端点

image.png

添加关联端点

image.png

模拟请求update,query被限流

image.png

(2)链路模式

只统计从指定链路访问本资源的请求

image.png

例子

image.png

java
// controller @GetMapping("query") public String queryOrderTest(){ // 调用查询商品的方法 orderService.queryGoods(); System.out.println("查询订单"); return "查询订单"; } @GetMapping("save") public String saveOrderTest(){ // 调用查询商品的方法 orderService.queryGoods(); System.out.println("新增订单"); return "新增订单"; }
java
// service 模拟查询数据 public void queryGoods() { System.err.println("查询商品"); }

修改sentinel监控 关闭context整合

image.png

显示出service的方法

image.png

配置关联限制

image.png

(3)流控效果

决定请求失败时如何处理

image.png

image.png

配置 warn up

image.png

请求逐步通过

image.png

(4)排队等待

让进入的请求按照规定的时间间隔排队

image.png

image.png

(5)热点参数配置

image.png

例子

image.png image.png

修改代码

java
@SentinelResource("hot") // 添加注解 @GetMapping("{orderId}") public Order queryOrderByUserId(@PathVariable("orderId") Long orderId,@RequestHeader(value = "Truth",required = false) String truth) { System.out.println("truth"+truth); return orderService.queryOrderById(orderId); }

image.png

7.线程隔离和降级

(1)FegienClient整合Sentienl

线程隔离(舱闭模式) 熔断降级

image.png

想办法编写备用方案

image.png

步骤一

image.png

步骤二

image.png

XML
feign: sentinel: enabled: true # 开启Feign对sentinel的支持

编写Factory

java
package cn.itcast.feign.clients.fallback; import cn.itcast.feign.clients.UserClient; import cn.itcast.feign.pojo.User; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j; @Slf4j public class UserClientFallBackFactory implements FallbackFactory<UserClient> { @Override public UserClient create(Throwable throwable) { return new UserClient (){ @Override public User getUserById(Long id) { log.error("查询日志异常",throwable); return new User(); } }; } }

添加到Bean管理

java
@Bean public UserClientFallBackFactory userClientFallBackFactory(){ return new UserClientFallBackFactory(); }

修改装饰器

java
@FeignClient(value = "userservice",fallbackFactory = UserClientFallBackFactory.class)

image.png

隔离方式

image.png

两种隔离方式的优缺点

image.png

实现线程隔离

image.png

image.png

超出限制的请求会执行Factory中的方法

console
2025-10-28 22:58:33.338 ERROR 22416 --- [nio-8080-exec-6] c.i.f.c.f.UserClientFallBackFactory : 查询日志异常 com.alibaba.csp.sentinel.slots.block.flow.FlowException: null

熔断降级

image.png

熔断策略-慢调用

image.png

熔断策略-异常比例,异常数

image.png

8.授权规则

对请求者的身份进行判断

image.png

image.png

在网关的请求添加请求头判断是否为网关的请求

image.png

java
package cn.itcast.order.sentinel; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; @Component public class HeaderOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest request) { // 尝试获取请求头 String origin = request.getHeader("origin"); if (StringUtils.isEmpty(origin)) { return "blank"; } return origin; } } // 对服务端重写原有的接口
XML
在gateway端添加origin请求头 - AddRequestHeader=origin,gateway

在sentinel添加规则

image.png

阻止除了网关来源的请求访问服务

自定义异常

image.png

实现接口

java
package cn.itcast.order.sentinel; 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 org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class SentinelBlockHandler implements BlockExceptionHandler { @Override public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception { String msg = "未知异常"; int status = 429; if (e instanceof FlowException) { msg = "请求被限流了"; }else if (e instanceof DegradeException) { msg = "请求被降级了"; } else if (e instanceof ParamFlowException) { msg = "热点参数限流"; } else if (e instanceof AuthorityException) { msg = "请求没有权限"; status = 401; } httpServletResponse.setContentType("application/json;charset=utf-8"); httpServletResponse.setStatus(status); httpServletResponse.getWriter().println("{\"message\":\""+msg+"\",\"status\":"+status+"}"); } }

规则持久化

解决sentinel在服务重启时配置的规则消失

规则管理模式

规则管理有3种模式

原始模式(不支持持久化)

pull模式

image.png

push模式

image.png

本文作者:钱小杰

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!