fix: fix FeignClient proxy problem

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

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

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

@ -12,8 +12,6 @@ global:
timeout: 5s
feign:
hystrix:
enabled: true #在Feign中开启Hystrix
compression:
request:
enabled: false #是否对请求进行GZIP压缩
@ -22,19 +20,5 @@ feign:
response:
enabled: false #是否对响应进行GZIP压缩
ribbon:
polaris:
enabled: true
# 同一实例最大重试次数,不包括首次调用
MaxAutoRetries: 1
# 重试其他实例的最大重试次数不包括首次所选的server
MaxAutoRetriesNextServer: 2
# 是否所有操作都进行重试
OkToRetryOnAllOperations: false
ConnectionTimeout: 1000
ReadTimeout: 1000
eager-load:
enabled: on
serivceB:
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.support.LoadBalancerClientFactory;
import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient;
import org.springframework.cloud.openfeign.loadbalancer.RetryableFeignBlockingLoadBalancerClient;
/**
* Wrap Spring Bean and decorating proxy for Feign Client.
@ -51,8 +52,8 @@ public class PolarisFeignBeanPostProcessor implements BeanPostProcessor, BeanFac
private Object wrapper(Object bean) {
if (isNeedWrap(bean)) {
if (bean instanceof FeignBlockingLoadBalancerClient) {
FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) bean;
if (bean instanceof RetryableFeignBlockingLoadBalancerClient) {
RetryableFeignBlockingLoadBalancerClient client = (RetryableFeignBlockingLoadBalancerClient) bean;
return new PolarisFeignBlockingLoadBalancerClient(createPolarisFeignClient(client.getDelegate()),
factory.getBean(BlockingLoadBalancerClient.class),
factory.getBean(LoadBalancerProperties.class),

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

Loading…
Cancel
Save