当前位置:网站首页>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
边栏推荐
- Solution of Xiaomi TV's inability to access computer shared files
- Chrome视频下载插件–Video Downloader for Chrome
- 查看was发布的应用程序的端口
- Servlet全解:继承关系、生命周期、容器和请求转发与重定向等
- Gocv split color channel
- 京东高级工程师开发十年,编写出:“亿级流量网站架构核心技术”
- Cloudreve自建云盘实践,我说了没人能限制得了我的容量和速度
- [go practical basis] how to install and use gin
- C# 高德地图 根据经纬度获取地址
- 西瓜书--第五章.神经网络
猜你喜欢

西瓜书--第五章.神经网络

Ora-12514 problem solving method

队列管理器running状态下无法查看通道

Hengyuan cloud_ Can aiphacode replace programmers?

C4D quick start tutorial - C4d mapping

机器学习之数据类型案例——基于朴素贝叶斯法,用数据辩男女

我服了,MySQL表500W行,居然有人不做分区?

Dix ans d'expérience dans le développement de programmeurs vous disent quelles compétences de base vous manquez encore?

What is the future value of fluorite mine of karaqin Xinbao Mining Co., Ltd. under zhongang mining?

Chrome浏览器标签管理插件–OneTab
随机推荐
【Go实战基础】如何安装和使用 gin
十年開發經驗的程序員告訴你,你還缺少哪些核心競爭力?
1、 QT's core class QObject
使用递归函数求解字符串的逆置问题
Redis zadd导致的一次线上问题排查和处理
Complete solution of servlet: inheritance relationship, life cycle, container, request forwarding and redirection, etc
QT drag event
微服务实战|Eureka注册中心及集群搭建
《统计学习方法》——第五章、决策树模型与学习(上)
Solution and analysis of Hanoi Tower problem
Chrome用户脚本管理器-Tampermonkey 油猴
Leetcode sword finger offer brush questions - day 23
知识点很细(代码有注释)数构(C语言)——第三章、栈和队列
盘点典型错误之TypeError: X() got multiple values for argument ‘Y‘
Hengyuan cloud_ Can aiphacode replace programmers?
Watermelon book -- Chapter 5 neural network
[go practical basis] how to customize and use a middleware in gin
During MySQL installation, mysqld Exe reports that the application cannot start normally (0xc000007b)`
Sentinel reports failed to fetch metric connection timeout and connection rejection
[go practical basis] how can gin get the request parameters of get and post