1.负载均衡失效
通过zuul访问服务当服务有多个节点时,访问竟然是轮询,如果有一个节点down掉了,依然会轮循到此机器。该问题困扰我很久,为什么会这么蠢?
终于在github找到开发者说道:
Brixton
In Brixton we use the Ribbon HTTP Client when proxying requests through Zuul. This means you can use all ribbon.*
properties to configure retry and connection logic with Zuul.
Camden
In Camden we no longer use the Ribbon HTTP Client so none of the ribbon.*
properties will help you control the retry logic.
原来是版本的问题,所以如果用Camden以后版本的注意了,如果要用ribbon的负载,就要加上
ribbon.restclient.enabled=true
之后retry的策略以及超时时间都可以控制了
2.一些参数说明
服务端:
eureka.server.enable-self-preservation
默认为true,简单的说就是eureka认为有的时候client没有出错只是因为网络问题导致没连上client,所以不能简单的拿掉client,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)
eureka.server.eviction-interval-timer-in-ms
清除无效节点的时间,默认60000
客户端:
eureka.client.registry-fetch-interval-seconds
表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒
eureka.instance.lease-expiration-duration-in-seconds
leaseExpirationDurationInSeconds,表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。
- 默认为90秒
- 如果该值太大,则很可能将流量转发过去的时候,该instance已经不存活了。
- 如果该值设置太小了,则instance则很可能因为临时的网络抖动而被摘除掉。
- 该值至少应该大于leaseRenewalIntervalInSeconds
eureka.instance.lease-renewal-interval-in-seconds
leaseRenewalIntervalInSeconds,表示eureka client发送心跳给server端的频率。如果在leaseExpirationDurationInSeconds后,server端没有收到client的心跳,则将摘除该instance。除此之外,如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也不会接收到流量。
- 默认30秒
3.zuul网关过滤header的Authorization信息
本来要验证Authorization的token信息的,结果收到的是空
因为zuul默认把这些信息给过滤掉了
zuul.sensitiveHeaders = Cookie,Set-Cookie
默认是cookie,set-cookie,跟authorization
4.灰色无缝发布
这个也是困扰我很久的一个问题,终于在eureka的github上发现有提供一些rest接口来操作服务
https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
一开始使用
De-register application instance | DELETE /eureka/v2/apps/appID/instanceID | HTTP Code: 200 on success |
发现delete之后很快又自动注册上去了,很是头疼无法实现场景
后来也想配置 @EnableDiscoveryClient(autoRegister=false)来实现
找了半天也没找到合适的实现方法
后来发现
Take instance out of service | PUT /eureka/v2/apps/appID/instanceID/status?value=OUT_OF_SERVICE | HTTP Code: * 200 on success * 500 on failure |
这样的话可以成功拿掉实例,然后再部署之后再改成UP就可以了,写个脚本或者页面来控制,效果更佳