fix: fix FeignClient proxy problem

pull/12/head
chuntaojun 4 years ago
parent cd91b69f80
commit 27bb050a9d

@ -12,8 +12,6 @@ global:
timeout: 5s timeout: 5s
feign: feign:
hystrix:
enabled: true #在Feign中开启Hystrix
compression: compression:
request: request:
enabled: false #是否对请求进行GZIP压缩 enabled: false #是否对请求进行GZIP压缩
@ -22,19 +20,5 @@ feign:
response: response:
enabled: false #是否对响应进行GZIP压缩 enabled: false #是否对响应进行GZIP压缩
ribbon:
polaris:
enabled: true
# 同一实例最大重试次数,不包括首次调用
MaxAutoRetries: 1
# 重试其他实例的最大重试次数不包括首次所选的server
MaxAutoRetriesNextServer: 2
# 是否所有操作都进行重试
OkToRetryOnAllOperations: false
ConnectionTimeout: 1000
ReadTimeout: 1000
eager-load:
enabled: on
serivceB: serivceB:
url: http://localhost:48081 url: http://localhost:48081

@ -1,287 +1,194 @@
#描述:全局配置项
global: global:
#描述系统相关配置 #描述: 系统相关配置
system: system:
#描述:SDK运行模式 #描述: 服务发现集群
#类型:enum
#范围:0直连模式SDK直接对接server; 1代理模式SDK只对接agent, 通过agent进行server的对接
#默认值:0
mode: 0
#服务发现集群
discoverCluster: discoverCluster:
namespace: Polaris namespace: Polaris
service: polaris.discover service: polaris.discover
#可选:服务刷新间隔 #描述: 服务刷新间隔
refreshInterval: 10m refreshInterval: 1m
#健康检查集群 #描述: 是否使用埋点地址作为服务发现集群
sameAsBuiltin: true
#描述: 系统服务使用的路由链
routers:
- metadataRouter
- nearbyBasedRouter
#描述: 系统服务使用的负载均衡方式
lbPolicy: weightedRandom
#描述: 健康检查集群
healthCheckCluster: healthCheckCluster:
namespace: Polaris namespace: Polaris
service: polaris.healthcheck service: polaris.healthcheck
#可选:服务刷新间隔 refreshInterval: 1m
refreshInterval: 10m sameAsBuiltin: true
#监控上报集群 routers:
- metadataRouter
- nearbyBasedRouter
lbPolicy: ringHash
#描述: 监控上报集群
monitorCluster: monitorCluster:
namespace: Polaris namespace: Polaris
service: polaris.monitor service: polaris.monitor
#可选:服务刷新间隔 refreshInterval: 1m
refreshInterval: 10m sameAsBuiltin: false
routers:
- metadataRouter
- nearbyBasedRouter
lbPolicy: ringHash
#描述: SDK流程数据缓存配置
flowCache:
enable: true
name: simpleCache
expireInterval: 60s
#描述: SDK api调用相关配置
api: api:
#描述:api超时时间 #描述: api超时时间
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1ms:...]
#默认值:1s
timeout: 5s timeout: 5s
#描述:上报间隔 #描述: 客户端给服务端定时上报自身信息的间隔
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1ms:...]
#默认值:10m
reportInterval: 10m reportInterval: 10m
#描述:API因为网络原因调用失败后的重试次数 #描述: api因为网络原因调用失败后的最大重试次数
#类型:int maxRetryTimes: 1
#范围:[0:...] #描述: 2次重试之间的重试间隔
#默认值:5 retryInterval: 500ms
maxRetryTimes: 5 #描述: 对接北极星服务端的相关配置
#描述:重试间隔
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1s:...]
#默认值:1s
retryInterval: 1s
#描述:对接polaris server的相关配置
serverConnector: serverConnector:
#描述:访问server的连接协议SDK会根据协议名称会加载对应的插件 #描述:默认服务端埋点接入地址
#类型:string addresses:
#范围:已注册的连接器插件名 - 127.0.0.1:8091
#默认值:grpc #描述: 访问server的连接协议SDK会根据协议名称会加载对应的插件
protocol: grpc protocol: grpc
#描述:发起连接后的连接超时时间 #描述: 发起连接后的连接超时时间
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1ms:...]
#默认值:200ms
connectTimeout: 500ms connectTimeout: 500ms
#描述:远程请求超时时间 #描述: 与服务端发起远程请求超时时间
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1ms:...]
#默认值:1s
messageTimeout: 5s messageTimeout: 5s
#描述:连接空闲时间长连接模式下当连接空闲超过一定时间后SDK会主动释放连接 #描述: 连接空闲时间以最后一次消息交互时间来算长连接模式下当连接空闲超过一定时间后SDK会主动释放连接
#类型:string connectionIdleTimeout: 60s
#格式:^\d+(ms|s|m|h)$ #描述: server节点的切换周期为了使得server的压力能够均衡SDK会定期切换目标服务端节点
#范围:[1ms:...]
#默认值:1s
connectionIdleTimeout: 1s
#描述:首次请求的任务队列长度当用户发起首次服务访问请求时SDK会对任务进行队列调度并连接server当积压的任务数超过队列长度后SDK会直接拒绝首次请求的发起。
#类型:int
#范围:[0:...]
#默认值:1000
requestQueueSize: 1000
#描述:server节点的切换周期为了使得server的压力能够均衡SDK会定期针对最新的节点列表进行重新计算自己当前应该连接的节点假如和当前不一致则进行切换
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1m:...]
#默认值:10m
serverSwitchInterval: 10m serverSwitchInterval: 10m
plugin: #描述:重连间隔时间
grpc: reconnectInterval: 500ms
#描述:GRPC客户端单次最大链路接收报文 #描述: 监控及日志数据上报相关配置
#类型:int
#范围:(0:524288000]
maxCallRecvMsgSize: 52428800
#统计上报设置
statReporter: statReporter:
#描述是否将统计信息上报至monitor #描述: 是否启用上报
#类型bool enable: false
#默认值true
enable: true
#描述:启用的统计上报插件类型
#类型list
#范围:已经注册的统计上报插件的名字
#默认值stat2Monitor(将信息上报至monitor服务)
chain:
- stat2Monitor
- serviceCache
#描述:统计上报插件配置
plugin: plugin:
stat2Monitor: pushgatewayConfig:
#描述:每次上报多长一段时间的统计信息 #描述: 上报给prometheus pushgateway的任务名称
#类型:string jobName: "defaultJob"
#格式:^\d+(ms|s|m|h)$ #描述: pushgateway的服务名称
#范围:[1m:...] serviceName: "polaris.monitor"
metricsReportWindow: 1m #描述: 上报给pushgateway的时间间隔
#描述:将一段时间内的统计信息分为多少个基本单元收集 pushInterval: 10
#类型:int #描述: 主调端配置
#范围:[1:...]
#默认值:12
metricsNumBuckets: 12
serviceCache:
#描述:上报缓存信息的周期
reportInterval: 3m
#描述:主调端配置
consumer: consumer:
#描述:本地缓存相关配置 #描述: 本地服务缓存相关配置
localCache: localCache:
#描述:缓存类型 #描述: 缓存插件名
#类型:string
#范围:已注册的本地缓存插件名
#默认值:inmemory基于本机内存的缓存策略
type: inmemory type: inmemory
#描述:服务过期淘汰时间 #描述: 是否启用服务数据缓存
#类型:string serviceExpireEnable: true
#格式:^\d+(ms|s|m|h)$ #描述: 服务过期淘汰时间
#范围:[1m:...]
#默认值:24h
serviceExpireTime: 24h serviceExpireTime: 24h
#描述:服务定期刷新周期 #描述: 服务定期同步刷新周期
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1s:...]
#默认值:2s
serviceRefreshInterval: 2s serviceRefreshInterval: 2s
#描述:服务缓存持久化目录SDK在实例数据更新后按照服务维度将数据持久化到磁盘 #描述: 是否启用服务数据文件缓存
#类型:string persistEnable: true
#格式:本机磁盘目录路径,支持$HOME变量 #描述: 服务缓存持久化目录SDK在实例数据更新后按照服务维度将数据持久化到磁盘
#默认值:$HOME/polaris/backup
persistDir: ./polaris/backup persistDir: ./polaris/backup
#描述:缓存写盘失败的最大重试次数 #描述: 缓存写盘失败的最大重试次数
#类型:int persistMaxWriteRetry: 1
#范围:[1:...] #描述: 缓存从磁盘读取失败的最大重试次数
#默认值:5 persistMaxReadRetry: 0
persistMaxWriteRetry: 5 #描述: 缓存读写磁盘的重试间隔
#描述:缓存从磁盘读取失败的最大重试次数 persistRetryInterval: 500ms
#类型:int #描述: 服务路由相关配置
#范围:[1:...]
#默认值:1
persistMaxReadRetry: 1
#描述:缓存读写磁盘的重试间隔
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1ms:...]
#默认值:1s
persistRetryInterval: 1s
#描述:服务路由相关配置
serviceRouter: serviceRouter:
# 服务路由链 #描述: 前置路由链
beforeChain:
# 隔离路由
- isolatedRouter
#描述: 服务路由链
chain: chain:
# 基于主调和被调服务规则的路由策略(默认的路由策略) # 元数据路由
- metadataRouter
# 规则路由
- ruleBasedRouter - ruleBasedRouter
# 就近路由策略 # 就近路由
- nearbyBasedRouter - nearbyBasedRouter
#描述: 后置路由链
afterChain:
# 兜底(全死全活)路由
- recoverRouter
#描述:服务路由插件的配置 #描述:服务路由插件的配置
plugin: plugin:
metadataRouter:
#描述: 元数据路由降级策略。none(不降级), all(降级返回所有的节点), others(降级返回其他节点)
metadataFailOverType: none
nearbyBasedRouter: nearbyBasedRouter:
#描述:就近路由的最小匹配级别 #描述: 就近路由的最小匹配级别。region(大区)、zone(区域)、campus(园区)
#类型:string
#范围:region(大区)、zone(区域)、campus(园区)
#默认值:zone
matchLevel: zone matchLevel: zone
ruleBasedRouter: { } #描述: 最大匹配级别
recoverRouter: maxMatchLevel: all
#至少应该返回多少比率的实例如果不填默认0%,即全死全活 #描述: 强制就近
percentOfMinInstances: 0 strictNearby: false
#是否开启全死全活,默认开启 #描述: 全部实例不健康时是否降级其他地域
enableRecoverAll: true enableDegradeByUnhealthyPercent: false
#描述: 达到降级标准的不健康实例百分比
unhealthyPercentToDegrade: 100
#描述: 是否通过上报方式获取地域信息
enableReportLocalAddress: false
#描述:负载均衡相关配置 #描述:负载均衡相关配置
loadbalancer: loadbalancer:
#描述:负载均衡类型 #描述: 负载均衡类型(已注册的负载均衡插件名)
#范围:已注册的负载均衡插件名
#默认值:权重随机负载均衡
type: weightedRandom type: weightedRandom
plugin:
#描述:虚拟节点的数量
#类型:int
#默认值:500
ringHash:
vnodeCount: 500
#描述:节点熔断相关配置 #描述:节点熔断相关配置
circuitBreaker: circuitBreaker:
#描述:是否启用节点熔断功能 #描述: 是否启用本地节点熔断功能
#类型:bool
#默认值:true
enable: true enable: true
#描述:实例定时熔断检测周期 #描述: 故障检测周期,根据周期内故障进行熔断
#类型:string checkPeriod: 1m
#格式:^\d+(ms|s|m|h)$ #描述: 首次熔断时间,后续熔断时间=重试次数*sleepWindow
#范围:[100ms:...] sleepWindow: 30s
#默认值:30s #描述: 熔断器半开后最大允许的请求数
checkPeriod: 100ms requestCountAfterHalfOpen: 3
#描述:熔断器半开后最大允许的请求数 #描述: 熔断器半开到关闭所必须的最少成功请求数
#类型:int successCountAfterHalfOpen: 3
#范围:[3:...] #描述:熔断策略SDK会根据策略名称加载对应的熔断器插件已注册的熔断器插件名
#默认值:10
requestCountAfterHalfOpen: 10
#描述:熔断器打开后,多久后转换为半开状态
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[1s:...]
#默认值:30s
sleepWindow: 60s
#描述:熔断器半开到关闭所必须的最少成功请求数
#类型:int
#范围:[1:requestCountAfterHalfOpen]
#默认值:8
successCountAfterHalfOpen: 8
#描述:熔断器半开到关闭的统计周期
#类型:string
#范围:[10s:...]
#默认值:60s
recoverWindow: 60s
#描述:熔断器半开到关闭的统计滑桶数
#类型:int
#范围:[1:...]
#默认值:10
recoverNumBuckets: 10
#描述:熔断策略SDK会根据策略名称加载对应的熔断器插件
#类型:list
#范围:已注册的熔断器插件名
#默认值基于周期连续错误数熔断errorCount、以及基于周期错误率的熔断策略errorRate
chain: chain:
- errorCount - errorCount
- errorRate - errorRate
#描述:熔断插件配置 #描述: 熔断插件配置
plugin: plugin:
#描述:基于周期连续错误数熔断策略配置 #描述:基于周期连续错误数熔断策略配置
errorCount: errorCount:
#描述:触发连续错误熔断的阈值 #描述: 触发连续错误熔断的阈值
#类型:int continuousErrorThreshold: 10
#范围:[1:...]
#默认值:10
continuousErrorThreshold: 1
#描述:连续错误数的最小统计单元数量
#类型:int
#范围:[1:...]
#默认值:10
metricNumBuckets: 1
#描述:连续失败的统计周期
#类型:string
#格式:^\d+(ms|s|m|h)$
#范围:[10ms:...]
#默认值:1m
metricStatTimeWindow: 100ms
#描述:基于周期错误率的熔断策略配置 #描述:基于周期错误率的熔断策略配置
errorRate: errorRate:
#描述:触发错误率熔断的阈值 #描述:触发错误率熔断的阈值百分比
#类型:double errorRateThreshold: 1
#范围:(0:1] #描述: 错误率熔断的滑窗数量
#默认值:0.5
errorRateThreshold: 0.01
#描述:错误率熔断的最小统计单元数量
#类型:int
#范围:[1:...]
#默认值:5
metricNumBuckets: 5 metricNumBuckets: 5
#描述:错误率熔断的统计周期 #描述: 触发错误率熔断的最低请求阈值
#类型:string requestVolumeThreshold: 10
#格式:^\d+(ms|s|m|h)$ #描述:主动探测相关配置
#范围:[1s:...] outlierDetection:
#默认值:1m #描述何时开启主动探测。never永不开启,on_recover恢复时才开启主动探测,always一直开启主动探测
metricStatTimeWindow: 1s when: never
#描述:触发错误率熔断的最低请求阈值 #描述:主动探测周期
#类型:int checkPeriod: 30s
#范围:(0:...] #描述:主动探测插件链
#默认值:10 chain:
requestVolumeThreshold: 1 - http
- tcp
- udp
# 被调方配置
provider:
# 限流配置
rateLimit:
# 是否开启限流功能
enable: true
# 限流本地存在的最大窗口限制
maxWindowCount: 10000000
# 超过最大窗口限制时的策略。pass放通, reject限流
fallbackOnExceedWindowCount: pass

