news 2026/5/29 1:34:23

强强联合:OpenFeign 整合 Sentinel

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
强强联合:OpenFeign 整合 Sentinel

前言

书接前文:

微服务间的远程接口调用:OpenFeign 的使用

当项目中使用了OpenFeign后,可以很方便的进行远程服务调用,现在有个问题,假如远程服务出现故障了,调不了远程的接口,这边又着急等着返回结果,怎么办呢?

当然是使用服务降级,本篇就使用OpenFeign进行远程调用,并结合Sentinel对出现的异常、故障等问题进行服务降级。

准备

本章代码仓库:https://github.com/iweidujiang/spring-cloud-alibaba-lab

示例模块:08-feign-sentinel,在feign-sentinel-service中整合 OpenFeign 与 Sentinel。

仍以前面第 7 章open-feign-service的思路为调用方、nacos-provider为提供方来进行操练(本章代码位于08-feign-sentinel目录)。

Jar 包依赖

feign-sentinel-service除引入spring-cloud-starter-openfeign外,再引入spring-cloud-starter-alibaba-sentinel组件;使用 Nacos 配置中心做 Sentinel 限流规则持久化,还需引入spring-cloud-alibaba-sentinel-datasourcesentinel-datasource-nacos

<dependency><groupId>io.github.iweidujiang</groupId><artifactId>feign-sentinel-common</artifactId><version>1.0.0</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>

配置文件

配置文件application.yml

spring:application:name:open-feign-servicecloud:nacos:discovery:server-addr:${NACOS_SERVER:127.0.0.1:8848}sentinel:transport:dashboard:${SENTINEL_DASHBOARD:localhost:8080}port:8723web-context-unify:falsedatasource:flow:nacos:server-addr:${NACOS_SERVER:127.0.0.1:8848}groupId:DEFAULT_GROUPdataId:sentinelFlowRule.jsonrule-type:flowfeign:client:config:default:connectTimeout:5000readTimeout:5000nacos-provider:connectTimeout:1000readTimeout:1000loggerLevel:fullsentinel:enabled:true

限流规则 JSON 示例见仓库08-feign-sentinel/config/sentinelFlowRule.json

这里增加了Sentinel的数据持久化内容,以及激活OpenFeignSentinel联合使用的feign.sentinel.enabled=true配置。

全局统一异常处理

不管是Sentinel限流后返回,还是OpenFeignfallback返回,本质上他们都是出现异常了,这里配置一下全局的统一异常处理。

首先,增加一个业务异常类(io.github.iweidujiang.lab08.common.exception.BusinessException):

/** * 业务异常。 * * @author 苏渡苇 */publicclassBusinessExceptionextendsRuntimeException{privatefinalStringcode;privatefinalStringmessage;publicBusinessException(Stringcode,Stringmessage){super(message);this.code=code;this.message=message;}publicStringgetCode(){returncode;}@OverridepublicStringgetMessage(){returnmessage;}}

然后使用@RestControllerAdvice进行全局异常处理:

@ExceptionHandler(BusinessException.class)publicResponseResult<String>businessException(BusinessExceptione){LOGGER.info("code={}, message={}",e.getCode(),e.getMessage());returnResponseResult.fail(e.getCode(),e.getMessage());}

这样,只要指定了抛出的异常类型,就会返回统一的响应格式。

操练

@FeignClient 的 fallback

在上一篇文章中,我们通过FeignClient接口调用远程的服务:

@FeignClient(name="nacos-provider",fallback=ProductServiceImpl.class)publicinterfaceProductService{@GetMapping("/product/{id}")StringgetProductById(@PathVariable("id")Longid);}

定义 fallback 实现类:

@ComponentpublicclassProductServiceImplimplementsProductService{@OverridepublicStringgetProductById(Longid){log.error("调用接口 getProduct 失败,id={}",id);thrownewBusinessException(ResponseCode.RPC_ERROR.getCode(),ResponseCode.RPC_ERROR.getMessage());}}

TipsResponseCode.RPC_ERRORfeign-sentinel-common模块中定义(C0001/ 远程调用失败)。

OK,不启动服务提供方nacos-provider,直接调用接口测试。

接口返回:

控制台打印信息:

这样就实现了fallback的容错处理,即时远程服务不可用,也能进行降级处理。

@SentinelResource 限流

在 Controller 层使用 FeignClient 定义的接口进行远程调用服务时,还可以定义 Sentinel 资源,并设置规则对资源进行限流。

