SpringCloud学习(12)-SpringCloudAlibaba-Sentinel

Sentinel介绍

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

官网 home | Sentinel

下载 Releases · alibaba/Sentinel · GitHub

中文介绍 介绍 · alibaba/Sentinel Wiki · GitHub

Sentinel · alibaba/spring-cloud-alibaba Wiki · GitHub

Sentinel启动:

java -jar sentinel-dashboard-1.8.7.jar

http://localhost:8080  默认账号密码sentinel

maven依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置文件appliction.yml:

server:port: 8401spring:application:name: cloud-alibaba-sentinel-servicecloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:dashboard: localhost:8080 #配置sentinel dashboard控制台服务地址port: 8719 # 默认端口8719,如果被占用会从8719开始依次+1扫描,直至找到未被占用端口

其他配置项可参考:Sentinel · alibaba/spring-cloud-alibaba Wiki · GitHub

启动类和Controller:

import com.sunxiao.cloud.service.FlowLimitService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@Slf4j
@RestController
public class FlowLimitController {@Resourceprivate FlowLimitService flowLimitService;@GetMapping("/testA")public String testA() {return "into ... A ...";}@GetMapping("/testB")public String testB() {return "into ... B ...";}@GetMapping("/testC")public String testC() {flowLimitService.common();return "into ... C ...";}@GetMapping("/testD")public String testD() {flowLimitService.common();return "into ... D ...";}@GetMapping("/testE")public String testE() {log.info("E: {}", System.currentTimeMillis());return "into ... E ...";}@GetMapping("/testF")public String testF() {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info("熔断测试, 慢调用比例");return "into ... F ...";}@GetMapping("/testG")public String testG() {throw new RuntimeException("模拟异常");}
}import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @author sunx* @date 2024/4/2*/
@SpringBootApplication
@EnableDiscoveryClient
public class Main8401 {public static void main(String[] args) {SpringApplication.run(Main8401.class, args);}
}

启动后访问接口,查看效果:

因为sentinel默认是懒加载的,需要调用接口后才能看到.

Sentinel流控模式:

  • 直接

  • 关联

  • 链路

Sentinel流控效果:

  • 预热

  • 排队等待

  • 并发线程数

Sentinel熔断规则:

  • 慢调用比例

  • 异常比例

  • 异常数

@SentinelResource注解:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
public class RateLimitController {@GetMapping("/rateLimitByUrl")public String rateLimitByUrl() {return "限流测试未使用注解";}@GetMapping("/rateLimitByResource")@SentinelResource(value = "ByResource", blockHandler = "byResourceHandler")public String rateLimitByResource() {return "限流测试使用注解, 返回指定的字符串";}public String byResourceHandler(BlockException blockException) {return "服务不可用, 这是自定义返回的字符串";}@GetMapping("/rateLimitByFallback/{i}")@SentinelResource(value = "rateLimitByFallback", blockHandler = "byBlockHandler", fallback = "byFallback")public String rateLimitByFallback(@PathVariable("i") Integer i) {if (i == 0) {throw new RuntimeException("i == 0 异常");}return "使用注解并使用, Fallback";}public String byBlockHandler(@PathVariable("i") Integer i, BlockException blockException) {log.error("配置了自定义限流, {}", blockException.getMessage());return "服务不可用, 这是自定义返回的字符串";}public String byFallback(@PathVariable("i") Integer i, Throwable throwable) {log.error("程序逻辑异常, {}", throwable.getMessage());return "逻辑异常, 这是自定义返回的字符串";}@GetMapping("/testHotKey")@SentinelResource(value = "testHotKey", blockHandler = "testHotKeyBlockHandler")public String testHotKey(@RequestParam(value = "p1", required = false) String p1,@RequestParam(value = "p2", required = false) String p2) {return "testHotKey ...";}public String testHotKeyBlockHandler(@RequestParam(value = "p1", required = false) String p1,@RequestParam(value = "p2", required = false) String p2, BlockException blockException) {return "testHotKey blockException ...";}}

标注在方法上,可以对方法进行限流

  • 默认不用的情况下,rest接口+默认的熔断返回结果

  • 标注方法上,自定义限流返回

  • 标注方法上,自定义限流返回+服务降级处理。该情况下,达到规则条件返回blockHandler方法,方法内异常返回fallback。

Sentinel热点规则

  • 针对某个参数,传递该参数时进行限流

  • 支持例外项配置,如参数p1=1时不限流,p1等于其他值时限流

Sentinel授权规则

可以对请求方的来源进行判断和控制。具体来说,可以通过白名单和黑名单两种方式对调用方的来源进行控制。

  • 自定义处理,获取参数serverName值:

  • import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
    import jakarta.servlet.http.HttpServletRequest;
    import org.springframework.stereotype.Component;@Component
    public class CustomRequestOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {return httpServletRequest.getParameter("serverName");}
    }
    
  • 上述配置表示http://localhost:8401/testA?serverName=x​​​​​​    x=1,2以外的访问会被拒绝。

Sentinel规则持久化到nacos

maven依赖:

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

application.yml:

