当前位置:网站首页>hystrix 实现请求合并
hystrix 实现请求合并
2022-07-02 06:33:00 【保护我方胖虎】
需要请求合并的服务启动类上添加
@EnableHystrix
@EnableHystrixDashboard
需要请求合并的服务添加依赖
<!--hystrix依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
请求接口
package com.leilei.controller;
import com.leilei.entity.AlarmDictionary;
import com.leilei.service.AlarmService;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.Future;
/** * @author lei * @create 2022-03-30 22:45 * @desc **/
@RequestMapping("/alarm")
@RestController
public class AlarmController {
private final AlarmService alarmService;
public AlarmController(AlarmService alarmService) {
this.alarmService = alarmService;
}
/** * 外部单个请求接口 * @param id * @return */
@GetMapping(value = "/dictionary/{id}")
public AlarmDictionary requestCollapseAnnotation(@PathVariable Integer id) {
// 这里注意需要开启Hystrix环境
try (HystrixRequestContext context = HystrixRequestContext.initializeContext()) {
Future<AlarmDictionary> f1 = alarmService.find(id);
return f1.get();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
服务内部进行聚合批量处理
package com.leilei.service;
import com.leilei.entity.AlarmDictionary;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.Future;
/** * @author lei * @create 2022-03-30 22:38 * @desc **/
@Service
public class AlarmService {
private final AlarmFeign alarmFeign;
public AlarmService(AlarmFeign alarmFeign) {
this.alarmFeign = alarmFeign;
}
/** * batchMethod 设置批量方法的接口名 * HystrixProperty name 设置为时间延迟timerDelayInMilliseconds 即多少时间的请求作为一个批量进行提交;value 为时间阈值,单位是毫秒 * @param id * @return */
@HystrixCollapser(batchMethod = "findBatch",
collapserProperties = {
@HystrixProperty(name = "timerDelayInMilliseconds", value = "1000")})
public Future<AlarmDictionary> find(Integer id) {
throw new RuntimeException("This method body should not be executed");
}
@HystrixCommand
public List<AlarmDictionary> findBatch(List<Integer> alarms) {
List<AlarmDictionary> alarmDictionaries = alarmFeign.getBatch(alarms);
System.out.println(Thread.currentThread().getName() + ":" + alarmDictionaries);
return alarmDictionaries;
}
}
服务提供者(当然这里也不可以用远程,使用服务内部批量逻辑一样)
@RestController
@RequestMapping("/alarm/dictionary")
public class AlarmDictionaryController {
static List<AlarmDictionary> alarms = new ArrayList<>();
static {
alarms.add(new AlarmDictionary(1,"808一级报警"));
alarms.add(new AlarmDictionary(2,"808二级报警"));
alarms.add(new AlarmDictionary(3,"808三级报警"));
alarms.add(new AlarmDictionary(4,"疲劳驾驶一级报警"));
}
@PostMapping("/batch")
public List<AlarmDictionary> getBatchAlarmById(@RequestBody List<Integer> alarmIds) {
return alarms.stream().filter(x -> alarmIds.contains(x.getId())).collect(Collectors.toList());
}
}
测试结果

问题:
Hystrix请求必须做到请求应答模式,就是说,一个请求必须要有对应的结果,如果响应为空,则会抛出异常
Caused by: java.lang.RuntimeException: Failed to map all collapsed requests to response. The expected contract has not been respected. Collapser key: 'find', requests size: '1', response size: '0'
at com.netflix.hystrix.contrib.javanica.collapser.CommandCollapser.mapResponseToRequests(CommandCollapser.java:76)
at com.netflix.hystrix.contrib.javanica.collapser.CommandCollapser.mapResponseToRequests(CommandCollapser.java:33)
at com.netflix.hystrix.HystrixCollapser$1$1.call(HystrixCollapser.java:171)
at rx.internal.util.ActionObserver.onNext(ActionObserver.java:39)
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onNext(OnSubscribeDoOnEach.java:96)
... 68 more

当前我们可以对其进行try-catch处理,更好的解决方式待更新…
TODO…
附上项目地址:hystrix-batch-collapser
边栏推荐
- 寻找链表中值域最小的节点并移到链表的最前面
- Jingdong senior engineer has developed for ten years and compiled "core technology of 100 million traffic website architecture"
- Watermelon book -- Chapter 5 neural network
- 2022/2/14 summary
- Cloud computing in my eyes - PAAS (platform as a service)
- Oracle related statistics
- Gocv image reading and display
- 查看was发布的应用程序的端口
- [go practical basis] how to customize and use a middleware in gin
- Connect function and disconnect function of QT
猜你喜欢
![[go practical basis] how to install and use gin](/img/0d/3e899bf69abf4e8cb7e6a0afa075a9.png)
[go practical basis] how to install and use gin

一篇详解带你再次重现《统计学习方法》——第二章、感知机模型

WSL installation, beautification, network agent and remote development

C language implementation of mine sweeping game

Cloudrev self built cloud disk practice, I said that no one can limit my capacity and speed

C language - Blue Bridge Cup - 7 segment code

Flink - use the streaming batch API to count the number of words

概率还不会的快看过来《统计学习方法》——第四章、朴素贝叶斯法

告别996,IDEA中必装插件有哪些?

知识点很细(代码有注释)数构(C语言)——第三章、栈和队列
随机推荐
我服了,MySQL表500W行,居然有人不做分区?
Gocv image reading and display
AMQ6126问题解决思路
聊聊消息队列高性能的秘密——零拷贝技术
Cartoon rendering - average normal stroke
Use of libusb
Sentinel reports failed to fetch metric connection timeout and connection rejection
机器学习实战:《美人鱼》属于爱情片还是动作片?KNN揭晓答案
Hengyuan cloud_ Can aiphacode replace programmers?
Matplotlib剑客行——初相识Matplotlib
Ora-12514 problem solving method
【Go实战基础】gin 如何自定义和使用一个中间件
[staff] common symbols of staff (Hualian clef | treble clef | bass clef | rest | bar line)
[staff] the lines and spaces of the staff (the nth line and the nth space in the staff | the plus N line and the plus N space on the staff | the plus N line and the plus N space below the staff | the
Matplotlib剑客行——没有工具用代码也能画图的造型师
Analysis and solution of a classical Joseph problem
Watermelon book -- Chapter 5 neural network
别找了,Chrome浏览器必装插件都在这了
WSL安装、美化、网络代理和远程开发
京东高级工程师开发十年,编写出:“亿级流量网站架构核心技术”