部署运行
1、最终目标

2、微服务打包
①修改 MySQL 连接信息

server:
port: 10001
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
# 当前微服务和 MySQL 位于同一个服务器上,需要把访问地址改成 localhost
url: jdbc:mysql://localhost:3306/db_imperial_court
username: root
password: atguigu
type: com.alibaba.druid.pool.DruidDataSource
application:
name: demo06-mysql-data-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
②在父工程执行 install 命令
[1]Why parent?工程间关系梳理
正确的安装顺序:
- ①父工程:pro07-demo-imperial-court-micro-service
- ②被依赖的 module:demo10-base-util 或 demo09-base-entity
- ③当前 module:demo06-mysql-data-provider

[2]执行命令

③生成微服务可运行 jar 包
[1]应用微服务打包插件
可以以 SpringBoot 微服务形式直接运行的 jar 包包括:
- 当前微服务本身代码
- 当前微服务所依赖的 jar 包
- 内置 Tomcat(Servlet 容器)
- 与 jar 包可以通过 java -jar 方式直接启动相关的配置
要加入额外的资源、相关配置等等,仅靠 Maven 自身的构建能力是不够的,所以要通过 build 标签引入下面的插件。
<!-- build 标签:用来配置对构建过程的定制 -->
<build>
<!-- plugins 标签:定制化构建过程中所使用到的插件 -->
<plugins>
<!-- plugin 标签:一个具体插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
加入这个插件后的效果: 提示:IDEA 对于我们这里 build 标签里加入的 plugin 的配置没有能够很好的识别到插件的版本。如果我们能够保证其它操作都正常执行完成,准备工作都准备好了,那么这里我们判定是 IDEA 识别能力不足导致。一切以实际执行的结果为准:运行结果是最高权威 请对 demo02-user-auth-center 和 demo06-mysql-data-provider 都添加上面的 build 配置。
[2]执行插件目标
请对 demo02-user-auth-center 和 demo06-mysql-data-provider 都执行下面的命令:
- clean 子命令:清理之前构建的结果
- package 子命令:我们真正要调用的 spring-boot:repackage 要求必须将当前微服务本身的 jar 包提前准备好,所以必须在它之前执行 package 子命令。
- spring-boot:repackage 子命令:调用 spring-boot 插件的 repackage 目标
- -Dmaven.test.skip=true 参数:跳过测试
mvn clean package spring-boot:repackage -Dmaven.test.skip=true
3、执行部署
①启动 Nacos
sh /opt/nacos/bin/startup.sh -m standalone
②上传微服务 jar 包
②启动微服务
nohup java -jar demo06-mysql-data-provider-1.0-SNAPSHOT.jar>demo06.log 2>&1 &
nohup java -jar demo02-user-auth-center-1.0-SNAPSHOT.jar>demo02.log 2>&1 &
nohup
1、提出问题
我们把一个 SpringBoot 工程导出为 jar 包,jar 包上传到阿里云 ECS 服务器上,使用 java -jar xxx-xxx.jar 命令启动这个 SpringBoot 程序。此时我们本地的 xshell 客户端必须一直开着,一旦 xshell 客户端关闭,java -jar xxx-xxx.jar 进程就会被结束,SpringBoot 程序就访问不了了。 所以我们希望启动 SpringBoot 的 jar 包之后,对应的进程可以一直运行,不会因为 xshell 客户端关闭而被结束。
2、解决方案
①前台、后台运行
默认情况下 Linux 命令都是前台运行的,前台运行的特点是前面命令不执行完,命令行就一直被前面的命令占用,不能再输入、执行新的命令。
#!/bin/bash
echo "hello before sleep"
sleep 20
echo "hello after sleep"
前台(默认情况)运行上面脚本的效果是: 后台运行上面脚本的效果是:
但是以后台方式运行并不能解决前面提出的问题:我们的 shell 客户端(例如:xshell)和服务器断开连接后,SpringBoot 进程会随之结束,这显然不满足我们部署运行项目的初衷。
②不挂断运行
所谓“不挂断”就是指客户端断开连接后,命令启动的进程仍然运行。nohup 命令就是 ”no hang up“ 的缩写。使用nohup 命令启动 SpringBoot 微服务工程的完整写法是:
nohup java -jar spring-boot-demo.jar>springboot.log 2>&1 &
