当前位置:网站首页>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
边栏推荐
- C# 百度地图,高德地图,Google地图(GPS) 经纬度转换
- A detailed explanation takes you to reproduce the statistical learning method again -- Chapter 2, perceptron model
- Chrome浏览器标签管理插件–OneTab
- What is the future value of fluorite mine of karaqin Xinbao Mining Co., Ltd. under zhongang mining?
- Matplotlib剑客行——容纳百川的艺术家教程
- Introduction to the basic concept of queue and typical application examples
- 【Go实战基础】gin 高效神器,如何将参数绑定到结构体
- 十年开发经验的程序员告诉你,你还缺少哪些核心竞争力?
- 2022/2/13 summary
- Actual combat of microservices | discovery and invocation of original ecosystem implementation services
猜你喜欢
Sentinel reports failed to fetch metric connection timeout and connection rejection
2022/2/13 summary
During MySQL installation, mysqld Exe reports that the application cannot start normally (0xc000007b)`
微服务实战|手把手教你开发负载均衡组件
What is the future value of fluorite mine of karaqin Xinbao Mining Co., Ltd. under zhongang mining?
Flink-使用流批一体API统计单词数量
Chrome视频下载插件–Video Downloader for Chrome
【Go实战基础】gin 如何绑定与使用 url 参数
我服了,MySQL表500W行,居然有人不做分区?
C language implementation of mine sweeping game
随机推荐
Avoid breaking changes caused by modifying constructor input parameters
cmd窗口中中文呈现乱码解决方法
《统计学习方法》——第五章、决策树模型与学习(上)
我服了,MySQL表500W行,居然有人不做分区?
[go practical basis] how to customize and use a middleware in gin
Oracle related statistics
盘点典型错误之TypeError: X() got multiple values for argument ‘Y‘
微服务实战|Eureka注册中心及集群搭建
微服务实战|负载均衡组件及源码分析
Pdf document of distributed service architecture: principle + Design + practice, (collect and see again)
QT -- how to set shadow effect in QWidget
机器学习之数据类型案例——基于朴素贝叶斯法,用数据辩男女
Actual combat of microservices | discovery and invocation of original ecosystem implementation services
Essay: RGB image color separation (with code)
Mirror protocol of synthetic asset track
[go practical basis] how to bind and use URL parameters in gin
[go practical basis] how can gin get the request parameters of get and post
Redis安装部署(Windows/Linux)
远程连接IBM MQ报错AMQ4036解决方法
Data type case of machine learning -- using data to distinguish men and women based on Naive Bayesian method