SpringCloud Aliba-Sentinel【下篇】-从入门到学废【6】

🤩java小课堂🤩

🌭🌭🌭== 和 equals 的区别是什么?🥹🥹🥹

  • 对于基本类型,== 比较的是值;
  • 对于引用类型,==比较的是地址;
  • equals不能用于基本类型的比较;
  • 如果没有重写equals, equals就相当于 ==;
  • 如果重写了 equals方法,equals比较的是对象的内容;

目录

🍿1.@SentinelResource

🧂2. Ribbon系列

🧈3.Fegin系列 

🥓4.规则持久化 


1.@SentinelResource

1.1按资源名称限流

在对sentinel进行流控设置时,资源名称应与@SentinelResource的value值保持一致,设置blockHander返回兜底方法,否则返回sentinel默认的

    @GetMapping("/byResource")@SentinelResource(value = "byResource",blockHandler = "defaultException")public CommonResult byResource(){return new CommonResult(200,"按资源名称限流",new Payment(2023,"serial001"));}public CommonResult defaultException(BlockException exception){return new CommonResult(404, exception.getClass().getCanonicalName()+"服务不可用");}

1.2按url地址限流

只设置@SentinelRsource的value值,使用url地址进行限流,返回sentinel默认的

    @GetMapping("/byUrl")@SentinelResource(value = "byUrl")public CommonResult byUrl(){return new CommonResult(200,"按url限流",new Payment(2023,"serial001"));}

 

1.3自定义限流类 

使用@SentinelResource的blockHandlerClass属性,定义兜底类,在使用blockHandler定义兜底的方法

   @GetMapping("/payment/customerBlockHandler")@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handlerException2")public CommonResult customerBlockHandler(){return new CommonResult(200,"按自定义限流",new Payment(2023,"serial003"));}

 

 

2. Ribbon系列

准备:服务提供者9003,9004;服务消费者84

2.1服务提供者

1.建工程

1.再父工程下分别创建9003,9004服务提供者

2.注意jdk和maven版本

2.改pom

  <dependencies><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.example</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!--springCloud alibaba Naocs--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>

3.改yml

server:port: 9003#服务名名称
spring:application:name: nacos-payment-providercloud:nacos:discovery:#nacos地址server-addr: 192.168.20.50:1111management:endpoints:web:exposure:include: '*'

4.主启动

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9004 {public static void main(String[] args) {SpringApplication.run(PaymentMain9004.class);}
}

5.业务类

@RestController
public class PaymentController {@Value("${server.port}")private String serverPort;public static HashMap<Long, Payment> hashMap = new HashMap<>();static {hashMap.put(1L, new Payment(111, "小张"));hashMap.put(2L, new Payment(222, "小六"));hashMap.put(3L, new Payment(333, "小李"));}@GetMapping("/payment/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {Payment payment = hashMap.get(id);CommonResult<Payment> result = new CommonResult(200, "服务器端口:" + serverPort, payment);return result;}
}

6.测试 

2.2 服务消费者

1.建工程 

1.在父工程下创建服务84

2.注意jdk和maven版本

2.改pom

<dependencies><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.example</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!--springCloud alibaba Naocs--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--Sentinel--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency></dependencies>

3.改yml

server:port: 84spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: 192.168.20.50:1111sentinel:transport:dashboard: localhost:8080prot: 8719

4.主启动

@SpringBootApplication
@EnableDiscoveryClient
public class Order84 {public static void main(String[] args) {SpringApplication.run(Order84.class);}
}

5.RestTemplate配置类

@Configuration
public class MyConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

6.业务类

@RestController
public class ConsumerController {private static final String SERVER_NAME="http://nacos-payment-provider";@Autowiredprivate RestTemplate restTemplate;@GetMapping("/consumer/fallback/{id}")@SentinelResource(value = "fallback")public CommonResult<Payment> fallback(@PathVariable("id")Long id){CommonResult result = restTemplate.getForObject(SERVER_NAME + "/payment/" + id, CommonResult.class, id);if (result.getData()==null){throw new NullPointerException("没有记录");}return  result;}
}

7.测试 

2.3fallback属性 