@SentinelResource的一些使用方法在前几篇文章中已有提及,这里再结合OpenFeign使用,本例中有如下定义:

@GetMapping("/product/{id}")@SentinelResource(value="getProduct",blockHandler="getProductBlock",fallback="getProductFallback")publicStringgetProduct(@PathVariable("id")Longid){returnproductService.getProductById(id);}publicStringgetProductBlock(Longid,BlockExceptione){log.error("访问资源 getProduct 被限流,id={}",id);thrownewBusinessException("C0002","访问资源 getProduct 被限流");}publicStringgetProductFallback(Longid){log.error("访问资源 getProduct fallback");return"请稍后重试";}

在前面的准备工作中,我们已经配置了 Sentinel 资源限流规则持久化到 Nacos,现在 Nacos 中配置一下资源getProduct的限流规则:

[{"resource":"getProduct","limitApp":"default","grade":1,"count":1,"strategy":0,"controlBehavior":0,"clusterMode":false}]

限流规则是 QPS 阈值为1,只要我1秒大于1次请求就会被限流。

启动远程服务nacos-provider,下面来验证一下。

1秒只发一个请求的结果:

1秒内快速刷新几次,造成QPS大于1,将会被限流:

小结

  • OpenFeign整合Sentinel需要引入Sentinel相关依赖包;
  • 在配置文件通过feign.sentinel.enabled=true来开启 Feign 与 Sentinel的结合使用;
  • @FeignClient注解中增加fallback属性,该属性定义远程接口访问有问题时的容错处理逻辑的类;
  • fallback定义的类需实现@FeignClient定义的接口。

点个赞再走吧~

先赞后看,养成习惯。

举手之劳,赞有余香。


本文创作于 2022-08-19 。

代码仓库已更新:https://github.com/iweidujiang/spring-cloud-alibaba-lab

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 1:33:17

我采访了五个一人公司老板,发现他们都有一个共同点

【摘要】 五个不同行业的一人公司经营者&#xff0c;从设计师到咨询顾问到独立开发者。他们的启动方式、获客渠道、收入规模各不相同&#xff0c;但有一个共同特征&#xff1a;都不是毕业生&#xff0c;都在专业领域泡了至少五年。本文还原他们的真实状态。AI时代为什么会出现O…

作者头像 李华
网站建设 2026/5/29 1:31:27

2026-05-29:二进制中恰好K个1的第N小整数。用go语言,给定两个正整数 n 和 k,要求你找到这样一个数:在它的二进制表示中,恰好有 k 个比特位为 1。把所有满足条件的正整数按大小从小到大

2026-05-29&#xff1a;二进制中恰好K个1的第N小整数。用go语言&#xff0c;给定两个正整数 n 和 k&#xff0c;要求你找到这样一个数&#xff1a;在它的二进制表示中&#xff0c;恰好有 k 个比特位为 1。把所有满足条件的正整数按大小从小到大排序&#xff0c;返回其中第 n 个…

作者头像 李华
网站建设 2026/5/29 1:31:01

Redis后端分布式与高并发架构演进

这七张图片构成了一个非常系统化的、由浅入深的后端分布式与高并发架构演进知识图谱。 我将按照网络基础 →\rightarrow→ 性能优化&#xff08;连接池&#xff09; →\rightarrow→ 多路复用&#xff08;高并发核心&#xff09; →\rightarrow→ 解耦异步&#xff08;消息队列…

作者头像 李华
网站建设 2026/5/29 1:30:03

Keil MDK与J-Trace调试Cortex-M7的跟踪功能问题解析

1. 问题现象与背景分析最近在使用Keil MDK配合Segger J-Trace Pro调试器对Cortex-M7设备进行开发时&#xff0c;遇到了一个令人困扰的问题。当尝试在Vision中启用SWO跟踪或ETM跟踪功能时&#xff0c;调试会话无法正常启动&#xff0c;系统总是报错"Trace HW not present&q…

作者头像 李华
网站建设 2026/5/29 1:25:01

CentOS 7/8上5分钟搞定Pure-FTPd:从YUM安装到创建虚拟用户(保姆级教程)

CentOS 7/8极速部署Pure-FTPd&#xff1a;虚拟用户配置与安全实践指南在当今企业文件共享和远程协作场景中&#xff0c;FTP服务依然扮演着不可替代的角色。Pure-FTPd以其轻量级、高安全性和易用性&#xff0c;成为众多运维人员的首选解决方案。本文将带您探索如何在CentOS 7/8系…

作者头像 李华