在很多时候 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包
| 12
 3
 4
 5
 6
 | <dependencies><dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-eureka-server</artifactId>
 </dependency>
 </dependencies>
 | 
application.yml 配置内容
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 | 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 主函数启动类
| 12
 3
 4
 5
 6
 7
 | @SpringBootApplication@EnableEurekaServer
 public class DiscoveryApplication {
 public static void main(String[] args) {
 SpringApplication.run(DiscoveryApplication.class, args);
 }
 }
 | 
- battcn-cloud-hello
pom.xml导入eureka和actuator,注意该处不能用tomcat(原因还没找到,用tomcat报错,有兴趣的可以自己也试试)
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 | <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 配置内容
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 | server.port: 7002spring.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 主函数与测试方法
| 12
 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
 | 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;
@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);
 }
 }
    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
PostMan
- 日志分析
| 12
 3
 4
 | 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)
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 | 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
												
												
								- 7.Go退出向Consuk反注册服务,优雅关闭服务
		注册和反注册代码 package utils import ( consulapi "github.com/hashicorp/consul/api" "log" ... 
- 优雅关闭web服务的方式
		优雅关闭web服务 DBHelper, err = gorm.Open("mysql", "root:root@(115.159.59.129:3306)/test?ch ... 
- springcloud优雅停止上下线与熔断
		SpringCloud 服务优雅上下线 Spring Boot 框架使用"约定大于配置"的特性,优雅流畅的开发过程,应用部署启动方式也很优雅.但是我们通常使用的停止应用的方式是 k ... 
- SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2)
		SpringBoot如何优雅关闭(SpringBoot2.3&Spring Boot2.2) 优雅停止&暴力停止 暴力停止:像日常开发过程中,测试区或者本地开发时,我们并不会考虑项目关 ... 
- Eureka服务下线后快速感知配置
		现在由于eureka服务越来越多,发现服务提供者在停掉很久之后,服务调用者很长时间并没有感知到变化,依旧还在持续调用下线的服务,导致长时间后才能返回错误,因此需要调整eureka服务和客户端的配置,以 ... 
- SpringBoot系列: 如何优雅停止服务
		============================背景============================在系统生命周期中, 免不了要做升级部署, 对于关键服务, 我们应该能做到不停服务完成 ... 
- 如何优雅关闭 Spring Boot 应用
		## 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理 ... 
- Springboot 优雅停止服务的几种方法
		在使用Springboot的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭.而且一些没有执行完的程序就会直接退出 ... 
- Netty源码剖析-关闭服务
		参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:  ----源码: 先在服务端加个断点和修改下代码:如 ... 
随机推荐
	
									- Java实现 蓝桥杯VIP 算法训练 拦截导弹
			1260:[例9.4]拦截导弹(Noip1999) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4063 通过数: 1477 [题目描述] 某国为了防御敌国的导弹袭击,发展出一 ... 
- Java实现 LeetCode 216. 组合总和 III(三)
			216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. ... 
- Java实现 洛谷 P1579 哥德巴赫猜想(升级版)
			题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是 ... 
- STL常用序列容器
			这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ... 
- 容器技术之Dockerfile(三)
			前面我们聊到了dockerfile的 FROM.COPY .ADD.LABAL.MAINTAINER.ENV.ARG.WORKDIR.VOLUME.EXPOSE.RUN.CMD.ENTRYPOINT指 ... 
- cocos2dx获得字体的宽高
			Android: 1.在CCImage中添加下面的方法: //头文件声明略. cocos2d::CCSize CCImage::getStringSize(const char *text, cons ... 
- 【JVM故事】了解JVM的结构,好在面试时吹牛
			class文件格式 参考上一篇文章<[JVM故事]一个Java字节码文件的诞生记>,后续还会专门讲解class文件的内部结构. 数据类型 jvm包括两种数据类型,基本类型和引用类型. 基本 ... 
- CentOS7.6操作系统安装实例以及Linux版本、哲学思想介绍
			Linux起源1991年的10月5日,Torvalds在comp.os.minix新闻组上发布消息,正式向外宣布他自行编写的完全自由免费的内核诞生(Freeminix-like kernel sour ... 
- Java线程变量问题-ThreadLocal
			关于Java线程问题,在博客上看到一篇文章挺好的: https://blog.csdn.net/w172087242/article/details/83375022#23_ThreadLocal_1 ... 
- 指定web默认首页,导致访问路径的问题
			今天写了一个登陆页面,登陆成功跳转时,url中的路径不对 这是目录结构 |-web |---login |-----login.jsp |---success |-----success.jsp 这是 ...