使用脚本启动和关闭微服务

本文介绍了如何使用脚本自动化启动和管理微服务,包括处理每个服务的启动命令、编写启动脚本、检查进程id并编写关闭脚本,以及在dubbo架构下的应用。

一、前言

假如在服务器中部署微服务不使用 docker ,一个一个地启动服务感觉比较繁琐,就想着能不能使用一个命令实现一键启动,这里以微服务版的若依为例。

二、启动

思路是挨个启动服务,然后将命令放到脚本文件,简化后续的启动。

1、处理每个服务

这里以处理 gateway 模块为例,打包后的名称为 ruoyi-gateway.jar ,将它上传到服务器的 /www/wwwroot/equip/jar/gateway 目录,所以 gateway 模块的启动命令为:

nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar >  ./ruoyi-gateway.log &

解释:

“nohup”:用于确保指定的命令或程序即使在用户退出终端或关闭终端的情况下,也能在后台继续运行,配合最后面的 & 使用。
“-Xms256m”:设置初始堆为256m。
“-Xmx256m”:设置最大堆为256m。
“> ./ruoyi-gateway.log”:将服务日志输出到名为 ruoyi-gateway.log 的文件中,重启会覆盖日志。不加这个会把日志输出到名为 nohup.out 的文件中。

因为服务器内存只有8g,如果不做堆大小的限制,所有服务启动后会把服务器内存占满,这里对 gateway 的初始堆和最大堆限制为256m。

处理好命令后先执行一下命令能否正常使用,如下图所示:

在这里插入图片描述

确定命令没有问题时,记录一下服务启动所需时间,后面有用,其他服务也是类似处理。

2、编写启动脚本

这里已经处理好了所有的服务启动命令,创建一个 .sh 的脚本文件,这里名为 start-test.sh ,命令如下:

touch start-test.sh

在这里插入图片描述

然后加入前面处理好的命令,这是我的:

# 被调用的服务要先启动,根据启动时间设置命令执行的间隔

echo "start ruoyi-gateway..."
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar >  ./ruoyi-gateway.log &
sleep 5s

echo "start ruoyi-modules-file..."
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/file/ruoyi-modules-file.jar >  ./ruoyi-modules-file.log &
sleep 10s

echo "start ruoyi-modules-system..."
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/system/ruoyi-modules-system.jar >  ./ruoyi-modules-system.log &
sleep 20s

echo "start ruoyi-auth..."
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/auth/ruoyi-auth.jar >  ./ruoyi-auth.log &
sleep 10s

echo "start finish"

注意:

不能将初次创建好的脚本文件 start-test.sh 下载到本地编辑,再上传到服务器,会报换行符的问题。应该直接在服务器中编辑文件,或在本地编辑好内容后拷贝到服务器文件。

因为我将若依的服务调用方式改为了 dubbo ,要保证生产者先启动完成,所以就记录了服务的启动时间作为服务启动间的时间间隔。

3、其他启动脚本(无效,有兴趣可以看看)

上面的命令看起来差点意思,但至少能正常启动。

原本想做到循环里面遍历启动,但因为服务启动时间的不确定性,经常消费者先于生产者启动,启动完 gateway 模块其他就没反应了,就没有使用那种方式,有兴趣的小伙伴也可以研究一下,这是文件内容:

# 定义数组,方式一
# 使用这种方式注意每个元素后面不能加“,”
# 使用“``”包住命令不会将命令中的空格换行
command_array=(
       `java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar >  ./ruoyi-gateway.log`
       `java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/file/ruoyi-modules-file.jar >  ./ruoyi-modules-file.log`
       `java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/system/ruoyi-modules-system.jar >  ./ruoyi-modules-system.log`
       `java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/auth/ruoyi-auth.jar >  ./ruoyi-auth.log`)

# 定义数组,方式二
#command_array[0]=`java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar >  ./ruoyi-gateway.log`
#command_array[1]=`java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/auth/ruoyi-auth.jar >  ./ruoyi-auth.log`
#command_array[2]=`java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/file/ruoyi-modules-file.jar >  ./ruoyi-modules-file.log`
#command_array[3]=`java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/system/ruoyi-modules-system.jar >  ./ruoyi-modules-system.log`

echo "starting..."

for command in ${command_array[@]};
do
   nohup $command &
   sleep 10s
done

echo "start finish"

4、启动

在脚本文件所在目录,这里为 start-test.sh 文件所在目录,执行如下命令:

sh start-test.sh

在这里插入图片描述

三、关闭

思路是拿到每个服务的进程id,再杀死对应的进程。

1、测试拿服务进程id的命令是否正确

这里只是测试拿到进程id的命令是否正确,任选一个服务测试即可。

还是以 gateway 为例,查询对应的进程id,命令如下:

 ps -ef | grep /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar

在这里插入图片描述

第二列的就是我们需要的进程id,只要那个就行了,可以使用如下命令:

ps aux | grep /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar | grep -v grep | awk '{print $2}'

在这里插入图片描述

不会输出第二列的进程id,只是看看命令有没有错误。

或者可以使用如下命令:

ps -ef | grep -w /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar | grep -v grep | awk '{print $2}'

在这里插入图片描述

2、编写关闭脚本