@ -12,8 +12,6 @@ global:
timeout: 5s timeout: 5s
feign: feign:
hystrix:
enabled: true #在Feign中开启Hystrix
compression: compression:
request: request:
enabled: false #是否对请求进行GZIP压缩 enabled: false #是否对请求进行GZIP压缩
@ -22,19 +20,5 @@ feign:
response: response:
enabled: false #是否对响应进行GZIP压缩 enabled: false #是否对响应进行GZIP压缩
ribbon:
polaris:
enabled: true
# 同一实例最大重试次数,不包括首次调用
MaxAutoRetries: 1
# 重试其他实例的最大重试次数不包括首次所选的server
MaxAutoRetriesNextServer: 2
# 是否所有操作都进行重试
OkToRetryOnAllOperations: false
ConnectionTimeout: 1000
ReadTimeout: 1000
eager-load:
enabled: on
serivceB: serivceB:
url: http://localhost:48081 url: http://localhost:48081

@ -27,6 +27,7 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties;
import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient;
import org.springframework.cloud.openfeign.loadbalancer.RetryableFeignBlockingLoadBalancerClient;
/** /**
* Wrap Spring Bean and decorating proxy for Feign Client. * Wrap Spring Bean and decorating proxy for Feign Client.
@ -51,8 +52,8 @@ public class PolarisFeignBeanPostProcessor implements BeanPostProcessor, BeanFac
private Object wrapper(Object bean) { private Object wrapper(Object bean) {
if (isNeedWrap(bean)) { if (isNeedWrap(bean)) {
if (bean instanceof FeignBlockingLoadBalancerClient) { if (bean instanceof RetryableFeignBlockingLoadBalancerClient) {
FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) bean; RetryableFeignBlockingLoadBalancerClient client = (RetryableFeignBlockingLoadBalancerClient) bean;
return new PolarisFeignBlockingLoadBalancerClient(createPolarisFeignClient(client.getDelegate()), return new PolarisFeignBlockingLoadBalancerClient(createPolarisFeignClient(client.getDelegate()),
factory.getBean(BlockingLoadBalancerClient.class), factory.getBean(BlockingLoadBalancerClient.class),
factory.getBean(LoadBalancerProperties.class), factory.getBean(LoadBalancerProperties.class),

@ -110,7 +110,7 @@ public class PluggableFeign {
if (void.class != fallback) { if (void.class != fallback) {
fallbackInstance = getFallbackInstanceFromContext(beanName, "fallback", fallback, fallbackInstance = getFallbackInstanceFromContext(beanName, "fallback", fallback,
target.type()); target.type());
return new PluggableFeignInvocationHandler(target, dispatch, (FallbackFactory) fallbackInstance, pluggableFeignPlugins); return new PluggableFeignInvocationHandler(target, dispatch, new FallbackFactory.Default(fallbackInstance), pluggableFeignPlugins);
} }
if (void.class != fallbackFactory) { if (void.class != fallbackFactory) {

Loading…
Cancel
Save