Feign
支持注解使用,默认用Java编写的HTTP Client绑定器,也可以支持其他HttpClient工具包,例如OkHttp及Apache HttpClient,针对Apache HttpClient的典型配置如下
feign:
#替换掉JDK默认HttpURLConnection实现的 Http Client
httpclient:
enabled: true
hystrix:
enabled: true
client:
config:
default:
#连接超时时间
connectTimeout: 5000
#读取超时时间
readTimeout: 5000
hystrix
包含了服务降级、服务熔断、线程隔离、请求缓存、请求合并以及服务监控等功能,非必选
hystrix:
propagate:
request-attribute:
enabled: true
command:
#全局默认配置
default:
#线程隔离相关
execution:
timeout:
#是否给方法执行设置超时时间,默认为true。一般我们不要改。
enabled: true
isolation:
#配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式semaphore,使用比较少。
strategy: threadPool
thread:
#方式执行的超时时间,默认为1000毫秒,在实际场景中需要根据情况设置
timeoutInMilliseconds: 10000
#发生超时时是否中断方法的执行,默认值为true。不要改。
interruptOnTimeout: true
#是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!
interruptOnCancel: false
circuitBreaker: #熔断器相关配置
enabled: true #是否启动熔断器,默认为true,false表示不要引入Hystrix。
requestVolumeThreshold: 20 #启用熔断器功能窗口时间内的最小请求数,假设我们设置的窗口时间为10秒,
sleepWindowInMilliseconds: 5000 #所以此配置的作用是指定熔断器打开后多长时间内允许一次请求尝试执行,官方默认配置为5秒。
errorThresholdPercentage: 50 #窗口时间内超过50%的请求失败后就会打开熔断器将后续请求快速失败掉,默认配置为50
Ribbon
主要功能包括客户端负载均衡器及用于中间层通信的客户端。在基于Feign的微服务通信中无论是否开启Hystrix,Ribbon都是必不可少的,Ribbon的配置参数主要如下:
ribbon:
eager-load:
enabled: true
#说明:同一台实例的最大自动重试次数,默认为1次,不包括首次
MaxAutoRetries: 1
#说明:要重试的下一个实例的最大数量,默认为1,不包括第一次被调用的实例
MaxAutoRetriesNextServer: 1
#说明:是否所有的操作都重试,默认为true
OkToRetryOnAllOperations: true
#说明:从注册中心刷新服务器列表信息的时间间隔,默认为2000毫秒,即2秒
ServerListRefreshInterval: 2000
#说明:使用Apache HttpClient连接超时时间,单位为毫秒
ConnectTimeout: 3000
#说明:使用Apache HttpClient读取的超时时间,单位为毫秒
ReadTimeout: 3000
前三者关系图
如果微服务项目加上了spring-cloud-starter-netflix-hystrix依赖,那么,feign会通过代理模式, 自动将所有的方法用 hystrix 进行包装。
过程如下:
- 通过Feign进行声明式调用
- hystrix 将方法进行包装,请求被hystrix管控
- Ribbon从注册中心获取目标微服务的服务器地址列表
- Ribbon 作为SLB根据负载均衡规则计算出调用方
- Feign HttpClient进行调用
Zuul
工作原理
zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。
zuul的核心在于filters, 这些filter会在不同阶段对Request Context进行操作,以达到网关的作用。
生命周期
类型
- pre:主要是在请求路由之前调用,很多验证可以在这里做
- route:在路由请求时候被调用,主要用来转发请求
- post:主要用来处理响应请求
- error:当错误发生时,会经由这个类型的过滤器处理
内置列表如下,oder越小越先执行
过滤器 | order | 描述 | 类型 |
---|---|---|---|
ServletDetectionFilter | -3 | 检测请求是用 DispatcherServlet还是 ZuulServlet | pre |
Servlet30WrapperFilter | -2 | 在Servlet 3.0 下,包装 requests pre | pre |
FormBodyWrapperFilter | -1 | 解析表单数据 | pre |
DebugFilter | -1 | 设置请求过程是否开启debug | pre |
SendErrorFilter | 0 | 如果中途出现错误的过滤 | pre |
PreDecorationFilter | 5 | 根据uri决定调用哪一个route过滤器 | pre |
RibbonRoutingFilter | 10 | 如果写配置的时候用ServiceId则用这个route过滤器,该过滤器可以用Ribbon 做负载均衡,用hystrix做熔断 | route |
SimpleHostRoutingFilter | 100 | 如果写配置的时候用url则用这个route过滤 | route |
SendForwardFilter | 500 | 用RequestDispatcher请求转发 | route |
SendResponseFilter | 1000 | 用RequestDispatcher请求转发 | Post |