服务注册中心
eureka
Eureka 无论是服务端还是客户端都依赖了 Ribbon,所以导入了 Eureka 组件后,同时已经导入了 Ribbon 组件,所以直接编码 Ribbon 即可
因此负载均衡策略是由client端实现而不是注册中心server端实现
eureka:
client:
register-with-eureka: false #是否注册ek本身
fetch-registry: false #是否同步其他Eureka Server节点的数据
service-url:
defaultZone: http://127.0.0.1:${server.port}/eureka/ #与Eureka Server交互的地址,客户配置这个地址进行注册
instance:
prefer-ip-address: true # 节点使用ip注册,否则使用hostname 注册
instance-id: ${spring.cloud.client.ipAddress}:${server.port} #控制台上显示的实例名称
feign
springboot引入依赖后添加启动注解EnableFeignClients
常用配置(HystrixCommandProperties.class)
1、断路器
启用:添加注解EnableCircuitBreaker
默认规则:20s内错误路达到50%后跳闸,5s后再开启闸门
HystrixCommandKey为default时则约束于所有实例
#启用hystrix
feign.hystrix.enabled
#设置滚动窗口中将使断路器跳闸的最小请求数量
hystrix.command.HystrixCommandKey.circuitBreaker.requestVolumeThreshold=...
#断路器跳闸后,在此值的时间的内,hystrix会拒绝新的请求,只有过了这个时间断路器才会打开闸门
hystrix.command.HystrixCommandKey.circuitBreaker.requestVolumeThreshold=...
#设置失败百分比的阈值。如果失败比率超过这个值,则断路器跳闸并且进入fallback逻辑
hystrix.command.HystrixCommandKey.circuitBreaker.errorThresholdPercentage=...
#如果设置true,则强制使断路器跳闸,则会拒绝所有的请求.此值会覆盖circuitBreaker.forceClosed的值
hystrix.command.HystrixCommandKey.circuitBreaker.forceOpen=...
#如果设置true,则强制使断路器跳闸,则会拒绝所有的请求.此值会覆盖circuitBreaker.forceClosed的值
hystrix.command.HystrixCommandKey.circuitBreaker.forceClosed=...
2、降级
使用注解FeignClient的fallback属性
3、负载均衡
RandomRule:随机选取负载均衡策略,随机Random对象,在所有服务实例中随机找一个服务的索引号,然后从上线的服务中获取对应的服务。
RoundRobinRule:线性轮询负载均衡策略。
WeightedResponseTimeRule:响应时间作为选取权重的负载均衡策略,根据平均响应时间计算所有服务的权重,响应时间越短的服务权重越大,被选中的概率越高。刚启动时,如果统计信息不足,则使用线性轮询策略,等信息足够时,再切换到WeightedResponseTimeRule。
RetryRule:使用线性轮询策略获取服务,如果获取失败则在指定时间内重试,重新获取可用服务。
ClientConfigEnabledRoundRobinRule:默认通过线性轮询策略选取服务。通过继承该类,并且对choose方法进行重写,可以实现更多的策略,继承后保底使用RoundRobinRule策略。
BestAvailableRule:继承自ClientConfigEnabledRoundRobinRule。从所有没有断开的服务中,选取到目前为止请求数量最小的服务。
PredicateBasedRule:抽象类,提供一个choose方法的模板,通过调用AbstractServerPredicate实现类的过滤方法来过滤出目标的服务,再通过轮询方法选出一个服务。
AvailabilityFilteringRule:按可用性进行过滤服务的负载均衡策略,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阈值的服务,然后对剩余的服务列表进行线性轮询。
ZoneAvoidanceRule:本身没有重写choose方法,用的还是抽象父类PredicateBasedRule的choose。