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就可以了,写个脚本或者页面来控制,效果更佳