前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何优雅停止 Springboot 运行

如何优雅停止 Springboot 运行

作者头像
netkiller old
发布于 2021-08-20 09:03:41
发布于 2021-08-20 09:03:41
7K00
代码可运行
举报
文章被收录于专栏:NetkillerNetkiller
运行总次数:0
代码可运行

准备工作

@PreDestroy 会在系统关闭前执行

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.netkiller;

import javax.annotation.PreDestroy;

import org.springframework.context.annotation.Configuration;

@Configuration
public class ShutdownConfiguration {

  public ShutdownConfiguration() {
    // TODO Auto-generated constructor stub
  }

  @PreDestroy
  public void preDestroy() {
    System.out.println("==============================");
    System.out.println("Destroying Spring");
    System.out.println("==============================");
  }

}

kill 命令演示

kill 命令本质是给进程发送终止信号,进程接收到终止信号后退出运行。

可以看到 Springboot 启动后,进程 PID 44559,现在使用 kill 命令杀死这个进程

当执行 kill 44559 你会看到下面的输出

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
neo@MacBook-Pro-Neo ~/workspace/microservice/test % java -jar target/test-0.0.1-SNAPSHOT.jar
Starting...

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.3)

2021-07-29 11:05:09.862  INFO 44559 --- [           main] cn.netkiller.Application                 : Starting Application v0.0.1-SNAPSHOT using Java 16.0.1 on MacBook-Pro-Neo.local with PID 44559 (/Users/neo/workspace/microservice/test/target/test-0.0.1-SNAPSHOT.jar started by neo in /Users/neo/workspace/microservice/test)
2021-07-29 11:05:09.865  INFO 44559 --- [           main] cn.netkiller.Application                 : No active profile set, falling back to default profiles: default
2021-07-29 11:05:11.363  WARN 44559 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2021-07-29 11:05:11.399  INFO 44559 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2021-07-29 11:05:11.400  INFO 44559 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1451 ms
2021-07-29 11:05:12.041  INFO 44559 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
2021-07-29 11:05:12.073  INFO 44559 --- [           main] io.undertow                              : starting server: Undertow - 2.2.9.Final
2021-07-29 11:05:12.085  INFO 44559 --- [           main] org.xnio                                 : XNIO version 3.8.4.Final
2021-07-29 11:05:12.099  INFO 44559 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.4.Final
2021-07-29 11:05:12.197  INFO 44559 --- [           main] org.jboss.threads                        : JBoss Threads version 3.1.0.Final
2021-07-29 11:05:12.263  INFO 44559 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 8080 (http)
2021-07-29 11:05:12.278  INFO 44559 --- [           main] cn.netkiller.Application                 : Started Application in 2.989 seconds (JVM running for 3.582)
2021-07-29 11:05:20.577  INFO 44559 --- [ionShutdownHook] io.undertow                              : stopping server: Undertow - 2.2.9.Final
==============================
Destroying Spring
==============================  

而是用 kill -9 PID 就不会出现下面提示。

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
neo@MacBook-Pro-Neo ~/workspace/microservice/test % java -jar target/test-0.0.1-SNAPSHOT.jar
Starting...

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.3)

2021-07-29 11:08:10.857  INFO 44613 --- [           main] cn.netkiller.Application                 : Starting Application v0.0.1-SNAPSHOT using Java 16.0.1 on MacBook-Pro-Neo.local with PID 44613 (/Users/neo/workspace/microservice/test/target/test-0.0.1-SNAPSHOT.jar started by neo in /Users/neo/workspace/microservice/test)
2021-07-29 11:08:10.860  INFO 44613 --- [           main] cn.netkiller.Application                 : No active profile set, falling back to default profiles: default
2021-07-29 11:08:12.377  WARN 44613 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2021-07-29 11:08:12.411  INFO 44613 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2021-07-29 11:08:12.411  INFO 44613 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1466 ms
2021-07-29 11:08:13.046  INFO 44613 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
2021-07-29 11:08:13.081  INFO 44613 --- [           main] io.undertow                              : starting server: Undertow - 2.2.9.Final
2021-07-29 11:08:13.100  INFO 44613 --- [           main] org.xnio                                 : XNIO version 3.8.4.Final
2021-07-29 11:08:13.114  INFO 44613 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.4.Final
2021-07-29 11:08:13.206  INFO 44613 --- [           main] org.jboss.threads                        : JBoss Threads version 3.1.0.Final
2021-07-29 11:08:13.275  INFO 44613 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 8080 (http)
2021-07-29 11:08:13.290  INFO 44613 --- [           main] cn.netkiller.Application                 : Started Application in 3.195 seconds (JVM running for 3.808)
[1]    44613 killed     java -jar target/test-0.0.1-SNAPSHOT.jar