创建一个 .sh 的脚本文件,这里名为 stop-test.sh ,命令如下:

touch stop-test.sh

然后加入如下内容:

# 定义数组,方式一
# 使用这种方式注意每个元素后面不能加“,”
array=("/www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar"
       "/www/wwwroot/equip/jar/auth/ruoyi-auth.jar"
       "/www/wwwroot/equip/jar/file/ruoyi-modules-file.jar"
       "/www/wwwroot/equip/jar/system/ruoyi-modules-system.jar")

# 定义数组,方式二
#array[0]="/www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar"
#array[1]="/www/wwwroot/equip/jar/auth/ruoyi-auth.jar"
#array[2]="/www/wwwroot/equip/jar/file/ruoyi-modules-file.jar"
#array[3]="/www/wwwroot/equip/jar/system/ruoyi-modules-system.jar"

for var in ${array[@]};
do
  # 获取进程id,方式一
  pid="ps aux | grep $var | grep -v grep | awk '{print \$2}'"

  #  获取进程id,方式二
  # pid="ps -ef | grep -w $var | grep -v grep | awk '{print \$2}'"

  # eval 会对后面的命令进行两遍扫描。如果第一遍扫描后,命令是个普通命令,则执行此命令;
  # 如果命令中含有变量的间接引用,则保证间接引用的语义。
  # 也就是说,eval 命令将会首先扫描命令行进行所有的置换,然后再执行该命令。因此,eval命令适用于那些一次扫描无法实现其功能的变量。
  pid=$(eval $pid)

  # 判断进程id是否为空,若不为空,则杀掉进程
  if [ "${pid}" == "" ]; then
      echo "process $var not exists"
  else
      # 杀掉进程
      kill -9 $pid
      echo "process $var killed success"
  fi
done

保存退出。

3、关闭

在脚本文件所在目录,这里为 stop-test.sh 所在目录,执行如下命令:

sh stop-test.sh

在这里插入图片描述

### 微服务 Nacos 启动配置及方法 #### 下载与安装 要启动 Nacos,首先需要下载其二进制文件。可以从官方 GitHub 或官网获取最新版本的压缩包[^1]。解压后进入 `nacos/bin` 目录。 对于 Linux/Mac 用户,可以运行以下命令来启动单机模式下的 Nacos 服务器: ```bash sh startup.sh -m standalone ``` Windows 用户则可以通过以下命令实现相同功能: ```cmd startup.cmd -m standalone ``` 上述 `-m standalone` 参数用于指定以单机模式运行 Nacos。这种模式适合开发环境测试使用。 #### 配置 MySQL 数据库支持 为了使 Nacos 支持持久化的配置存储以及更复杂的场景需求,通常建议将其连接至外部数据库(如 MySQL)。以下是具体操作步骤: 1. **准备 SQL 脚本** 在 Nacos 的发行版中附带了一个名为 `conf/nacos-mysql.sql` 的初始化脚本。此脚本定义了必要的表结构初始数据[^4]。 2. **导入 SQL 文件到目标数据库** 使用工具或者命令行将该 `.sql` 文件加载入预先建立好的 MySQL 库中。例如: ```sql source /path/to/nacos-mysql.sql; ``` 3. **修改 application.properties 文件中的 JDBC 连接参数** 找到 Nacos 安装目录内的 `conf/application.properties` 文件,并设置如下属性指向您的实际 MySQL 地址、端口、用户名密码等信息: ```properties spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://localhost:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=password ``` 完成以上更改之后保存退出即可生效。 #### 注册微服务到 Nacos 中 当您已经成功部署好了 Nacos 并且能够正常访问它的 Web 控制台界面时,下一步就是让自己的 Spring Cloud 应用程序能自动向其中注册自己成为可用的服务节点之一[^3]。 在项目的 `pom.xml` 添加依赖项引入 Nacos Discovery Starter 组件: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> ``` 接着编辑应用自身的 YAML 格式的配置文档加入下面的内容片段指明远程地址服务名称等相关细节: ```yaml server: port: 8761 spring: cloud: nacos: discovery: server-addr: localhost:8848 # 替换为真实的IP+Port组合形式 namespace: public # 可选字段,默认为空字符串"" eureka: client: register-with-eureka: false # 关闭Eureka客户端行为因为现在改用了Nacos替代它作为注册中心角色存在。 fetch-registry: false # ``` 最后记得重新构建整个工程再尝试再次发起请求看看效果如何! --- #### 心跳机制说明 一旦某个应用程序完成了同 Nacos Server 成功握手的过程之后便会周期性的通过 HTTP 请求的形式告知对方自身仍然处于存活状态之中。默认情况下每次间隔时间为五秒钟一次;而假如某段时间内连续丢失三次这样的信号那么对应条目会被标注成非活跃成员对待直到恢复为止;超过六轮未响应才会彻底移除记录不再对外展示给其他消费者调用方知晓。 另外值得注意的是还存在着两种不同类型的实例划分方式可供开发者们依据实际情况灵活选用:“临时型”即普通的短生命周期对象会在断开链接不久就被清理掉;相对应地也有“永久型”的选项允许长期保留即使暂时失去联系也不会轻易消失不见除非手动干预删除动作发生才行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值