百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

熔断器Spring Cloud Hystrix(二)

toyiye 2024-06-21 12:33 10 浏览 0 评论

【熔断器Spring Cloud Hystrix】


六、请求缓存

Hystrix为了降低访问服务的频率,支持将一个请求与返回结果做缓存处理。如果再次请求的URL没有变化,那么Hystrix不会请求服务,而是直接从缓存中将结果返回。这样可以大大降低访问服务的压力。

Hystrix自带缓存。有两个缺点:

  1. 是一个本地缓存。在集群情况下缓存是不能同步的。
  2. 不支持第三方缓存容器。Redis,memcached不支持的。

所以可以利用spring cache。实现请求缓存。

在降级处理的代码基础上完成下面变化。

什么是请求改变?IP,端口,主机名,域名,参数发生变化,都是请求改变。商业项目中,项目上线后,都使用域名访问,不涉及到ip,端口,主机名的变化,就是参数改变的问题,那么只要使用SpringEL保证缓存的key是和请求参数相关的,就可以保证缓存的有效性。项目中,写请求的数量,远少于读请求,极限比例的达到百万级:1。缓存效果非常明显,做缓存同步,不管多麻烦,都有必要。

1. 添加依赖

2. 修改配置文件

添加redis的配置,此处使用的是redis单机版。如果是redis集群使用spring.redis.cluster.nodes进行配置。

3. 修改启动类

在启动类上添加@EnableCaching注解

4. 在HystrixService和实现类上添加

在service实现类方法上面额外再添加一个注解。

5. 编写控制器,进行测试

控制器代码没有变化,直接调用service即可。

6. 检查结果

通过在redis中keys * 查看是否添加/删除key成功。


七、请求合并

没有请求合并

Application Service 负载是Application Client发送请求的总数量

请求合并

把一段时间范围内的所有请求合并为一个请求。大大的降低了Application Service 负载。

什么情况下使用请求合并

在微服务架构中,我们将一个项目拆分成很多个独立的项目,这些独立的项目通过远程调用来互相配合工作,但是,在高并发情况下,通信次数的增加会导致总的通信时间增加,同时,线程池的资源也是有限的,高并发环境会导致有大量的线程处于等待状态,进而导致响应延迟,为了解决这些问题,我们需要来了解Hystrix的请求合并。

请求合并的缺点

设置请求合并之后,本来一个请求可能5ms就搞定了,但是现在必须再等10ms看看还有没有其他的请求一起的,这样一个请求的耗时就从5ms增加到15ms了,不过,如果我们要发起的命令本身就是一个高延迟的命令,那么这个时候就可以使用请求合并了,因为这个时候时间窗的时间消耗就显得微不足道了,另外高并发也是请求合并的一个非常重要的场景。

1. 请求合并参数介绍

请求合并理论学习明白后,代码实现起来还是很容易的。关键就是一个@HystrixCollapser注解

2. 代码实现

实现请求合并时,不仅仅需要修改Application Client代码,还需要修改Application Service的代码,因为Application Service必须支持把所有参数捆绑到一起的方式,同时还支持把多个值一起返回。

2.1 修改Application Service控制器

没有请求合并时的控制器

有请求合并时必须要支持一次传递过来多个参数和一次返回多个值。在额外添加一个控制器方法。

参数添加@RequestBody是因为Application Client使用请求体传递数据。

返回值也是List,List里面数据是有顺序的。

2.2 修改Application Client的Service

在请求缓存的代码基础上,在service及实现类中添加新方法。

@HystrixCollapser 进行请求合并

batchMethod:处理请求合并的方法

scope - 合并请求的请求作用域。可选值有global和request。

global代表所有的请求线程都可以等待可合并。 常用

request代表一个请求线程中的多次远程服务调用可合

timerDelayInMilliseconds:等待时长,默认10毫秒。

maxRequestInBatch:最大请求合并数量。

@HystrixCommand 处理请求合并的方法必须有此注解。


实现类中client(String)方法一旦被@HystrixCollapser标记,方法就不会被执行,方法体中为空即可。直接执行batchMethod对应的方法。

batchMethod方法返回值顺序和传递进来的参数顺序有关系的。

注意:在实际测试中scope使用默认值REQUEST会出现空指针异常,请换成GLOBAL

2.3 修改consumer中控制器方法

在一个控制器中多次调用service的方法进行模拟并发操作。

控制通过休眠模拟两次并发请求。

f1和f2的输出语句必须放到请求后面,否则无法合并。


八、Hystrix-dashboard

Hystrix-dashboard能够让Actuator从json转换为界面。

在包含Hystrix的项目中(DemoFallback)进行操作

1. 添加依赖

2. 修改启动器注解

3. 修改配置文件

4. 在浏览器访问

先访问非界面版,等待ping成功。

地址栏输入:http://localhost:8081/actuator/hystrix.stream

访问界面版。

在地址栏输入:http://localhost:8081/hystrix访问界面版。

在界面的输入框中输入监控中心地址http://localhost:8081/actuator/hystrix.stream 后点击“Monitor Stream”

跳转到结果页面。

只有包含@HystrixCommand的方法,被执行后就会显示对应的图片


九、Feign的降级处理

1. 添加依赖

Feign中包含Hystrix中部分功能。所以不需要单独导入Hystrix的依赖。

1. 编写配置文件

默认情况下Feign的hystrix是不开启的,需要手动开启。其他方式和之前配置是相同的。

2. 编写service

编写HystrixService内容。依然使用Feign进行声明式调用。

在案例中是直接使用内部类进行实现的,也可以新建一个类进行完成。

fallback属性表示降级后处理类。

3. 编写启动器


需要更多Java学习资料的小伙伴可以到评论区留言或私信我获取哦

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码