  • fallback只管业务异常
  • @SentinelResource的fallBack属性,当有异常时,返回兜底方法handlerFallBack
   @GetMapping("/consumer/fallback/{id}")@SentinelResource(value = "fallback", fallback = "handlerFallBack")public CommonResult<Payment> fallback(@PathVariable("id") int id) {CommonResult result = restTemplate.getForObject(SERVER_NAME + "/payment/" + id, CommonResult.class, id);if (result.getData() == null) {throw new NullPointerException("没有记录");}return result;}public CommonResult handlerFallBack(@PathVariable("id") int id, Throwable e) {Payment payment=new Payment(id,"null");return new CommonResult(404, "兜底方法," + e.getMessage(),payment);}

2.4blockhandler属性

  • blockhandler只负责Sentinel控制台配置违规
    @GetMapping("/consumer/fallback/{id}")@SentinelResource(value = "fallback", blockHandler = "blockHandler")public CommonResult<Payment> fallback(@PathVariable("id") int id) {CommonResult result = restTemplate.getForObject(SERVER_NAME + "/payment/" + id, CommonResult.class, id);if (result.getData() == null) {throw new NullPointerException("没有记录");}return result;}public CommonResult blockHandler(@PathVariable("id") int id, BlockException blockException) {Payment payment = new Payment(id, "null");return new CommonResult(404, "blockHandler:" + blockException.getMessage(),payment);}

2.5fallback和blockhandler同时配置 

blockHandler和fallback都配置了,则被限流降级而抛出BlockException时只会进入blodkHandler处理逻辑。

    @GetMapping("/consumer/fallback/{id}")@SentinelResource(value = "fallback", blockHandler = "blockHandler", fallback = "handlerFallBack")public CommonResult<Payment> fallback(@PathVariable("id") int id) {CommonResult result = restTemplate.getForObject(SERVER_NAME + "/payment/" + id, CommonResult.class, id);if (result.getData() == null) {throw new NullPointerException("没有记录");}return result;}public CommonResult blockHandler(@PathVariable("id") int id, BlockException blockException) {Payment payment = new Payment(id, "null");return new CommonResult(404, "blockHandler:" + blockException.getMessage(), payment);}public CommonResult handlerFallBack(@PathVariable("id") int id, Throwable e) {Payment payment = new Payment(id, "null");return new CommonResult(404, "兜底方法," + e.getMessage(), payment);}

3.Fegin系列 

1.改pom

添加依赖

        <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

2.改yml

激活feign

#激活Sentinel对Feign的支持
feign:sentinel:enabled: true

3.加Feign接口

添加feign接口,与调用方法一致

@FeignClient(value = "nacos-payment-provider",fallback = PaymentFallbackFeign.class)
public interface PaymentFeign {@GetMapping("/payment/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id);
}

兜底方法 

@Component
public class PaymentFallbackFeign implements PaymentFeign{@Overridepublic CommonResult<Payment> getPayment(Long id) {return new CommonResult<>(404,"服务降级返回----PaymentFallbackFeign"); }
}

4.主启动

添加@EnableFeignClients

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Order84 {public static void main(String[] args) {SpringApplication.run(Order84.class);}
}

5.业务类

