在很多时候 kill -9 pid并不是很友好的方法,那样会将我们正在执行请求给断掉,同时eureka 中服务依旧是处于在线状态,这个时候我们可以使用官方提供的actuator来做优雅的关闭处理

- Actuator

spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http、jmx、ssh、telnet等拉管理和监控应用。审计(Auditing)、健康(health)、数据采集(metrics gathering)会自动加入到应用里面。

- 开始

如果对Eureka不熟悉的可以参考:一起来学SpringCloud之-注册中心(Eureka/Consul)

- battcn-cloud-discovery

pom.xml导入eureka-server

  1. 1
    2
    3
    4
    5
    6
  1. <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
    </dependencies>

application.yml 配置内容

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
  1. server:
    port: 7001
    spring:
    application:
    name: battcn-cloud-discovery
    eureka:
    instance:
    hostname: localhost
    prefer-ip-address: true
    client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
    defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

DiscoveryApplication 主函数启动类

  1. 1
    2
    3
    4
    5
    6
    7
  1. @SpringBootApplication
    @EnableEurekaServer
    public class DiscoveryApplication {
    public static void main(String[] args) {
    SpringApplication.run(DiscoveryApplication.class, args);
    }
    }

- battcn-cloud-hello

pom.xml导入eurekaactuator,注意该处不能用tomcat(原因还没找到,用tomcat报错,有兴趣的可以自己也试试)

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
  1. <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
    <exclusions>
    <exclusion>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    </dependencies>

application.yml 配置内容

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  1. server.port: 7002
    spring.application.name: battcn-cloud-hello
    endpoints.shutdown.enabled: true #开启优雅关闭方式
    management.security.enabled: false #关闭安全认证
    eureka:
    instance:
    hostname: localhost
    prefer-ip-address: true
    client:
    service-url:
    defaultZone: http://${eureka.instance.hostname}:7001/eureka/

