什么叫平滑发布?
在发布的过程中不影响用户的使用,系统不会因发布而暂停对外服务,不会造成用户短暂性无法访问;
eureka manage介绍
不管是服务提供方还是服务调用方都必须接入eureka manage功能,这个可以控制应用上下线,在发布的过程中可以优雅下线
eureka manage提供了两个接口
- 上线服务:http://ip:port/manage/online
- 下线服务:http://ip:port/manage/offline
如果调用manage/online或manage/offline返回不是404状态码或者返回内容不是true将停止项目发布,对应状态关系 online=up, offline=down
核心代码:
@RequestMapping("/manage")
public class EurekaManageController {
@Autowired
private ApplicationInfoManager applicationInfoManager;
@RequestMapping("/online")
@ResponseBody
public Object online() {
return changeInstanceStatus(InstanceInfo.InstanceStatus.UP);
}
@RequestMapping("/offline")
@ResponseBody
public Object offline() {
return changeInstanceStatus(InstanceInfo.InstanceStatus.DOWN);
}
private boolean changeInstanceStatus(InstanceInfo.InstanceStatus status) {
if (Objects.nonNull(applicationInfoManager) && Objects.nonNull(status)) {
applicationInfoManager.setInstanceStatus(status);
return true;
}
return false;
}
}
原理简介:
在使用spring cloud的eureka来提供服务时,服务提供方会将自己的服务注册到注册中心,默认状态为UP。bc
服务状态有:
com.netflix.appinfo.InstanceInfo.InstanceStatus
UP, // Ready to receive traffic
DOWN, // Do not send traffic- healthcheck callback failed
STARTING, // Just about starting- initializations to be done - do not
// send traffic
OUT_OF_SERVICE, // Intentionally shutdown for traffic
UNKNOWN;
服务提供方使用此工具调用online接口时,会做以下处理:
*会将当前instance的本地状态修改为UP
*将状态同步到注册中心
*注册中心定时刷新响应缓存(eureka.responseCacheUpdateInterval影响此频率)
*服务调用方定时轮询注册中心的实例信息,并更新本地缓存(eureka.client.registryFetchIntervalSeconds影响此频率)
*服务调用方的ribbon会定时通过本地缓存刷新本地的路由表(ribbon.ServerListRefreshInterval影响此频率)
offline时跟以上步骤类似,不再缀述。
客户端配置参数
#服务默认注册状态
eureka.instance.initialStatus = DOWN
#客户端从注册中心拉取实例信息的频率,单位为s
eureka.client.registryFetchIntervalSeconds=2
#ribbon刷新本地缓存的频率,单位ms
ribbon.ServerListRefreshInterval = 2000
Eureka Server配置
#注册中心刷新响应缓存的频率,单位ms
eureka.server.response-cache-update-interval-ms=2000
运维发布流程