springcloud针对eureka、ribbon、feign、hystrix配置详解
前言
随着微服务体系成熟,配置文件都有了范本,因此很多配置我们都是拿来就用,并不明白配置的理由。本文对一些常用、非常用的配置进一步解释,并记录本人配置过程中踩过的坑、解决过的问题。
版本
该文中springcloud版本为
Finchley.SR3
eureka相关配置
eureka:
instance:
prefer-ip-address: true
instance-id:
ip-address:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://my-eureka1:10100/eureka,http://my-eureka2:10100/eureka
server:
enable-self-preservation: false
prefer-ip-address: true
instance-id:
ip-address:
这里想重点说下这三个配置,并不是很常用,但很有用!
instance_id就是服务注册在注册中心的实例名,注册中心以此来标识不同的服务。若不进行单独设置,则该值默认为主机名+服务名+端口,基本可以唯一标识一个服务了。但有时主机名并不具有很好的可读性,比如虚拟机的主机名就是一串乱码,此时可以手动设置该属性。
prefer-ip-address: true表示优先使用ip地址作为主机名标识,该配置可以使得主机名可读性增加,主机名辨识度低的首选解决方案
ip-address:显示的定义实例ip,这个配置很容易被忽略,因为一般实例注册时会自行解析ip并注册在注册中心中。但是对于网络环境比较复杂的情况,比如被代理的A服务注册在被代理的B注册中心上,此时如果不作显示设置,A会将代理前的ip注册在B上作为实例ip,此时如果与A代理前环境网络不通的服务C注册在B上,获取到的A实例则不可访问。有点拗口。。。对于上述这种情况,我们需要将代理后的A地址显示的注册到B上,则C获取到的A实例ip即为代理后的ip。还有一种场景,前面提到实例在注册时会使用解析的ip注册,但如果由于某种原因,DNS解析过慢,则在一定时长(默认1s)获取不到ip时,服务将会以localhost作为ip注册实例,这明显不合理。因此显示定义ip在该场景下也很使用。
ribbon、hystrix相关配置
ribbon:
okhttp:
enabled: true
http:
client:
enabled: false
ConnectTimeout: 3000
ReadTimeout: 10000
#retry
maxAutoRetries: 2
maxAutoRetriesNextServer: 1
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 50000
我们在zuul和各服务中一般这样配置,使用okhttp代替httpclient,连接超时设置为3s,读取超时设置为10s(根据实际情况调整)
zuul的重试机制需要单独配置开启
zuul:
retryable: true
开启重试需要引入依赖
<!--重试依赖-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
maxAutoRetries:对单个实例重试2次,即共访问3次
maxAutoRetriesNextServer:切换实例1次
即一共访问(2+1)*(1+1)= 6次
因此最大耗时**(3s+10s)6次=48000ms*
因此熔断器超时设置为
timeoutInMilliseconds: 50000
50s,这样熔断机制才有意义
feign配置
feign:
okhttp:
enabled: true
httpclient:
enabled: false
#gzip
compression:
request:
enabled: true
response:
enabled: true
在使用feign的服务中,我们会基于上面对ribbon的配置再加这些:使用okhttp代替httpclient,并针对gzip传输进行优化。
总结
以上,好像什么都没说。。。基本常用的也就是这些配置了。