这是因为 kill 命令会给进程发送终止信号,进程会正常退出.

什么是正常退出呢?例如:

  • 完成为运行的逻辑
  • 将为写入磁盘的文件后写入后退出
  • 执行完SQL并关闭数据库
  • 写入缓存,并关闭 redis
  • 完成用户请求,并关闭链接

这就是为什么当我们正常关闭程序需要等待很长时间,如果我们此时没有运行状态显示,也没有通过日志反应执行状态,就会认为程序死了。其实此时程序可能尽职尽责的在工作,将未完成的工作完成,然后一步步正常退出。

尤其是多线程的程序,退出时需要等待每个线程完成请求,需要很长时间,我们常常因为升级时间紧迫而使用 kill -9 强行杀死进程,这会带来很多问题。

kill -9 的弊端:

  1. 程序执行一半被强行退出,用户端会出现 Timeout 超时
  2. 文件写入一半被终止,如果是文本文件只有一半内容;如果是二进制文件会造成损坏
  3. 数据库操作一组SQL,只执行了一半,会产生脏数据;如果使用事务处理会引起回滚;

Ctrl + C 与 kill 没有区别,也是给进程发送终止信号,现在我们来演示一下。

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
neo@MacBook-Pro-Neo ~/workspace/microservice/test % java -jar target/test-0.0.1-SNAPSHOT.jar
Starting...
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.3)

2021-07-29 11:04:42.657  INFO 44546 --- [           main] cn.netkiller.Application                 : Starting Application v0.0.1-SNAPSHOT using Java 16.0.1 on MacBook-Pro-Neo.local with PID 44546 (/Users/neo/workspace/microservice/test/target/test-0.0.1-SNAPSHOT.jar started by neo in /Users/neo/workspace/microservice/test)
2021-07-29 11:04:42.660  INFO 44546 --- [           main] cn.netkiller.Application                 : No active profile set, falling back to default profiles: default
2021-07-29 11:04:44.212  WARN 44546 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2021-07-29 11:04:44.246  INFO 44546 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
2021-07-29 11:04:44.246  INFO 44546 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1502 ms
2021-07-29 11:04:44.857  INFO 44546 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
2021-07-29 11:04:44.889  INFO 44546 --- [           main] io.undertow                              : starting server: Undertow - 2.2.9.Final
2021-07-29 11:04:44.902  INFO 44546 --- [           main] org.xnio                                 : XNIO version 3.8.4.Final
2021-07-29 11:04:44.916  INFO 44546 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.4.Final
2021-07-29 11:04:45.002  INFO 44546 --- [           main] org.jboss.threads                        : JBoss Threads version 3.1.0.Final
2021-07-29 11:04:45.068  INFO 44546 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 8080 (http)
2021-07-29 11:04:45.084  INFO 44546 --- [           main] cn.netkiller.Application                 : Started Application in 3.149 seconds (JVM running for 3.748)
^C2021-07-29 11:04:47.082  INFO 44546 --- [ionShutdownHook] io.undertow                              : stopping server: Undertow - 2.2.9.Final
==============================
Destroying Spring
==============================    

容器中如何优雅关闭 Springboot

容器与进程模式并没有什么区别,我们给容器发送终止信号,容器会转发给 Springboot。

理论归理论,我们还是需要亲自实践,这样才能理解更深刻。

准备实验环境和素材,下面是 docker-compose.yaml 编排文件

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: '3.9'
  