  @Autowiredprivate PaymentFeign paymentFeign;@GetMapping("/consumer/payment/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id){return paymentFeign.getPayment(id);}

 6.测试

关闭服务提供者9003,9004,消费者84不会被耗死

4.规则持久化 

一旦我们重启应用,sentinel规则将消失,生产环境需要将配置规则进行持久化

1.改pom

        <!--持久化--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>

2.改yml

server:port: 8401spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:#nacos服务注册中心server-addr: 192.168.20.50:1111sentinel:transport:#sentinel dashboard地址dashboard: localhost:8080#默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口port: 8719#将Sentinel流控规则持久化到nacosdatasource:ds1:nacos:server-addr: 192.168.20.50:1111dataId: ${spring.application.name}groupId: DEFAULT_GROUPdata-type: jsonrule-type: flowmanagement:endpoints:web:exposure:include: '*'

3.添加nacos配置 

  • resource:资源名称;
  • limitApp: 来源应用;
  • grade:阈值类型, 0表示线程数, 1表示QPS;
  • count:单机阈值;
  • strategy:流控模式,0表示直接,1表示关联,2表示链路;
  • controlBehavior:流控效果, 0表示快速失败,1表示Warm Up, 2表示排队待;
  • clusterMode:是否集群。

4.测试 

启动8401后,流控规则生效

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

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

相关文章

【现代密码学基础】详解完美安全与不可区分安全

目录 一. 介绍 二. 不可区分性试验 三. 不可区分性与完美安全 四. 例题 五. 小结 一. 介绍 敌手完美不可区分&#xff0c;英文写做perfect adversarial indistinguishability&#xff0c;其中adversarial经常被省略不写&#xff0c;在密码学的论文中经常被简称为IND安全。…

ICLR 2024 时间序列相关最新论文汇总,涉及transformer、GNN、大模型等热门领域

ICLR&#xff08;International Conference on Learning Representations&#xff09;&#xff0c;国际公认的深度学习顶会之一&#xff0c;与AAAI、CVPR、ACL和NIPS等老牌学术会议齐名&#xff0c;由图灵奖巨头Yoshua Bengio和Yann LeCun牵头举办&#xff0c;在人工智能、统计…

Spring | Srping AOP (AOP简介、动态代理、基于“代理类”的AOP实现)

目录: 1.Spring AOP简介1.1 AOP简介1.2 AOP术语 2.动态代理2.1 JDK动态代理2.2 CGLIB代理 3.基于“代理类”的AOP实现3.1 Spring的通知类型3.2 ProxyFactoryBean ( 可通知.xml配置文件完成aop功能 ) 1.Spring AOP简介 1.1 AOP简介 Spring的AOP模块&#xff0c;是Spring框架体系…

SpringMVC获取参数与页面跳转

获取参数 第一种 直接当成方法的参数&#xff0c;需要与前台的name一致 相当于Request.getAttribute("username") Controller 第二种 使用对象接收 页面的name也要和对象的字段一致 创建一个对应的实体类 Controller 将参数更换为User对象就行 SpringMVC获取到…

P2P DMA并不是所有场景都会有性能提升

P2P (Peer-to-Peer) DMA技术理论上可以带来性能提升&#xff0c;特别是在特定的工作负载和场景下。例如&#xff0c;当两个高速设备&#xff08;如GPU与NVMe SSD&#xff09;需要频繁进行大量数据交换时&#xff0c;通过P2P DMA&#xff0c;数据可以直接在设备间传输&#xff0…

结构体内存对齐(面试重点)

结构体内存对齐 1. 结构体类型的声明1.1 结构体的概念1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的自引用 2. 结构体内存对齐2.1 对齐规则2.1.1 练习1:2.1.2 练习2:2.1.3 练习3:2.1.4 练习4: 2.2 offsetof宏的使用2.3 为什么存在内存对齐?2.…

electron + selenium报错: Server terminated early with status 1

解决办法&#xff1a; 这种错误一般是浏览器创建的某方法致命错误导致的&#xff0c;查看一下实例化driver的地方有哪些配置&#xff0c;着重看日志、用执行信息存储一类的配置&#xff0c;我的问题是日志文件夹改过了但没有创建 // 浏览器参数设置 const customArguments [-…

Mac book air 重新安装系统验证显示 untrusted_cert_title

环境&#xff1a; Mac Book Air macOS Sierra 问题描述&#xff1a; Mac book air 重新安装系统验证显示 untrusted_cert_title 解决方案&#xff1a; 1.终端输入命令行输入 date 会看到一个非常旧的日期 2.更改日期为当前时间 使用以下命令来设置日期和时间&#xff1a…

java黑马学习笔记

数组 变量存在栈中&#xff0c;变量值存放在堆中。 数组反转 public class test{public static void main(String[] args){//目标&#xff1a;完成数组反转int[] arr {10,20,30,40,50};for (int i 0,j arr.length - 1;i < j;i,j--){int tep arr[j]; //后一个值赋给临时…

20240119-子数组最小值之和

题目要求 给定一个整数数组 arr&#xff0c;求 min(b) 的总和&#xff0c;其中 b 的范围涵盖 arr 的每个&#xff08;连续&#xff09;子数组。由于答案可能很大&#xff0c;因此返回答案模数 Example 1: Input: arr [3,1,2,4] Output: 17 Explanation: Subarrays are [3]…

Vision Transformer(VIT)模型介绍

计算机视觉 文章目录 计算机视觉Vision Transformer&#xff08;VIT&#xff09;Patch EmbeddingsHybrid ArchitectureFine-tuning and higher resolutionPyTorch实现Vision Transformer Vision Transformer&#xff08;VIT&#xff09; Vision Transformer&#xff08;ViT&am…

PACS医学影像采集传输与存储管理、影像诊断查询与报告管理系统,MPR多平面重建

按照国际标准IHE规范&#xff0c;以高性能服务器、网络及存储设备构成硬件支持平台&#xff0c;以大型关系型数据库作为数据和图像的存储管理工具&#xff0c;以医疗影像的采集、传输、存储和诊断为核心&#xff0c;集影像采集传输与存储管理、影像诊断查询与报告管理、综合信息…

4D毫米波雷达——FFT-RadNet 目标检测与可行驶区域分割 CVPR2022

前言 本文介绍使用4D毫米波雷达&#xff0c;实现目标检测与可行驶区域分割&#xff0c;它是来自CVPR2022的。 会讲解论文整体思路、输入数据分析、模型框架、设计理念、损失函数等&#xff0c;还有结合代码进行分析。 论文地址&#xff1a;Raw High-Definition Radar for Mu…

韵达快递单号查询入口,对需要的快递单号记录进行颜色标记

选择一款好的工具&#xff0c;往往能事半功倍&#xff0c;【快递批量查询高手】正是你物流管理的得力助手。它不仅可以助你批量查询快递单号的物流信息&#xff0c;还能帮你对需要的快递单号记录进行标记&#xff0c;让你享受高效便捷的物流管理体验。 所需工具&#xff1a; …

设计模式之迪米特法则:让你的代码更简洁、更易于维护

在软件开发中&#xff0c;设计模式是解决常见问题的最佳实践。其中&#xff0c;迪米特法则是一种非常重要的设计原则&#xff0c;它强调了降低对象之间的耦合度&#xff0c;提高代码的可维护性和可重用性。本文将介绍迪米特法则的概念、重要性以及在实际项目中的应用。 一、迪…

【微服务】springcloud集成sleuth与zipkin实现链路追踪

目录 一、前言 二、分布式链路调用问题 三、链路追踪中的几个概念 3.1 什么是链路追踪 3.2 常用的链路追踪技术 3.3 链路追踪的几个术语 3.3.1 span ​编辑 3.3.2 trace 3.3.3 Annotation 四、sluth与zipkin概述 4.1 sluth介绍 4.1.1 sluth是什么 4.1.2 sluth核心…

使用Ultimate-SD-Upscale进行图片高清放大

之前我们介绍过StableSR进行图片高清放大&#xff0c;如果调的参数过大&#xff0c;就会出现内存不足的情况&#xff0c;今天我们介绍另外一个进行图片高清放大的神器Ultimate-SD-Upscale&#xff0c;他可以使用较小的内存对图像进行高清放大。下面我们来看看如何使用进行操作。…

总线协议:GPIO模拟SMI(MDIO)协议:SMI协议介绍

0 工具准备 TN1305 Technical note IEEE802.3-2018 STM32F4xx中文参考手册 1 SMI介绍 1.1 SMI总体框图 站管理接口SMI&#xff08;Serial Management Interface&#xff09;&#xff0c;也可以称为MDIO接口&#xff08;Management Data Input/Output Interface&#xff09;。…

C语言——内存函数介绍和模拟实现

之前我们讲过一些字符串函数&#xff08;http://t.csdnimg.cn/ZcvCo&#xff09;&#xff0c;今天我们来讲一讲几个内存函数&#xff0c;那么可能有人要问了&#xff0c;都有字符串函数了&#xff0c;怎么又来个内存函数&#xff0c;这不是一样的么&#xff1f; 我们要知道之前…

华为原生 HarmonyOS NEXT 鸿蒙操作系统星河版 发布!不依赖 Linux 内核

华为原生 HarmonyOS NEXT 鸿蒙操作系统星河版 发布&#xff01;不依赖 Linux 内核 发布会上&#xff0c;余承东宣布&#xff0c;HarmonyOS NEXT鸿蒙星河版面向开发者开放申请。 申请链接 鸿蒙星河版将实现原生精致、原生易用、原生流畅、原生安全、原生智能、原生互联6大极致原…