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();
    }
复制代码

 

 

posted @   创客未来  阅读(177)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示