Spring Cloud 系列之 Netflix Hystrix 服务容错 (4)

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

Spring Cloud 系列之 Netflix Hystrix 服务容错

请求合并的缺点

设置请求合并之后,本来一个请求可能 5ms 就搞定了,但是现在必须再等 10ms 看看还有没有其他的请求一起,这样一个请求的耗时就从 5ms 增加到 15ms 了。

如果我们要发起的命令本身就是一个高延迟的命令,那么这个时候就可以使用请求合并了,因为这个时候时间消耗就显得微不足道了,另外高并发也是请求合并的一个非常重要的场景。

添加依赖

服务消费者 pom.xml 添加 hystrix 依赖。

<!-- spring-cloud netflix hystrix 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> 业务层

服务消费者业务层代码添加请求合并规则。

package com.example.service.impl; import com.example.pojo.Product; import com.example.service.ProductService; 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.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.concurrent.Future; @Service public class ProductServiceImpl implements ProductService { @Autowired private RestTemplate restTemplate; /** * 根据多个主键查询商品 * * @param ids * @return */ // 声明需要服务容错的方法 @HystrixCommand @Override public List<Product> selectProductListByIds(List<Integer> ids) { System.out.println("-----orderService-----selectProductListByIds-----"); StringBuffer sb = new StringBuffer(); ids.forEach(id -> sb.append("id=" + id + "&")); return restTemplate.getForObject("http://product-service/product/listByIds?" + sb.toString(), List.class); } /** * 根据主键查询商品 * * @param id * @return */ // 处理请求合并的方法一定要支持异步,返回值必须是 Future<T> // 合并请求 @HystrixCollapser(batchMethod = "selectProductListByIds", // 合并请求方法 scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL, // 请求方式 collapserProperties = { // 间隔多久的请求会进行合并,默认 10ms @HystrixProperty(name = "timerDelayInMilliseconds", value = "20"), // 批处理之前,批处理中允许的最大请求数 @HystrixProperty(name = "maxRequestsInBatch", value = "200") }) @Override public Future<Product> selectProductById(Integer id) { System.out.println("-----orderService-----selectProductById-----"); return null; } }

@HystrixCollapser 注解各项参数说明如下:

Spring Cloud 系列之 Netflix Hystrix 服务容错

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfwzj.html