所谓“安全的停止服务”（也叫：优雅停止，或者：优雅下线）是指：在一个集群内，一个服务实例停止时，即不影响已有请求，也不影响第三方调用。Solon 在内核层面已提供了安全停止的机制：

### 1、操作说明（通过配置启用）

或者用启动参数

```
java -jar demoapi.jar --stop.safe=1
```

或者用jvm参数

```
java -Dsolon.stop.safe=1 -jar demoapi.jar
```

或者用 container 的环境变量

```
services:
  demoapi:
    image: demo/demoapi:1.0.0
    container_name: demoapi
    environment:
      - solon.stop.safe=1
      - TZ=Asia/Shanghai
    ports:
      - 8080:8080	
```

### 2、完整的配置

```yml
solon.stop.safe: 0   #安全停止（0或1）//（v2.1.0 后支持；之前只能用接口启用）
solon.stop.delay: 10   #安全停止的延时秒数（默认10秒）
```


### 3、内部原理说明

启用安全停止后的内部处理流程：（不开启，则没有等待时间）：

1. 执行插件预停止动作（一般会向注册服务注销自己）
2. 等3秒（让发现服务同步状态）
3. 将当前应用标为已停止，请求响应为 503 状态码（标识服务不可用）
4. 等7秒（用于消化已有的请求）
5. 执行插件停止动作
6. 退出进程

等待时间，是为了让消费端发现服务的状态变化（这里需要一定时间同步；不同框架或中间件时间不同）。


### 4、补充

#### a) 有注册与发现服务的环镜

按以上操作即可。

#### b) 没有注册与发现服务的环镜

比如只使用了 nginx？需要增加503重试机制：

```
upstream demoapi {
    server 127.0.0.1:9030 weight=10;
    server 127.0.0.1:9031 weight=10;
}
server {
    listen 8081;
    location / {
        proxy_pass http://demoapi;
        proxy_next_upstream error timeout http_503;
    }
}
```
其它环境可以参考 nginx 的配置思路。