services:
  spring:
    image: openjdk:latest
    container_name: spring
    restart: always
    hostname: www.netkiller.cn
    environment:
      TZ: Asia/Shanghai
      JAVA_OPTS: -Xms256m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
    ports:
      - 8099:8080
    volumes:
      - ./test-0.0.1-SNAPSHOT.jar:/app/test-0.0.1-SNAPSHOT.jar
    entrypoint: java -jar /app/test-0.0.1-SNAPSHOT.jar
    command:
      --spring.profiles.active=dev
      --server.port=8080
    

实验步骤

  • 运行容器:docker-compose up
  • 观察容器:docker-compose logs -f
  • 停止容器:

运行容器

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost netkiller.cn]# docker-compose up -d
Starting spring ... done

观察容器日志

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost netkiller.cn]# docker-compose logs -f
spring    | Starting...
spring    | 
spring    |   .   ____          _            __ _ _
spring    |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
spring    | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
spring    |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
spring    |   '  |____| .__|_| |_|_| |_\__, | / / / /
spring    |  =========|_|==============|___/=/_/_/_/
spring    |  :: Spring Boot ::                (v2.5.3)
spring    | 
spring    | 2021-07-29 11:29:34.556  INFO 1 --- [           main] cn.netkiller.Application                 : Starting Application v0.0.1-SNAPSHOT using Java 16.0.2 on www.netkiller.cn with PID 1 (/app/test-0.0.1-SNAPSHOT.jar started by root in /)
spring    | 2021-07-29 11:29:34.559  INFO 1 --- [           main] cn.netkiller.Application                 : The following profiles are active: dev
spring    | 2021-07-29 11:29:35.903  WARN 1 --- [           main] io.undertow.websockets.jsr               : UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
spring    | 2021-07-29 11:29:35.921  INFO 1 --- [           main] io.undertow.servlet                      : Initializing Spring embedded WebApplicationContext
spring    | 2021-07-29 11:29:35.921  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1274 ms
spring    | 2021-07-29 11:29:36.411  INFO 1 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
spring    | 2021-07-29 11:29:36.437  INFO 1 --- [           main] io.undertow                              : starting server: Undertow - 2.2.9.Final
spring    | 2021-07-29 11:29:36.444  INFO 1 --- [           main] org.xnio                                 : XNIO version 3.8.4.Final
spring    | 2021-07-29 11:29:36.451  INFO 1 --- [           main] org.xnio.nio                             : XNIO NIO Implementation Version 3.8.4.Final
spring    | 2021-07-29 11:29:36.511  INFO 1 --- [           main] org.jboss.threads                        : JBoss Threads version 3.1.0.Final
spring    | 2021-07-29 11:29:36.547  INFO 1 --- [           main] o.s.b.w.e.undertow.UndertowWebServer     : Undertow started on port(s) 8080 (http)
spring    | 2021-07-29 11:29:36.560  INFO 1 --- [           main] cn.netkiller.Application                 : Started Application in 2.48 seconds (JVM running for 2.923)

停止容器

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost netkiller.cn]# docker ps | grep spring
8901384d1973   openjdk:latest                "java -jar /app/test…"   3 minutes ago   Up About a minute   0.0.0.0:8099->8080/tcp, :::8099->8080/tcp                                              spring
[root@localhost netkiller.cn]# docker stop spring
spring
[root@localhost netkiller.cn]# docker ps | grep spring  

在观察日志

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring    | 2021-07-29 11:31:31.807  INFO 1 --- [ionShutdownHook] io.undertow                              : stopping server: Undertow - 2.2.9.Final
spring    | ==============================
spring    | Destroying Spring
spring    | ==============================
spring exited with code 143    
    

现在可以看到 Springboot 是正常退出的

下面我们再做一个实验 docker kill

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost netkiller.cn]# docker-compose start
Starting spring ... done

[root@localhost netkiller.cn]# docker-compose logs -f
    
[root@localhost netkiller.cn]# docker kill spring
spring    

此时再观察日志,只输出了一行。

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring exited with code 137

结论,docker kill = kill -9

现在你应该明白什么时候该使用什么命令终止程序了吧,同时我们在写程序的时候,也应该将程序的运行状态反应出来,在我们停止程序运行的时候,可以去观察进程的状态,而不是半天没有反应,只能怀疑进程死了,必须执行B计划(kill -9)这会造成很多数据丢失的问题。

写入PID文件

