spring cloud高可用注册中心
机器配置
准备两台+机器,此处以两台机器做为例子:10.10.10.100,10.10.10.101。
修改系统host,若是用docker发布则在docker-compose.yml文件中配置host。
10.10.10.100 docker host配置:spring
extra_hosts: - "eurekapeer:10.10.10.101"
10.10.10.101 docker host配置:docker
extra_hosts: - "eurekapeer:10.10.10.100"
eureka配置
主要是将defaultZone中地址指向host中配置的机器,实现注册中心的相互注册已达到高可用。api
eureka: client: serviceUrl: defaultZone: http://eurekapeer:${server.port}/eureka/
按照以上配置启动,打开任意一个注册中心界面:缓存
- 会在DS Replicas栏中看到另外一台机器的信息,
- 会在Instances currently registered with Eureka栏中看到两个注册中心的信息
client配置
主要是配置defaultZone指向两个注册中心便可负载均衡
eureka: client: serviceUrl: defaultZone: http://10.10.10.100:8181/eureka/,http://10.10.10.101:8181/eureka/
spring cloud平滑上下线
关注点
- eureka快速剔除已下线服务
- zuul网关快速拉取服务列表
- 服务不可达时进行重试
eureka快速剔除已下线服务
- client端加快对eureka的心跳频率,并缩短续期时间
- 端加快情侣无效服务间隔
这样一来,理论上最长剔除不可用服务时间=client心跳频率+client续期时间+服务端剔除无效服务间隔时间。fetch
eureka服务端配置:code
eureka: server: eviction-interval-timer-in-ms: 5000 #清理无效服务间隔(单位毫秒,默认是1分钟)
eureka客户端配置:server
eureka: instance: lease-renewal-interval-in-seconds: 5 #eureka client发送心跳给server端的频率(默认30秒) lease-expiration-duration-in-seconds: 10 #eureka client发送心跳给server端后,续约到期时间(默认90秒)
zuul网关快速拉取服务列表
zuul网关会去eureka拉取服务列表并进行缓存,咱们尽可能缩短拉取时间:接口
eureka: client: registry-fetch-interval-seconds: 3 #client间隔多久去拉取服务注册信息(默认30秒)对于api-gateway若是要迅速获取服务注册状态,能够缩小该值
当一个服务下线后,eureka并不会当即剔除,在此期间若是zuul使用缓存服务,或者获取到了已下线服务,此时对请求进行转发时会致使服务不可达返回500错误,这种状况线下能够配置zuul重试,注意此处的重试不是配置zuul对异常接口的重试;zuul配置以下:部署
#服务下线后,zuul重试 ribbon: OkToRetryOnAllOperations: true #是否全部操做都重试,若false则仅get请求重试 MaxAutoRetriesNextServer: 1 #重试负载均衡其余实例最大重试次数,不含首次实例 MaxAutoRetries: 0 #(同一实例最大重试次数,不含首次调用) retryableStatusCodes: 404,500,503
zuul对异常接口的重试:
spring cloud中默认的熔断时间是1000ms,若是单个服务接口响应时间超过此配置时长,此时若是须要zuul进行重试,则如此配置:
zuul: retryable: true
这种状况下须要考虑接口的幂等性。
##关于发布 集群发布时最好单个服务单台进行部署,理论上单个服务之间部署时间间隔最少须要大于:client心跳+client续期+eureka剔除+zuul获取服务时间。