Eureka 优雅停服

一、在什么条件下,Eureka 会启动自我保护?
1,自我保护的条件
一般情况下,微服务在Eureka 上注册后,会每30 秒发送心跳包,Eureka 通过心跳来
判断服务时候健康,同时会定期删除超过90 秒没有发送心跳服务。

2,有两种情况会导致Eureka Server 收不到微服务的心跳
a.是微服务自身的原因
b.是微服务与Eureka 之间的网络故障
通常(微服务的自身的故障关闭)只会导致个别服务出现故障,一般不会出现大面积故
障,而(网络故障)通常会导致Eureka Server 在短时间内无法收到大批心跳。
考虑到这个区别,Eureka 设置了一个阀值,当判断挂掉的服务的数量超过阀值时,
Eureka Server 认为很大程度上出现了网络故障,将不再删除心跳过期的服务。

3,那么这个阀值是多少呢?
15 分钟之内是否低于85%;
Eureka Server 在运行期间,会统计心跳失败的比例在15 分钟内是否低于85%
这种算法叫做Eureka Server 的自我保护模式。

二、为什么要启动自我保护
1,因为同时保留"好数据"与"坏数据"总比丢掉任何数据要更好,当网络故障恢复后,这个Eureka 节点会退出"自我保护模式"。
2,Eureka 还有客户端缓存功能(也就是微服务的缓存功能)。即便Eureka 集群中所有节点都宕机失效,微服务的Provider 和Consumer都能正常通信。
3,微服务的负载均衡策略会自动剔除死亡的微服务节点。

三、如何关闭自我保护
修改Eureka Server 配置文件

#关闭自我保护:true 为开启自我保护,false 为关闭自我保护
eureka.server.enableSelfPreservation=false
#清理间隔(单位:毫秒,默认是60*1000)
eureka.server.eviction.interval-timer-in-ms=60000

四、如何优雅停服
4.1不需要再Eureka Server 集群中配置关闭自我保护
4.2需要在服务中添加actuator.jar 包

</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

4.3修改配置文件
#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false
4.4发送一个关闭服务的URL 请求

public class HttpClientUtil {
public static String doGet(String url, Map<String, String>
param) {
// 创建Httpclient 对象
CloseableHttpClient httpclient =
HttpClients.createDefault();
String resultString = "";
CloseableHttpResponse response = null;
try {
// 创建uri
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, param.get(key));
}
}U
RI uri = builder.build();
// 创建http GET 请求
HttpGet httpGet = new HttpGet(uri);
// 执行请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() ==
200) {
resultString =
EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}h
ttpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
public static String doGet(String url) {
return doGet(url, null);
}
public static String doPost(String url, Map<String, String>
param) {
// 创建Httpclient 对象
CloseableHttpClient httpClient =
HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post 请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (param != null) {
List<NameValuePair> paramList = new
ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key,
param.get(key)));
}
// 模拟表单
UrlEncodedFormEntity entity = new
UrlEncodedFormEntity(paramList,"utf-8");
httpPost.setEntity(entity);
}
// 执行http 请求
response = httpClient.execute(httpPost);
resultString =
EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
public static String doPost(String url) {
return doPost(url, null);
}
public static String doPostJson(String url, String json) {
// 创建Httpclient 对象
CloseableHttpClient httpClient =
HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post 请求
HttpPost httpPost = new HttpPost(url);
// 创建请求内容
StringEntity entity = new StringEntity(json,
ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 执行http 请求
response = httpClient.execute(httpPost);
resultString =
EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
public static void main(String[] args) {
String url ="http://127.0.0.1:9090/shutdown";
//该url 必须要使用dopost 方式来发送
HttpClientUtil.doPost(url);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值