第241次(httpPool&Hystrix)
学习主题:httpPool&Hystrix
对应作业
- 编写支持Gzip压缩案例
- 修改Consumer的全局配置文件,添加Gzip相关配置。
#-----------------------------feign gzip
#配置请求 GZIP 压缩
feign.compression.request.enabled=true
#配置响应 GZIP 压缩
feign.compression.response.enabled=true
#配置压缩支持的 MIME TYPE
feign.compression.request.mime-types=text/xml,application/xml,application/json
#配置压缩数据大小的最小阀值,默认 2048
feign.compression.request.min-request-size=512
- 为什么http连接池能提升性能
- Http的背景原理是什么?
a. 两台服务器建立 http 连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并 且也很耗时间。 b. Http 连接需要的 3 次握手 4 次分手开销很大,这一开销对于大量的比较小的 http 消 息来说更大。
- Http优化解决方案有哪些?
a. 如果我们直接采用 http 连接池,节约了大量的 3 次握手 4 次分手;这样能大大提升吞 吐率。 b. feign 的 http 客户端支持 3 种框架;HttpURLConnection、httpclient、okhttp;默认是 HttpURLConnection。 c. 传统的 HttpURLConnection 是 JDK 自带的,并不支持连接池,如果要实现连接池的 机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的 其他方案,也没有必要自己去管理连接对象。 d. HttpClient 相比传统 JDK 自带的 HttpURLConnection,它封装了访问 http 的请求头, 参数,内容体,响应等等;它不仅使客户端发送 HTTP 请求变得容易,而且也方便了开发人 员测试接口(基于 Http 协议的),即提高了开发的效率,也方便提高代码的健壮性;另外 高并发大量的请求网络的时候,还是用“连接池”提升吞吐量。
- 编写支持Http连接案例
- 使用Gzip压缩Http连接的原理是什么?
- 使用Gzip压缩Http连接在处理参数时需要注意什么?
将 Feign 的 Http 客户端工具修改为 HttpClient
<!-- 使用Apache HttpClient替换Feign原生httpURLConnection -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-httpclient -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>10.3.0</version>
</dependency>
#使用HttpClient替换默认的HttpURLConnection HttpClient自带连接池
feign:
httpclient:
enabled: true
/**
* 使用HTTPClient提升连接性能,get方式
*
* @param product
* @return
*/
@RequestMapping(value="/add3",method=RequestMethod.GET,consumes=MediaType.APPLICATION_JSON_VALUE)
public Product add3(@RequestBody Product product);
- 在微服务的日志中记录每个接口URL,状态码和耗时信息
- Logger.Level中NONE表示什么含义?
- Logger.Level中BASIC表示什么含义?
- Logger.Level中HEADERS表示什么含义?
- Logger.Level中FULL表示什么含义?
// NONE:不记录任何信息,默认值
// BASIC:记录请求方法、请求 URL、状态码和用时
// HEADERS:在 BASIC 基础上再记录一些常用信息
// FULL:记录请求和相应的所有信息
- 配置Feign负载均衡请求超时时间
- 配置Feign负载均衡请求超时时间的作用是什么?
- 配置Feign负载均衡请求超时时间分为几种方式?
防止由超时产生的异常
两种,全局配置,根据服务名配置
#全局配置 # 请求连接的超时时间 默认的时间为 1 秒
# 请求处理的超时时间
ribbon:
ConnectTimeout: 5000
ReadTimeout: 5000
Ego-Provider-Provider:
ribbon:
OkToRetryOnAllOperations: true
MaxAutoRetries: 2
MaxAutoRetriesNextServer: 0
ConnectTimeout: 3000
ReadTimeout: 3000
对应作业
- 什么是服务灾难性雪崩效应
- 什么是灾难性雪崩效应?
- 造成雪崩原因是什么?
1)当发起少量请求时一切正常
2)当微服务中某个服务发送了大量请求后,可能会导致系统的某个服务瘫痪
3)由于得不到请求 ,会有更多的请求发送 ,会导致瘫痪掉的服务的上一个服务也会因为进程阻塞而瘫痪 ,以此类推 ,导致某系列功能完全瘫痪
4)因为某些节点服务瘫痪 ,可能会导致整个系统瘫痪 ,这就是雪崩效应的大致原理
- 如何解决灾难性雪崩效应
- 解决灾难性雪崩效应有哪些方式?
- 每种方式的特点是什么?
- 解决灾难性雪崩效应-降级-创建项目
- 什么是服务降级?
- @EnableCircuitBreaker注解的作用是什么?
- @HystrixCommand注解的作用是什么?
对服务做降级处理 , 当服务宕机时, 返回托底数据
添加熔断器,开启熔断
标记该方法为托底方法
- 解决灾难性雪崩效应-降级-服务降级处理
- 在几种情况下会触发getFallback的调用?
(1) 方法抛出非 HystrixBadRequestException 异常。
(2) 方法调用超时
(3) 熔断器开启拦截调用
(4) 线程池/队列/信号量是否跑满
- 解决灾难性雪崩效应-请求缓存-创建项目
- 什么是请求缓存?
- @EnableCaching注解的作用是什么?
Hystrix 为了降低访问服务的频率,支持将一个请求与返回结果做缓存处理。如果再次请求的 URL 没有变化,那么 Hystrix 不会请求服务,而是直接从缓存中将结果返回。这样可以大大降低访问服务的压力。
Hystrix 自带缓存。
开启本地缓存
- 解决灾难性雪崩效应-请求缓存-请求缓存处理
- @CacheConfig注解的作用是什么?
- @CacheEvict注解的作用是什么?
指定对哪个实体类开启缓存
删除缓存
- 解决灾难性雪崩效应-请求合并-创建项目
- 什么是请求合并?
- 什么情况下使用请求合并?
- 请求合并有哪些缺点?
合并请求之后, 将所有请求放在一个list集合中 ,然后统一放到线程池中请求provider
在高并发情况下
设置请求合并之后,本来一个请求可能 5ms 就搞定了,但是现在必须再等 10ms 看看还 有没有其他的请求一起的,这样一个请求的耗时就从 5ms 增加到 15ms 了,不过,如果我们要发起的命令本身就是一个高延迟的命令,那么这个时候就可以使用请求合并了,因为这个时候时间窗的时间消耗就显得微不足道了,另外高并发也是请求合并的一个非常重要的场景。
- 解决灾难性雪崩效应-请求合并-请求合并处理
- @HystrixCollapser注解的作用是什么?
- @HystrixProperty注解的作用是什么?
- @HystrixCommand注解的作用是什么?
- @HystrixCollapser注解中的batchMethod属性的作用是什么?
- @HystrixCollapser注解中的scope属性的作用是什么?
- @HystrixCollapser注解中的timerDelayInMiliseconds属性的作用是什么?
- @HystrixCollapser注解中的maxRequestsInBatch属性的作用是什么?
@HystrixCollapser(合并参数的设置)
@HystrixProperty请求时间间隔合并参数的设置
@HystrixCommand (真正调用provider的方法 形参必须是list不能是数组)
batchMethod 合并请求的方法
scope 请求方式
timerDelayInMiliseconds求时间间隔设置, 默认 为 10ms
maxRequestsInBatch允许的最大并发请求数
- 解决灾难性雪崩效应-服务熔断-创建项目
- 什么是服务熔断?
相当于电路的跳闸功能