HelloApplication 主函数与测试方法

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
  1. import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
  2.  
  3. @SpringBootApplication
    @EnableDiscoveryClient
    @RestController
    public class HelloApplication {
    static Logger LOGGER = LoggerFactory.getLogger(HelloApplication.class);
    @GetMapping("/h1")
    public void home() {
    for (int i = 1;i < 6;i++) {
    try {
    Thread.sleep(i * 500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    LOGGER.info("[当前进度] - [{}]",i);
    }
    }
  4.  
  5. public static void main(String[] args) {
    SpringApplication.run(HelloApplication.class, args);
    }
    }

- 测试

1.分别启动battcn-cloud-discovery 和 battcn-cloud-hello两个服务

2.GET请求访问 http://192.168.206.1:7002/h1

3.POST请求访问:http://192.168.206.1:7002/shutdown

PostMan

- 日志分析

  • battcn-cloud-discovery
  1. 1
    2
    3
    4
  1. 2017-08-20 11:50:38.257 INFO 6776 --- [nio-7001-exec-3] c.n.e.registry.AbstractInstanceRegistry : Registered instance BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 with status DOWN (replication=false)
    2017-08-20 11:50:38.259 INFO 6776 --- [nio-7001-exec-8] c.n.e.registry.AbstractInstanceRegistry : Cancelled instance BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 (replication=false)
    2017-08-20 11:50:38.765 INFO 6776 --- [nio-7001-exec-5] c.n.e.registry.AbstractInstanceRegistry : Registered instance BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 with status DOWN (replication=true)
    2017-08-20 11:50:38.766 INFO 6776 --- [nio-7001-exec-5] c.n.e.registry.AbstractInstanceRegistry : Cancelled instance BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 (replication=true)
  • battcn-cloud-hello
  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
  1. 2017-08-20 11:50:34.911 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [1]
    2017-08-20 11:50:35.912 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [2]
    2017-08-20 11:50:37.413 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [3]
    2017-08-20 11:50:38.251 INFO 1304 --- [ Thread-28] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1c481ff2: startup date [Sun Aug 20 11:50:24 CST 2017]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@60dcc9fe
    2017-08-20 11:50:38.252 INFO 1304 --- [ Thread-28] o.s.c.n.e.s.EurekaServiceRegistry : Unregistering application battcn-cloud-hello with eureka with status DOWN
    2017-08-20 11:50:38.252 WARN 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1503201038252, current=DOWN, previous=UP]
    2017-08-20 11:50:38.252 INFO 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient ...
    2017-08-20 11:50:38.252 INFO 1304 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002: registering service...
    2017-08-20 11:50:38.253 INFO 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : Unregistering ...
    2017-08-20 11:50:38.258 INFO 1304 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 - registration status: 204
    2017-08-20 11:50:38.260 INFO 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : DiscoveryClient_BATTCN-CLOUD-HELLO/192.168.206.1:battcn-cloud-hello:7002 - deregister status: 200
    2017-08-20 11:50:38.264 INFO 1304 --- [ Thread-28] com.netflix.discovery.DiscoveryClient : Completed shut down of DiscoveryClient
    2017-08-20 11:50:38.265 INFO 1304 --- [ Thread-28] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 0
    2017-08-20 11:50:38.269 INFO 1304 --- [ Thread-28] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
    2017-08-20 11:50:38.270 INFO 1304 --- [ Thread-28] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans
    2017-08-20 11:50:38.283 INFO 1304 --- [ Thread-28] o.e.jetty.server.AbstractConnector : Stopped ServerConnector@622fdb81{HTTP/1.1,[http/1.1]}{0.0.0.0:7002}
    2017-08-20 11:50:38.283 INFO 1304 --- [ Thread-28] org.eclipse.jetty.server.session : Stopped scavenging
    2017-08-20 11:50:38.290 INFO 1304 --- [ Thread-28] o.e.j.s.h.ContextHandler.application : Destroying Spring FrameworkServlet 'dispatcherServlet'
    2017-08-20 11:50:38.291 INFO 1304 --- [ Thread-28] o.e.jetty.server.handler.ContextHandler : Stopped o.s.b.c.e.j.JettyEmbeddedWebAppContext@987455b{/,[file:///C:/Users/Levin/AppData/Local/Temp/jetty-docbase.3368921683179226836.7002/],UNAVAILABLE}
    2017-08-20 11:50:39.414 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [4]
    2017-08-20 11:50:41.915 INFO 1304 --- [qtp161672347-19] com.battcn.HelloApplication : [当前进度] - [5]

从上述两端日志中可以看出,当我们发送shutdown命令的时候,会先通知eureka做服务下线处理,防止后续请求继续获取服务列表,然后当前服务的请求会继续执行,直到处理完毕后关闭进程,有兴趣的可以自己看看org.springframework.boot.actuate.endpoint.ShutdownEndpoint

优雅关闭服务下线(Jetty)的更多相关文章

  1. 7.Go退出向Consuk反注册服务,优雅关闭服务

    注册和反注册代码 package utils import ( consulapi "github.com/hashicorp/consul/api" "log" ...

  2. 优雅关闭web服务的方式

    优雅关闭web服务 DBHelper, err = gorm.Open("mysql", "root:root@(115.159.59.129:3306)/test?ch ...

  3. springcloud优雅停止上下线与熔断

    SpringCloud 服务优雅上下线 Spring Boot 框架使用"约定大于配置"的特性,优雅流畅的开发过程,应用部署启动方式也很优雅.但是我们通常使用的停止应用的方式是 k ...

  4. SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2)

    SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2) 优雅停止&暴力停止 暴力停止:像日常开发过程中,测试区或者本地开发时,我们并不会考虑项目关 ...

  5. Eureka服务下线后快速感知配置

    现在由于eureka服务越来越多,发现服务提供者在停掉很久之后,服务调用者很长时间并没有感知到变化,依旧还在持续调用下线的服务,导致长时间后才能返回错误,因此需要调整eureka服务和客户端的配置,以 ...

  6. SpringBoot系列: 如何优雅停止服务

    ============================背景============================在系统生命周期中, 免不了要做升级部署, 对于关键服务, 我们应该能做到不停服务完成 ...

  7. 如何优雅关闭 Spring Boot 应用

    ## 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理 ...

  8. Springboot 优雅停止服务的几种方法

    在使用Springboot的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭.而且一些没有执行完的程序就会直接退出 ...

  9. Netty源码剖析-关闭服务

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:  ----源码: 先在服务端加个断点和修改下代码:如 ...

随机推荐

  1. Java实现蓝桥杯VIP 算法训练 矩阵乘方

    import java.util.Scanner; public class 矩阵乘方 { public static void main(String[] args) { Scanner scann ...

  2. java实现第四届蓝桥杯三部排序

    三部排序 题目描述 一般的排序有许多经典算法,如快速排序.希尔排序等. 但实际应用时,经常会或多或少有一些特殊的要求.我们没必要套用那些经典算法,可以根据实际情况建立更好的解法. 比如,对一个整型数组 ...

  3. Redis企业级数据备份与恢复方案

    一.持久化配置 RBD和AOF建议同时打开(Redis4.0之后支持) RDB做冷备,AOF做数据恢复(数据更可靠) RDB采取默认配置即可,AOF推荐采取everysec每秒策略 AOF和RDB还不 ...

  4. java关键字tranisent用法详解

    作为java中的一个关键字,tranisent用的并不是很多,但是在某些关键场合,却又起着极为重要的作用,因此有必要对它进行一些必要的了解. 一.定义:声明不用序列化的成员域.(源自百度百科) 二.作 ...

  5. Vue封装公共组件TarBar

    github:https://github.com/zwnsyw/TabBar 一.实现简单思路 1.在页面底部有一个单独的TabBar组件1.1自定义TabBar组件,在APP中使用1.2让TabB ...

  6. Spark Streaming,Flink,Storm,Kafka Streams,Samza:如何选择流处理框架

    根据最新的统计显示,仅在过去的两年中,当今世界上90%的数据都是在新产生的,每天创建2.5万亿字节的数据,并且随着新设备,传感器和技术的出现,数据增长速度可能会进一步加快. 从技术上讲,这意味着我们的 ...

  7. fiddler下载安装

    1.官网https://www.telerik.com/fiddler 2.按照要求填写 3.傻瓜式安装 4.安装https证书

  8. 【JMeter_20】JMeter逻辑控制器__事务控制器<Transaction Controller>

    事务控制器<Transaction Controller> 业务逻辑: 这个控制器在在业务控制上并没有什么特殊逻辑,可以理解为在简单控制器的基础上添加了统计的功能,当所有子节点全部成功则成 ...

  9. CSS中可以继承的元素(需要记住)

    可以继承的属性很少,只有颜色,文字,字体间距行高对齐方式,和列表的样式可以继承. 所有元素可继承:visibility和cursor. 内联元素可继承:letter-spacing.word-spac ...

  10. rust 函数-生命周期

    记录一下自己理解的生命周期. 每个变量都有自己的生命周期. 在c++里生命周期好比作用域, 小的作用域的可以使用大作用域的变量. 如果把这里的每个作用域取个名,那么就相当于rust里的生命周期注解. ...