Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】

一、Sentinel整合openfeign

1、复制一下order-openfeign项目(创建order-openfeign-sentinel)


然后在stock-nacos当中编写对应的接口

java 复制代码
    @RequestMapping("/reduct2")
    public String reduct2(){
        int a = 1/0;

        System.out.println("扣减库存");
        return "扣减库存:"+port;
    }

在order-openfeign-sentinel当中编写对应的调用微服务的业务逻辑

java 复制代码
@FeignClient(name = "stock-service",path = "/stock",configuration = FeignConfig.class)
public interface StockFeignService {
    @RequestMapping("/reduct2")
    public String reduct2();

}

编写对应的接口调用微服务

java 复制代码
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private StockFeignService stockFeignService;

    @RequestMapping("/add")
    public String add(){
        return stockFeignService.reduct2();
    }
}

完善一下配置文件

运行项目

访问:http://localhost:8041/order/add

2、Sentinel整合openfeign

引入Sentinel依赖

xml 复制代码
        <!--Sentinel依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>



java 复制代码
@Component
public class StockFeignServiceFallback implements StockFeignService{
    @Override
    public String reduct2() {
        return "降级啦!!";
    }
}
java 复制代码
/*
*
* 2、添加feign接口和方法
* name 指定调用rest接口所对应的服务名
* path 指定调用的rest接口所在的StockController指定的@RequestMapping
* */
@FeignClient(name = "stock-service",path = "/stock",fallback = StockFeignServiceFallback.class)
public interface StockFeignService {
    @RequestMapping("/reduct2")
    public String reduct2();

}

配置yml

yml 复制代码
feign:
  sentinel:
    # openfeign 整合sentinel
    enabled: true

访问:http://localhost:8041/order/add

二、热点参数限流【热点识别流控】

何为热点?热点即经常访问的数据。

很多时候我们希望统计某个热点数据中访问频次最高的数据,并对其访问进行限制。

比如:

可以在方法上对指定传入的参数做限流

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。

热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

注意:

1.热点规则需要使用@SentinelResource("resourceName")注解,否则不生效

2.参数必须是7种基本数据类型才会生效

测试用例

java 复制代码
    @RequestMapping("/get/{id}")
    @SentinelResource(value = "getById",blockHandler = "HotBlockHandler")
    public String getById(@PathVariable("id")  Integer id){
        System.out.println("正常访问");
        return "正常访问";
    }
    public String HotBlockHandler(@PathVariable("id")  Integer id, BlockException e){
        return "热点异常处理";
    }
}

对上述id参数进行流控

访问:http://localhost:8041/order/get/1




不断访问:http://localhost:8041/order/get/1

我们访问id为2 的

不断访问:http://localhost:8041/order/get/2

无论怎样访问依旧是正常

三、Sentinel控制台规则配置详解

1、系统规则

Sentinel系统自适应限流从整体维度对应用入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入

口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

  • Load自适应(仅对Linux/Unis-like机器生效)∶系统的load1作为启发指标,进行自适应系统保护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估
    算的系统容量时才会触发系统保护(BBR阶段)。系统容量由系统的maxOps * minRt估算得出。设定参考值一般是CPU cores * 2.5
    https://www.cnblogs.com/gentlemanhai/p/8484839.html

2、CPU usage (1.5.0+版本)︰当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0),比较灵敏。

不断访问

3、平均RT:当单台机器上所有入口流量的平均RT达到阈值即触发系统保护,单位是毫秒。

4、并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护

2.0x

5、入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。


访问:http://localhost:8041/order/get/1

不断访问

四、Sentinel持久化

1、Sentinel持久化模式

Sentinel规则的推送有下面三种模式:

1.1 原始模式

如果不做任何修改,Dashboard的推送规则方式是通过API将规则推送至客户端并直接更新到内存中:

这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。

1.2 拉模式

pll模式的数据源(如本地文件、RDBMS等)一般是可写入的。使用时需要在客户端注册数据源:将对应的读数据源注册至对应的 RuleManager,将写数据源注册至tansport的WritableDataSourceRegistry 中。

1.3 推模式

生产环境下一般更常用的是push模式的数据源。

对于push模式的数据源,如远程配置中心(Zookeeper Nocos,Apole等等),推送的操作不应由Sentinel客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。

因此推送规则正确做法应该是配置中心控制台/Sentiel控制台→配置中心→ Sentinel数据源→Sentinel

而不是经Sentinel数据源推送至配置中心。这样的流程就非常清晰了︰

1.3.1 基于Nacos配置中心控制台实现推送
xml 复制代码
<dependency>
	<groupId>com.alibaba.csp</groupId>
	<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

nacos配置中心中配置流控规则

1.3.2 配置nacos

http://192.168.180.128:8849/nacos/#/configurationManagement?dataId=&group=&appName=&namespace=&pageSize=&pageNo=

json 复制代码
[
    {
        "resource": "/order/flow",
        "controlBehavior": 0,
        "count": 10.0,
        "grade": 1,
        "limitApp": "default",
        "startegy": 0
    }
]
xml 复制代码
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--sentinel启动器-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
    </dependencies>

设置对应的配置文件

yml 复制代码
server:
  port: 8861
spring:
  application:
    name: order-sentinel
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8858
      web-context-unify: false #默认将调用链路收敛
      datasource:
        flow-rule:
          nacos:
            server-addr: 192.168.180.128:8849
            username: nacos
            password: nacos
            dataId: order-sentinel-flow-rule
            rule-type: flow

访问:http://127.0.0.1:8861/order/flow

不断连续点击访问

我们可以看到
http://127.0.0.1:8858/#/dashboard/flow/order-sentinel

sentinel被持久化了

相关推荐
不会编程的懒洋洋19 分钟前
Spring Cloud Eureka 服务注册与发现
java·笔记·后端·学习·spring·spring cloud·eureka
赖龙24 分钟前
java程序打包及执行 jar命令及运行jar文件
java·pycharm·jar
U12Euphoria26 分钟前
java的runnable jar采用exe和.bat两种方式解决jre环境的问题
java·pycharm·jar
java小吕布1 小时前
Java Lambda表达式详解:函数式编程的简洁之道
java·开发语言
程序员劝退师_1 小时前
优惠券秒杀的背后原理
java·数据库
java小吕布1 小时前
Java集合框架之Collection集合遍历
java
一二小选手1 小时前
【Java Web】分页查询
java·开发语言
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
idea 弹窗 delete remote branch origin/develop-deploy
java·elasticsearch·intellij-idea
Code成立1 小时前
《Java核心技术 卷I》用户图形界面鼠标事件
java·开发语言·计算机外设
鸽鸽程序猿2 小时前
【算法】【优选算法】二分查找算法(下)
java·算法·二分查找算法