Sentinel 服务熔断 Ribbon
一、建立生产者模块
创建两个生产者9001端口和9002端口,便于测试Ribbon负载均衡。
1.1建立一个Module
建立一个名称为“cloudalibaba-provider-payment9001”Module
1.2 改POM
<?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> <artifactId>springcloud-nacos</artifactId> <groupId>com.ckfuture.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment9001</artifactId> <dependencies> <!--SpringCloud alibaba nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
1.3 建YML
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
1.4 主启动类
package com.ckfuture.springcloud.alibaba; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @descrption: 生产提供者-主启动类 * @author: CKFuture * @since: 2022-02-14 10:37 * @version: v1.0 * @LastEditTime: * @LastEditors: * @copyright: hrbckfuture.com */ @SpringBootApplication @EnableDiscoveryClient public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class,args); } }
1.5 业务类
package com.ckfuture.springcloud.alibaba.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; /** * @descrption: 生产提供者 * @author: CKFuture * @since: 2022-02-14 10:21 * @version: v1.0 * @LastEditTime: * @LastEditors: * @copyright: hrbckfuture.com */ @RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id){ return "nacos registry,serverPort:"+serverPort+"\t id"+id; } }
参考9001建立9002
二、建立消费者模块
2.1 建立Module
建立名称为“cloudalibaba-consumer-nacos-order84”的Module
2.2 改POM
<?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> <artifactId>springcloud-nacos</artifactId> <groupId>com.ckfuture.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-consumer-nacos-order84</artifactId> <dependencies> <!--SpringCloud alibaba nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--web+actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
2.3 建YML
server: port: 84 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 sentinel: transport: #配置Sentinel dashboard地址 dashboard: localhost:8080 port: 8719 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
2.4 主启动类
package com.ckfuture.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class OrderNacosMain84 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain84.class,args); } }
2.5 业务类
package com.ckfuture.springcloud.controller; import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController public class OrderNacosController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping(value = "/consumer/fallback/{id}") @SentinelResource(value="fallback",fallback = "handlerFallback",blockHandler = "blockHandler") public String paymentInfo(@PathVariable("id") Long id) { //生产者提供的访问地址 String result = restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); if(id==4){ throw new IllegalArgumentException("IllegalArgumentException,非法参数异常..."); }else if(result==""){ throw new NullPointerException("NullPointerException,空指针异常"); } return result; } //fallback 只负责业务异常 public String handlerFallback(@PathVariable Long id,Throwable e){ return "兜底异常handlerFallback,exception内容"+e.getMessage(); } // blockHandler 只负责sentinel控制台配置违规
public String blockHandler(@PathVariable Long id, BlockException blockException){ return "blockHandler-sentinel限流,blockException:"+blockException.getMessage(); } }
三、测试
启动 9001和9002生产者
此时在Nacos中可以查看两个服务提供者
启动消费者84
3.1 测试负载均衡
在合理的数据范围内请求数据
3.2 测试fallback
3.3 测试sentinel
在Sentinel中新增流控规则
快速请求触发限流兜底方法
总结:
若blockHandler和fallback都进行了配置,则被限流降级而抛出BlockException时只会进入blockHandler处理逻辑。即blockHander高于fallback。
四、忽略属性(exceptionsTolgnore)
@GetMapping(value = "/consumer/fallback/{id}") @SentinelResource(value="fallback",fallback = "handlerFallback",blockHandler = "blockHandler", exceptionsToIgnore = {IllegalArgumentException.class}) public String paymentInfo(@PathVariable("id") Long id) { //生产者提供的访问地址 String result = restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); if(id==4){ throw new IllegalArgumentException("IllegalArgumentException,非法参数异常..."); }else if(result==""){ throw new NullPointerException("NullPointerException,空指针异常"); } return result; } //fallback 只负责业务异常 public String handlerFallback(@PathVariable Long id,Throwable e){ return "兜底异常handlerFallback,exception内容"+e.getMessage(); } // blockHandler 只负责sentinel控制台配置违规 public String blockHandler(@PathVariable Long id, BlockException blockException){ return "blockHandler-sentinel限流,blockException:"+blockException.getMessage(); }
分类:
SpringCloud
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!