我们明白了 kill 的原理后,常常需要与 pid 打交道,使用 ps 命令是可以查看 pid 的,但是当我们运行多个实例的时候会常常搞混,所以最好的方式是让 springboot 把PID写入到文件中。

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.netkiller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;

@SpringBootApplication

public class Application {

  public static void main(String[] args) {

    System.out.println("Starting...");
    // SpringApplication.run(Application.class, args);

    SpringApplication springApplication = new SpringApplication(Application.class);
    springApplication.addListeners(new ApplicationPidFileWriter());
    springApplication.run(args);
  }
}  

程序运行后会在当前目录下产生一个 PID 文件

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
neo@MacBook-Pro-Neo ~/workspace/microservice/test % cat application.pid 
44027

修改 pid 文件位置可以配置 application.properties

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server.port=8080
spring.pid.file=/tmp/spring.pid

最后说说容器,容器的进程ID永远是 1 所以配置与否自己斟酌。

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost netkiller.cn]# docker exec -it spring cat /tmp/spring.pid
1
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Netkiller 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Spring Cloud Config
摘要: 本文节选自《Netkiller Java 手札》 Spring Cloud Config 本文节选自《Netkiller Java 手札》 https://www.netkiller.cn/java/index.html 12.1. Spring Cloud Config 12.1.1. Git 仓库 克隆仓库 git clone https://github.com/netkiller/config.git 创建配置文件 server-development.properties vim serv
netkiller old
2018/03/05
1.2K0
Spring boot with Docker
本文节选自 《Netkiller Linux 手札》 163.6.1. Spring boot with Docker 163.6.1.1. 获取 CentOS 7 镜像 docker pull centos:7 # docker pull centos:7 7: Pulling from library/centos 343b09361036: Pull complete Digest: sha256:bba1de7c9d900a898e3cadbae040dfe8a633c06bc104a0df7
netkiller old
2018/03/05
6750
Spring Cloud with Kubernetes 之 Config Maps
开启 Spring cloud 访问 Kubernetes Config Maps 的权限。
netkiller old
2020/10/10
1.4K0
Spring cloud 之 Feign Client
本文接选自 《Netkiller Java 手札》 12.2.2. Eureka Client 12.2.2.1. Maven <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma
netkiller old
2018/03/05
1.5K0
Spring boot with Spring security
本文节选自 《Netkiller Java 手札》 地址:http://www.netkiller.cn/java/index.html 9.15. Spring boot with Spring security 9.15.1. Maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency
netkiller old
2018/03/05
1.2K0
使用skywalking监控springboot项目
执行startup.bat之后会启动如下两个服务: (1)Skywalking-Collector:追踪信息收集器,通过 gRPC/Http 收集客户端的采集信息 ,Http默认端口 12800,gRPC默认端口 11800。 (2)Skywalking-Webapp:管理平台页面 默认端口 8080
Vincent-yuan
2022/05/06
1.9K0
使用skywalking监控springboot项目
Spring boot with Oracle
本文节选自《Netkiller Java 手札》 地址: http://www.netkiller.cn/java/index.html 9.11. Spring boot with Oracle 9.11.1. Maven 首先到oracle官网,根据你的Oracle数据库,下载ojdbc6.jar(Oracle 11) 或者 ojdbc7.jar (Oracle 12) <dependency> <groupId>com.oracle</groupId>
netkiller old
2018/03/05
1.2K0
Spring boot with HTTPS SSL
本文节选自《Netkiller Java 手札》 5.24. Spring boot with HTTPS SSL 5.24.1. 生成自签名证书 keytool -genkey -alias www.netkiller.cn -keyalg RSA -keystore /www/netkiller.cn/www.netkiller.cn.keystore 导入证书(Windows) keytool -selfcert -alias www.netkiller.cn -keystore w
netkiller old
2018/03/05
1.3K0
SpringBoot 2.x 学习笔记(1):入门实例(IntelliJ IDEA)
注意,为了加快相关jar下载速度,可以在pom.xml中添加国内的阿里Maven镜像,在<properties>...</properties>元素后添加如下元素即可
程裕强
2022/05/06
5260
SpringBoot 2.x 学习笔记(1):入门实例(IntelliJ IDEA)
如何在kubernete集群上部署springboot应用
在之前的文章中,我讲了使用kubeadm从0到1搭建kubernete集群,今天我们来聊一下如何在这套k8s集群上部署springboot应用。首先说明一下,我们这次集群的网络使用flannel网络,master节点启动命令如下:
jinjunzhu
2020/08/20
6990
SpringBoot2.x基础篇:将应用程序打包为可执行Jar
应用程序在编写完成后,有一个重要的阶段就是发布,当我们发布时需要将应用程序进行打包,那通过SpringBoot编写的应用程序该如何打包呢?
恒宇少年
2020/02/25
1.3K0
SpringBoot2.x基础篇:将应用程序打包为可执行Jar
SpringBoot起步依赖
搜索了很多网页也没有弄懂起步依赖是什么,看了之后总感觉懵懵懂懂的,感觉都是天下文章一大抄!下面自己总结下如果有误的地方请大神指正。
赵哥窟
2021/05/24
1K0
介绍一个开源博客项目VBlog并打包部署到已存在运行项目的Nginx服务器下
对于很多喜欢写博客的IT程序员朋友可能都会有一个搭建自己的博客网站的梦想,今天我要介绍的这个开源项目恰好能帮你实现这个愿望。这个开源项目由国内IT大牛“江南一点雨”贡献,介绍完这个项目如何在本地开发环境跑通之后,我还将介绍利用上一篇发布的文章我想在同一个域名下部署多个项目怎么办?一文搞懂Nginx同域名下部署多个vue项目中的知识点将这一博客项目部署到已存在运行项目的Nginx器下
用户3587585
2021/09/08
1.1K0
介绍一个开源博客项目VBlog并打包部署到已存在运行项目的Nginx服务器下
Spring Native实战(畅快体验79毫秒启动springboot应用)
个人的理解:Spring Native是Spring提供的、制作native image的技术方案,涉及到以下关键技术:
程序员欣宸
2021/11/04
4.1K0
Spring Native实战(畅快体验79毫秒启动springboot应用)
SpringBoot项目报错解决:“Error starting ApplicationContext. To display the conditions report re-run …”
SpringBoot项目报错:Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
全栈程序员站长
2022/09/09
9K1
SpringBoot项目报错解决:“Error starting ApplicationContext. To display the conditions report re-run …”
ShardingJdbc基于Zookeeper实现分布式治理
随着数据规模的不断膨胀,使用多节点集群的分布式方式逐渐成为趋势。在这种情况下,如何高效、自动化管理集群节点,实现不同节点的协同工作,配置一致性,状态一致性,高可用性,可观测性等,就成为一个重要的挑战。
玖柒的小窝
2021/10/25
6470
ShardingJdbc基于Zookeeper实现分布式治理
Docker与Jib(maven插件版)实战
Java应用如果要运行在docker环境,就要制作包含该应用的docker镜像,Jib就是用来制作此镜像的的工具,有三种使用Jib的方法:
程序员欣宸
2019/07/01
1.5K0
Docker与Jib(maven插件版)实战
【原创】003 | 搭上SpringBoot实战专车系列三:应用启动方式
该趟专车是开往 SpringBoot 应用启动方式的实战专车,主要讲解通过多种方式来启动 SpringBoot 应用
java进阶架构师
2021/02/22
6710
【原创】003 | 搭上SpringBoot实战专车系列三:应用启动方式
(一) SpringBoot起飞之路-HelloWorld
开发一个 Web 项目,从入门的 JavaWeb,也就是 Servlet + Tomcat 的那一套,学完了这部分,大部分人就会去接触一些框架,像SSM、SSH(少),再接着就会去接触 SpringBoot 等等,随着新框架的出现,亦或者统一框架的版本大更新,我们也需要不断的学习,其实像我平时做的很多东西,说白了也就是简单或者复杂的增删改查,根据需求掺杂着很多业务逻辑,就例如,一个简单的登陆大家在学习中应该做过N个版本了吧
BWH_Steven
2020/05/12
6431
springBoot 怎么利用maven 创建可以执行的jar文件?
1 为了可以使用maven 创建可执行的jar文件 ,首先需要再pom.xml 加入如下的依赖。
爱明依
2019/03/12
1K0
相关推荐
Spring Cloud Config
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文