spring:cloud:sentinel:datasource: #sentinel持久化配置ds1:  #自定义的keynacos:server-addr: localhost:8848 #nacos地址data-id: ${spring.application.name} #nacos配置中的dataidgroup-id: DEFAULT_GROUP #nacos配置中的groupiddata-type: json #nacos配置中的datatyperule-type: flow # com.alibaba.cloud.sentinel.datasource.RuleType中的 (flow代表流控)

在nacos中设置对应规则后,可以在sentinel控制台中看到:

Sentinel规则持久化有多种方式,更多关于Sentinel规则持久化可以参考【sentinel】Sentinel规则的持久化_sentinel持久化-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/601006.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s部署efk

环境简介&#xff1a; kubernetes: v1.22.2 helm&#xff1a; v3.12.0 elasticsearch&#xff1a; 8.8.0 chart包&#xff1a;19.10.0 fluentd: 1.16.2 chart包&#xff1a; 5.9.4 kibana: 8.2.2 chart包&#xff1a;10.1.9 整体架构图&#xff1a; 一、Elasticsearch安装…

实体类转换视图类,转换器

1、以前我都是直接用spring提供的&#xff1a;BeanUtils.copyProperties(entuty, vo1);方法去转换。 2、后面又学到了转换hutool工具类的转换方法。 3、现在又学了一个利用mapstruct框架转换。 package com.jsrDom.controller;import cn.hutool.core.bean.BeanUtil; import c…

【php开发支付宝web支付】

首先介绍下 我用的框架ci 在吐槽下百度的其他人的写的都很垃圾&#xff0c;还不如自己看支付宝的开发手册了 1、composer安装支付宝的sdk composer require alipay/alipay-sdk-php安装完毕 不多哔哔 代码展示 先点地址登录支付宝以后再上我这重点下 支付宝沙箱地址 $ord…

算法中的二阶差分

众所周知&#xff0c;在往区间的每一个数都加上一个相同的数k&#xff0c;进行n次后会得到一个新的数列&#xff0c;如果每次加都循环区间挨个数加上k&#xff0c;这样时间复杂度无疑是O(n^2)&#xff0c;很高。这时可以采用一阶差分就可解决&#xff0c;这里默认会一阶差分&am…

01 _ 分布式缘何而起:从单兵,到游击队,到集团军

这里先来聊聊什么是分布式。 与其直接用些抽象、晦涩的技术名词去给分布式下一个定义&#xff0c;还不如从理解分布式的发展驱动因素开始&#xff0c;我们一起去探寻它的本质&#xff0c;自然而然地也就清楚它的定义了。 这里将介绍分布式的起源&#xff0c;是如何从单台计算…

【考研数学】张宇《1000题》刷不动,做不下来怎么办❓

学长肯定是用着效果不错才给你推荐的&#xff0c;但是习题册有很多&#xff0c;各自有不同的风格&#xff0c;1000题适不适合你的情况是你要考虑的点。 选书还是要结合自身的情况&#xff0c;如果当前用着不错的话&#xff0c;继续完全没有问题&#xff0c;核心就是要从自身的…

数据通讯平台解决方案(Word原件获取)

1.数据通讯平台方案 1.1.系统概述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 系统机构图 2.2.业务架构设计 (1) MQ消息服务 (2) TCP通讯服务 (3) CoAP通讯服务 (4) MQTT通讯服务 (5) 资源管理服务 2.3.主流技术架构分析 纵向设计方案 2.4…

Your file appears not to be a valid OLE2 document

前言 org.apache.poi.poifs.filesystem.NotOLE2FileException:Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document解决 Excel兼容模式打开老版本文件造成文件损坏&#xff0c;大多说的是点…

破晓数据新纪元:隐语隐私计算,携手共创安全智能的未来生态

1.业务背景&#xff1a;安全核对产生的土壤 隐语隐私计算在安全核对业务背景下的应用&#xff0c;主要聚焦于解决企业在数据交换和分析过程中面临的隐私保护问题。 在许多行业中&#xff0c;特别是在金融、医疗、政务等领域&#xff0c;数据的安全核对至关重要&#xff0c;例如…

制造业智能化一体式I/O模块的集成与应用案例分享

在现代制造业中&#xff0c;智能化一体式I/O模块的应用已经成为提升生产效率、优化工艺流程的关键技术之一。这种一体化I/O模块的主要功能在于作为PLC&#xff08;可编程逻辑控制器&#xff09;系统的扩展接口&#xff0c;以满足多样化的输入输出需求。本文将通过一个实际案例&…

社交网络的未来图景:探索Facebook的发展趋势

随着科技的不断进步和社会的快速变迁&#xff0c;社交网络作为连接人与人之间的重要纽带&#xff0c;扮演着日益重要的角色。而在众多社交网络中&#xff0c;Facebook作为老牌巨头&#xff0c;一直在探索着新的发展路径&#xff0c;引领着社交网络的未来图景。本文将深入探索Fa…

Go 项目依赖注入wire工具最佳实践介绍与使用

文章目录 一、引入二、控制反转与依赖注入三、为什么需要依赖注入工具3.1 示例3.2 依赖注入写法与非依赖注入写法 四、wire 工具介绍与安装4.1 wire 基本介绍4.2 安装 五、Wire 的基本使用5.1 前置代码准备5.2 使用 Wire 工具生成代码 六、Wire 核心技术5.1 抽象语法树分析5.2 …