Sentinel 流控-链路模式

链路模式

A B C 三个服务

A 调用 C

B 调用 C

C 设置流控 ->链路模式 -> 入口资源是 A

A、B 服务

java 复制代码
package com.learning.springcloud.order.controller;


import com.learning.springcloud.order.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 链路模式:
 *    条件:
 *      - A ---> C; B -> C
 *      - C 设置流控规则 入口资源是A
 */
@RestController
@RequestMapping("/lianlu")
public class LianLuController {

    @Autowired
    BaseService baseService;

    @RequestMapping("/A")
    public Object A() {
        String s = baseService.queryC();
        return "hi, A;" + s;
    }

    @RequestMapping("/B")
    public Object B() {
        String s = baseService.queryC();
        return "hi, B;" + s;
    }

}

C 服务

java 复制代码
package com.learning.springcloud.order.service;

public interface BaseService {

    public String queryC();
}
java 复制代码
package com.learning.springcloud.order.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.learning.springcloud.order.service.BaseService;
import org.springframework.stereotype.Service;

@Service
public class BaseServiceImpl implements BaseService {

    @Override
    @SentinelResource(value = "queryC")
    public String queryC() {
       return "查询C";
    }
}

控制台

设置链路收集

java 复制代码
server:
  port: 8061

spring:
  application:
    name: order-sentinel
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
      web-context-unify: false # 默认请求链路进行收敛

设置流控规则

  • 链路 入口 A

访问

**问题:**为啥没有流控处理的消息而是访问报错???

问题解决

分析:

  1. 使用 注解 @SentinelResource 则无法使用全局异常处理

  2. 增加注解 blockHandler 属性以及方法

java 复制代码
package com.learning.springcloud.order.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.learning.springcloud.order.service.BaseService;
import org.springframework.stereotype.Service;

@Service
public class BaseServiceImpl implements BaseService {
    @Override
    @SentinelResource(value = "queryC", blockHandler = "blockHandlerForQueryC")
    public String queryC() {
       return "查询C";
    }

    public String blockHandlerForQueryC(BlockException be) {
        return "queryC 被流控了!!!";
    }
}
  • 再次访问 可以正常返回流控处理消息
相关推荐
程序员清风35 分钟前
专业再升级!程序员专属显示器明基RD280UG上手实测!
java·后端·面试
Lam Tang2 小时前
APS 系列文章 08
java·代理模式
萧瑟余晖3 小时前
Java深入解析篇三十三之消息队列
java·开发语言
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
IT爱学堂3 小时前
尚硅谷Java+AI大模型应用开发革新版本 2025年3月
java·开发语言·人工智能
不爱编程的小九九4 小时前
小九源码-springboot004-springboot智能阅读推荐系统
java·spring boot·后端
SCandL1524 小时前
Docker的实战应用
java·docker·容器
LayZhangStrive4 小时前
后端通识 - 远程服务调用RPC
网络·网络协议·rpc·sentinel·openfeign·远程服务调用
AC赳赳老秦4 小时前
OpenClaw 多源采集公开行业数据:从原始信息到研究报告初稿的自动化实践
java·c语言·c++·python·php·deepseek·openclaw
Java成神之路-5 小时前
深入理解三大高频队列:ArrayDeque、LinkedList、PriorityQueue 方法、特性与场景选择
java