学习主题:httpPool&Hystrix
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
1. 编写支持Gzip压缩案例
(1) 修改Consumer的全局配置文件,添加Gzip相关配置。
spring.application.name=eureka-consumer-httpclientserver.port=9002#-----------------------------feign gzip#配置请求 GZIP 压缩feign.compression.request.enabled=true#配置响应 GZIP 压缩feign.compression.response.enabled=true#配置压缩支持的 MIME TYPEfeign.compression.request.mime-types=text/xml,application/xml,application/json#配置压缩数据大小的最小阀值,默认 2048feign.compression.request.min-request-size=512#2.2.2对客户端浏览器的请求以及 Consumer 对 provider 的请#求与响应做 Gzip 压缩#-----------------------------spring boot gzip#是否启用压缩server.compression.enabled=trueserver.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain#启用httpclientfeign.httpclient.enabled=true#设置服务注册中心地址,指向另一个注册中心eureka.client.service-url.defaultZone=http://user:123@eureka2:8761/eureka/,http://user:123@eureka1:8761/eureka/
2. 为什么http连接池能提升性能
(1) Http的背景原理是什么?
1. 两台服务器建立http连接的过程是很复杂的一个过程,涉及到多个数据包的交唤1,并且也很耗时
2. Http连接需要的3次握手4次分手开销很大.这一开销对于大量的比较小的http消息来说更大
(2) Http优化解决方案有哪些?
a. 如果我们直接采用 http 连接池,节约了大量的 3 次握手 4 次分手;这样能大大提升吞
吐率。
b. feign 的 http 客户端支持 3 种框架;HttpURLConnection、httpclient、okhttp;默认是
HttpURLConnection。
c. 传统的 HttpURLConnection 是 JDK 自带的,并不支持连接池,如果要实现连接池的
机制,还需要自己来管理连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的
其他方案,也没有必要自己去管理连接对象。
d. HttpClient 相比传统 JDK 自带的 HttpURLConnection,它封装了访问 http 的请求头,
参数,内容体,响应等等;它不仅使客户端发送 HTTP 请求变得容易,而且也方便了开发人
员测试接口(基于 Http 协议的),即提高了开发的效率,也方便提高代码的健壮性;另外
高并发大量的请求网络的时候,还是用“连接池”提升吞吐量。
3. 编写支持Http连接案例
(1) 使用Gzip压缩Http连接的原理是什么?
实际是将json格式的文本信息压缩进行传输 增加传递效率
(2) 使用Gzip压缩Http连接在处理参数时需要注意什么?
需要添加json格式的注解 @RequestBody
4. 在微服务的日志中记录每个接口URL,状态码和耗时信息
(1) Logger.Level中NONE表示什么含义?
不记录任何信息 ,默认
(2) Logger.Level中BASIC表示什么含义?
记录请求方法,请求url,状态码,和用时
(3) Logger.Level中HEADERS表示什么含义?
在BASIC基础上再记录一些常用信息
(4) Logger.Level中FULL表示什么含义?
记录请求和响应的所有信息
5. 配置Feign负载均衡请求超时时间
(1) 配置Feign负载均衡请求超时时间的作用是什么?
可能由于服务处理的请求较长就中断了该连接是不对的
(2) 配置Feign负载均衡请求超时时间分为几种方式?
全局配置 或者 局部配置
#全局配置/指定配置#对所有操作请求都进行重试eureka-provider.ribbon.OkToRetryOnAllOperations=true#对当前实例的重试次数eureka-provider.ribbon.MaxAutoRetries=2#切换实例的重试次数eureka-provider.ribbon.MaxAutoRetriesNextServer=0#设置eureka-provider生产者的ribbon链接超时时间eureka-provider.ribbon.ReadTimeout=3000# 请求连接的超时时间默认的时间为1秒eureka-provider.ribbon.ConnectTimeout=3000
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
第242次(httpPool&Hystrix)
学习主题:httpPool&Hystrix
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
6. 什么是服务灾难性雪崩效应
(1) 什么是灾难性雪崩效应?
在微服务架构中,一个请求需要调用多个服务是非常常见的。如客户端访问A服务,而A服务需要调用B服务,B服务需要调用C服务,由于网络原因或者自身的原因,如果B服务或者C服务不能及时响应,A服务将处于阻塞状态,直到B服务C服务响应。此时若有大量的请求涌入,容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
(2) 造成雪崩原因是什么?
7. 如何解决灾难性雪崩效应
(1) 解决灾难性雪崩效应有哪些方式?
降级:
超时降级 , 资源不足时(线程或信号量)降级,降级后可以配置降级接口返回托底数据,实现一个fallback方法,当请求后端服务出现异常的时候,可以使用fallback方法返回的值
隔离(线程池隔离和信号量隔离)
限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用
熔断
当失败率(如因网络故障/超时造成的失败率高)到达阈值自动触发降级,熔断器触发的快速失败会进行快速恢复
缓存
提供了请求缓存
请求合并
提供了请求合并
(2) 每种方式的特点是什么?
8. 解决灾难性雪崩效应-降级-创建项目
(1) 什么是服务降级?
超时,资源不足时 ,线程降级 ,降级后可以配合降级接口返回托底数据 实现一个fallback方法,当请求后端服务出现异常的时候, 可以使用fallback方法返回的值
(2) 查实@EnableCircuitBreaker注解的作用是什么?
开启熔断器 当某服务出现异常时,可以跳至其他方法处理
(3) @HystrixCommand注解的作用是什么?
此注解表示此方法是hystrix方法
9. 解决灾难性雪崩效应-降级-服务降级处理
(1) 在几种情况下会触发getFallback的调用?
雪崩效应的服务的降级处理
当服务出现异常时触发
方法抛出非HystrixBadRequestException异常
方法调用超时
熔断器开启拦截调用
线程池/队列/信号量是否跑满
10. 解决灾难性雪崩效应-请求缓存-创建项目
(1) 什么是请求缓存?
将相同请求的返回值和URL 存入redis数据库 ,下次再有相同的请求时就可以直接响应结果
Hystrix为了降低访问服务的概率,支持将一个请求与返回结果做缓存处理,如果再次请求的URL没有变化,那么Hystrix不会请求服务,而是直接从缓存中将结果返回,这样可以大大降低访问服务的压力
Hystrix自带缓存,有两个缺点
1. 是一个本地缓存,再集群情况下缓存是不能同步的
2. 不支持第三方缓存容器,Redis,memcache不支持的可以使用spring的cache
(2) @EnableCaching注解的作用是什么?
开启缓存
11. 解决灾难性雪崩效应-请求缓存-请求缓存处理
(1) @CacheConfig注解的作用是什么?
这个用于配置该类会用到的一些共用的缓存配置 ,
例如:
@CacheConfig(cacheNames=”users”) : 配置了该数据访问对象中返回的内容将存储于名为users的对象中,我们也可以不用该注解,直接通过@Cacheable自己配置缓存集的名字来定义
(2) @CacheEvict注解的作用是什么?
删除数据时自动去redis数据库中删除缓存
(3).@Cacheable :配置了此注解的返回值将被加入缓存,同时在查询时,会从缓存中获取,如果不存在缓存才发起对数据库的访问
12. 解决灾难性雪崩效应-请求合并-创建项目
(1) 什么是请求合并?
将多个类似的请求合并成一个请求 再去请求数据
(2) 什么情况下使用请求合并?
在高并发情况下,通信次数的增加会导致总的通信时间增加,同时,线程池的资源也是有限的,高并发环境会导致大量的线程处于等待状态,进而导致响应延迟
进而需要Hystrix的请求合并
(3) 请求合并有哪些缺点?
设置请求合并之后,本来一个请求可能 5ms 就搞定了,但是现在必须再等 10ms 看看还 有没有其他的请求一起的,这样一个请求的耗时就从 5ms 增加到 15ms 了,不过,如果我们 要发起的命令本身就是一个高延迟的命令,那么这个时候就可以使用请求合并了,因为这个时候时间窗的时间消耗就显得微不足道了,另外高并发也是请求合并的一个非常重要的场 景。
13. 解决灾难性雪崩效应-请求合并-请求合并处理
(1) @HystrixCollapser注解的作用是什么?
使用hystrix的合并请求
被@HystrixCollapser标注的方法,返回类型必须为Future,使用异步方法,否则无法进行请求并行
(2) @HystrixProperty注解的作用是什么?
设置请求并行参数
(3) @HystrixCommand注解的作用是什么?
配置属性
(4) @HystrixCollapser注解中的batchMethod属性的作用是什么?
合并请求的方法
方法只能接受一个参数,如果你需要传递多个参数,那么请将他们封装成一个类参数
(5) @HystrixCollapser注解中的scope属性的作用是什么?
请求方式 默认REQUEST
请求方式: 分为 REQUEST,GLOBAL
REQUEST范围只对一个request请求内的多次服务请求进行合并
GlOBAL 是多单个应用中的所有线程的请求中的多次服务请求进行合并
(6) @HystrixCollapser注解中的timerDelayInMiliseconds属性的作用是什么?
请求时间间隔在10ms(默认)之内的请求会被合并为一个请求
(7) @HystrixCollapser注解中的maxRequestsInBatch属性的作用是什么?
设置触发批处理执行之前, 在批处理中允许的最大请求数 默认Integer.MAX_VALUE
14. 解决灾难性雪崩效应-服务熔断-创建项目
(1) 什么是服务熔断?
当电压过大时,保险丝自动熔断的意思
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。