springcloud常见问题总结以(一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
springcloud常见问题总结以(⼀)
1. 服务注册涉及到周期性的⼼跳,默认30秒⼀次,只有当实例、服务器端和客户端本地缓存中的元数据都相同时,服务才能被其他客户端发现(可能需要三次⼼跳)。
2. 可以使⽤参数eureka.instance.leaseRenewalintervalInSeconds修改eureka client向eureka server发送⼼跳间隔,从⽽加快客户端连接到其他服务的过程。
在⽣产环境中最好坚持使⽤默认值,因为在服务器内部有⼀些计算,它们会对续约做出假设。
1. Eureka server清理⽆效节点的周期⽐较长(默认90秒),以及⾃我保护等原因,可能对服务节点注销慢或者不注销
2. Eureka server配置关闭⾃我保护,并按需配置清理⽆效节点的间隔:
eureka:
server:
enable-self-preservation: false # 测试时关闭⾃我保护机制,保证不可⽤服务及时踢出
eviction-interval-timer-in-ms: 30000 # 清理间隔单位是毫秒
3. Eureka client端开启健康检查,按需配置续约更新时间和到期时间:
eureka:
client:
healthcheck:
enabled: true #开启健康检查(需要spring-boot-starter-actuator依赖)
instance:
lease-renewal-interval-in-seconds: 1 # 每间隔1s,向服务端发送⼀次⼼跳,证明⾃⼰依然”存活“,默认30秒
lease-expiration-duration-in-seconds: 2 # 告诉服务端,如果我2s之内没有给你发⼼跳,就代表我“死”了,将我踢出掉,默认90秒。
注意:
这些配置⼀般在开发测试的时候使⽤,⽣产环境建议使⽤默认配置
4. ⾃定义微服务instanceID
eureka:
instance:
instance-id: ${spring.cloud.client.ipAddress}:${server.port} # 将instance-id设置为ip:端⼝的形式。
1. Hystrix默认超时时间是1秒,⾸次加载的时候因为服务器缓存,或者创建连接池等原因,就会进⼊fallback逻辑。
由于spring的懒加载机制,因此在某些机器上⾸次请
求的时间可能⼤于1秒
2. 解决⽅案⼀,延长Hystrix超时时间:
代码中修改默认超时配置(改为3秒):
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String serverMethod() {
return null;
}
application.properties中设置默认超时时间:
1.默认:(⽅法上记得要加上@HystrixCommand,否则⽆效):
mand.default.execution.isolation.thread.timeoutInMilliseconds=3000
2.配置具体⽅法的超时时间
mand.serverMethod.execution.isolation.thread.timeoutInMilliseconds=3000
3. 解决⽅案⼆,禁⽤Hystrix超时:
mand.default.execution.timeout.enabled: false
4. 对于feign,可以禁⽤feign的hystrix功能
feign.hystrix.enabled: false #⽐较极端,⼀般不建议使⽤
1. YAML缩进是否正确:
YAML缩进不正确会导致springcloud 应⽤⽆法正常启动或者配置⽂件⽆法加载
2. 配置属性是否正确:
3. 配置属性位置是否正确:
-应当配置在Eureka client 的属性配置在了Eureka server
-应当配置在bootstrap.yml的属性,写在了application.yml中,例如:
spring.cloud.config.uri= http://...
-应当配置在application.yml的属性,写在了bootstrap.yml中,例如:
eureka.client.healthcheck.enabled= true
经过排查发现是因为在路由转发请求头时没有判断值为null的情况导致,过滤掉head为null的情况即可解决。