8. Nginx 配合 + Keepalived 搭建高可用集群

8. Nginx 配合 + Keepalived 搭建高可用集群

文章目录

  • [8. Nginx 配合 + Keepalived 搭建高可用集群](#8. Nginx 配合 + Keepalived 搭建高可用集群)
  • [1. Keepalived + Nginx 高可用集群(主从模式)](#1. Keepalived + Nginx 高可用集群(主从模式))
  • [2. 具体搭建步骤](#2. 具体搭建步骤)
  • [3. 自动检测 Nginx 异常, 终止 keepalived](#3. 自动检测 Nginx 异常, 终止 keepalived)
  • [4. 配置文件 keepalived.conf 详解](#4. 配置文件 keepalived.conf 详解)
  • [5. 最后:](#5. 最后:)

1. Keepalived + Nginx 高可用集群(主从模式)

集群架构图:

  1. 准备两台 nginx 服务器, 一台做主服务器, 一台做备份服务器
  2. 两台 Nginx 服务器的 IP 地址, 可以自己配置,
  3. 安装 keepalived , 保证主从之间的通讯
  4. 对外提供统一的访问 IP(虚拟 IP-VIP)

2. 具体搭建步骤

  1. 搭建高可用集群基础环境

准备两台 Linux 服务器 192.168.198.166 和 192.168.198.167

可以克隆来完成,也可以直接拷贝一份虚拟机。

在两台 Linux 服务器 安装并配置好,Nginx

安装配置 Nginx 步骤前面讲过 如果你克隆的 Linux, 本身就有安装好了 Nginx, 直接使 ,

用即可.

验证安装是否成功, 在 windows 可以通过 IP 访问到 Nginx, 具体的操作步骤和注意事 项, 前面也都是说过了

因为我们是拷贝了一份 Linux , 而新的 Linux 的 Ip 已经变化了 所以需要克隆的 Linux ,

的 nginx.conf 文件中的 IP 地址 做相应的修改


  1. 将两个 Linux 虚拟机当中的 Tomcat 都启动起来,测试是否可以访问
  • 启动 192.168.76.166 IP 地址的两个 Tomcat ,测试访问。

启动 192.168.76.166 的 Nginx

浏览器输入:http://192.168.76.166/search/cal.jsp


  • 启动 192.168.76.167 IP 地址的两个 Tomcat ,测试访问。

启动 192.168.76.167 IP 地址 下的 Nginx

浏览器输入:http://192.168.76.167/search/cal.jsp



  1. 在 两台 Linux 的虚拟机当中安装 keepalived

载 keepalived-2.0.20.tar.gz 源码安装包, https://keepalived.org/download.html

  1. 上传到两台 Linux /root 目录下




2. 在 Linux 两个虚拟机当中 root 目录下,创建 keepalived 目录

sh 复制代码
mkdir /root/keepalived

20250226192006182.png&pos_id=img-LJgXREho-1740878883268)

  1. 两个 Linxu 虚拟机当中,将keepalived-2.0.20.tar.gz 解压文件到指定目录: tar -zxvf keepalived-2.0.20.tar.gz -C ./keepalived
sh 复制代码
[root@localhost ~]# tar -zxvf keepalived-2.0.20.tar.gz -C ./keepalived


4. 两个 Linxu 虚拟机当中,进入到 /root/keepalived/keepalived-2.0.20 目录当中

sh 复制代码
cd /root/keepalived/keepalived-2.0.20


5. 两个 Linux 虚拟机当中执行: ./configure --sysconf=/etc --prefix=/usr/local 命令。 在:/root/keepalived/keepalived-2.0.20下执行。

sh 复制代码
 ./configure --sysconf=/etc --prefix=/usr/local # 说明: 将配置文件放在  /etc 目录下,  安装路径在  /usr/local
sh 复制代码
[root@localhost keepalived-2.0.20]#  ./configure --sysconf=/etc --prefix=/usr/local


6. 在两个 Linux 虚拟机当中的执行该指令,make && make install 编译。

sh 复制代码
[root@localhost keepalived-2.0.20]# make && make install


7. 如果成功, 就会安装好 keepalived

说明: keepalived 的配置目录在 /etc/keepalived/keepalived.conf

keepalived 的启动指令在 /usr/local/sbin/keepalived

说明安装成功了



说明:两个 Linux 虚拟机都安装成功了 keepalived 。

  1. 在 keepalived 当中配置,完成高可用集群配置
  1. 将其中一台 Linux( 这里我们将 192.168.76.166 指定为Master(主) vi /etc/keepalived/keepalived.conf
sh 复制代码
[root@localhost keepalived]# pwd
/etc/keepalived
[root@localhost keepalived]# vim keepalived.conf 



properties 复制代码
  3 global_defs {
  4    notification_email {
  5      acassen@firewall.loc
  6      failover@firewall.loc
  7      sysadmin@firewall.loc
  8    }
  9    notification_email_from Alexandre.Cassen@firewall.loc
 10    smtp_server 192.168.200.1
 11    smtp_connect_timeout 30
 12    router_id rainbowsea100
 13    vrrp_skip_check_adv_addr
 14    #vrrp_strict
 15    vrrp_garp_interval 0
 16    vrrp_gna_interval 0
 17 }
 18 


机器名尽量不要有下划线,不然容易报错。


sh 复制代码
 19 vrrp_instance VI_1 {
 20     state MASTER
 21     interface ens33
 22     virtual_router_id 51
 23     priority 100
 24     advert_int 1
 25     authentication {
 26         auth_type PASS
 27         auth_pass 1111
 28     }
 29     virtual_ipaddress {
 30         192.168.76.18
 31         #192.168.200.16
 32         #192.168.200.17
 33        #192.168.200.18
 34     }
 35 }
 36 
  1. 启动这台作为主的 Linux 的 keepalived 指令: /usr/local/sbin/keepalived,就是执行该路径下的这个 keepalived 命令
sh 复制代码
[root@localhost keepalived]# /usr/local/sbin/keepalived 


3. 观察这台 linux 的 ens33 是否已经绑定 192.168.200.18 ,我们在 /etc/keepalived/keepalived.conf 配置文件当中的virtual_ipaddress {192.168.76.18 } 属性。

sh 复制代码
[root@localhost keepalived]# ip a
  1. 将其中一 台虚拟 Linux主机( 这里我们将 192.168.76.167) 指 定 为 Backup( 备 份 服 务 器 ) : vi /etc/keepalived/keepalived.conf




properties 复制代码
  3 global_defs {
  4    notification_email {
  5      acassen@firewall.loc
  6      failover@firewall.loc
  7      sysadmin@firewall.loc
  8    }
  9    notification_email_from Alexandre.Cassen@firewall.loc
 10    smtp_server 192.168.200.1
 11    smtp_connect_timeout 30
 12    router_id rainbwosea600
 13    vrrp_skip_check_adv_addr
 14    #vrrp_strict
 15    vrrp_garp_interval 0
 16    vrrp_gna_interval 0
 17 }


properties 复制代码
 19 vrrp_instance VI_1 {
 20     state BACKUP
 21     interface ens33
 22     virtual_router_id 51
 23     priority 80
 24     advert_int 1
 25     authentication {
 26         auth_type PASS
 27         auth_pass 1111
 28     }
 29     virtual_ipaddress {
 30         192.168.76.18
 31        #192.168.200.16
 32        #192.168.200.17
 33        #192.168.200.18
 34     }
 35 }
  1. 启动这台作为主的 Linux 的 keepalived 指令: /usr/local/sbin/keepalived,就是执行该路径下的这个 keepalived 命令
sh 复制代码
[root@localhost keepalived]# /usr/local/sbin/keepalived 


3. 观察这台 linux 的 ens33 是否已经绑定 192.168.200.18 ,我们在 /etc/keepalived/keepalived.conf 配置文件当中的virtual_ipaddress {192.168.76.18 } 属性。

sh 复制代码
[root@localhost keepalived]# ip a
  1. 测试 Windows 是否可以 ping 我们的keepalived 配置的/etc/keepalived/keepalived.conf 配置文件当中的virtual_ipaddress {192.168.76.18 } 属性。

同时测试两台 Linux 虚拟机是否可以 ping 同我们的的keepalived 配置的/etc/keepalived/keepalived.conf 配置文件当中的virtual_ipaddress {192.168.76.18 } 属性。

sh 复制代码
[root@localhost keepalived]# ping 192.168.76.18

如果无法 ping 通,keepalived 启动后无法 ping 通 VIP,提示 ping: sendmsg: Operation not permitted

解决方法,如果不是配置上出错了,则大家可以移步至:✏️✏️✏️ https://blog.csdn.net/xjuniao/article/details/101793935 尝试解决

nginx+keepalived 配置说明和需要避开的坑https://blog.csdn.net/qq_42921396/article/details/123074780

  1. 测试:

首先: 首先保证 windows 可以连通 192.168.76.18 这个虚拟 IP

访问 nginx 如图。浏览器输入我们这个 keepalived 配置的公共对外的 192.168.76.18 的。

http://192.168.76.18/search/cal.jsp

大家可以看到, 因为 192.168.76.166 是 Master 他的优先级高 所以访问的就是 ,

192.168.76.166 的 Nginx, 同时仍然是支持负载均衡的。

停止 192.168.76.166 的 keepalived (Master) 服务, 或者直接关闭 192.168.76.166 主机, 再 次 访 问 http://192.168.76.166/search/cal.jsp , 这时虚拟 IP绑定发生漂 移绑定到 ,192.168.76.167 Backup 服务 访问效果如图:

这里我们直接关闭 192.168.76.166 Master 的 keepalived 来测试

sh 复制代码
[root@localhost keepalived]# killall keepalived # 关闭 keepalived  服务

浏览器访问:http://192.168.76.18/search/cal.jsp

再次测试,我们将:192.168.76.166 的作为 Master 的 keepalived 服务重新启动后,浏览器访问:http://192.168.76.18/search/cal.jsp

sh 复制代码
[root@localhost keepalived]# /usr/local/sbin/keepalived 
[root@localhost keepalived]# ps -aux | grep keepalived

3. 自动检测 Nginx 异常, 终止 keepalived

这里我们演示 keepalived 服务不关闭,但是我们关闭 Nginx 服务,浏览器访问:http://192.168.76.18/search/cal.jsp 会存在一个报错。

sh 复制代码
[root@localhost nginx]# ./sbin/nginx -s stop # 关闭 Nginx 服务
[root@localhost nginx]# ps -aux | grep nginx
root      12644  0.0  0.0 112812   980 pts/0    S+   05:13   0:00 grep --color=auto nginx
[root@localhost nginx]# 

报错:因为:keepalived 无法\自动检测 Nginx 异常。这里我们的 Nginx 已经被关闭了。但是 keepalived 还想通过 Nginx 反向代理访问Tomcat 就报错。

解决方法:

我们可以编写一个 shell 脚本 ,让 keepalived 可以自动检测 Nginx 是否失效了。

  1. 编写 shell 脚本: vi /etc/keepalived/rsnginx.sh
sh 复制代码
[root@localhost keepalived]# vim /etc/keepalived/rsnginx.sh
sh 复制代码
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
 killall keepalived
fi

简单说明: 下面的脚本就是去统计 ps -C nginx --no-header 的行数, 如果为 0 , 说明 nginx 已经异常终止了, 就执行 killall keepalived

  1. 修改我们编写的 shell 脚本的修改/etc/keepalived/rsnginx.sh 权限
sh 复制代码
root@localhost keepalived]# chmod 755 rsnginx.sh
  1. 修改 192.168.76.166 主 Master 配置文件 指令 : vim /etc/keepalived/keepalived.conf
sh 复制代码
[root@localhost keepalived]# vim /etc/keepalived/keepalived.conf
properties 复制代码
 18 vrrp_script rsnginx{
 19  script "/etc/keepalived/rsnginx.sh"
 20  interval 2
 21  weight -20
 22 
 23 }
 24 
 25 vrrp_instance VI_1 {
 26     state MASTER
 27     interface ens33
 28     virtual_router_id 51
 29     priority 100
 30     advert_int 1
 31     authentication {
 32         auth_type PASS
 33         auth_pass 1111
 34     }
 35     virtual_ipaddress {
 36         192.168.76.18
 37         #192.168.200.16
 38         #192.168.200.17
 39        #192.168.200.18
 40 
 41     }
 42     track_script{
 43      rsnginx
 44     }
 45 }
  1. 重新启动 192.168.76.166 Master 的 keepalived(重启读取配置) , 再重新启动 Nginx 这时因为 Master 的优先级高,会争 夺到 VIP 优先绑定

注意:先启动 keepalived,再启动 Nginx 。

sh 复制代码
[root@localhost keepalived]# /usr/local/sbin/keepalived 
[root@localhost keepalived]# ps -aux | grep keepalived
sh 复制代码
[root@localhost sbin]# /usr/local/nginx/sbin/nginx 
[root@localhost sbin]# ps -aux | grep nginx
  1. 测试:

浏览器访问:http://192.168.76.18/search/cal.jsp

再次演示:我们关闭 Nginx 服务,但是 keepalived 服务不关闭浏览器访问:http://192.168.76.18/search/cal.jsp 就不会报错了。

sh 复制代码
[root@localhost sbin]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost sbin]# ps -aux | grep nginx
root      12945  0.0  0.0 112812   980 pts/0    S+   05:37   0:00 grep --color=auto nginx

注意观察 keepalived 也终止了

注意事项:

  1. keepalived vrrp_script 脚本不执行解决办法

-打开日志观察

sh 复制代码
tail -f /var/log/messages

-重启 keepalived

sh 复制代码
systemctl restart keepalived.service

曾经出现过文件找不到 可以修改执行脚本文件名,不要有_ 就 OK

如果配置有定时检查 Nginx 异常的脚本, 需要先启动 nginx ,在启动 keepalived ,否则 keepalived 一起动就被 killall 了

提醒: 小伙伴们配置时,会遇到各种各样问题,有针对性解决即可

4. 配置文件 keepalived.conf 详解

properties 复制代码
#这里只注释要修改的地方
global_defs {
notification_email {
test@foxmail.com        #接收通知的邮件地址
}
notification_email_from Alexandre.Cassen@firewall.loc      #发送邮件的邮箱 smtp_server 192.168.200.1        #smtp server  地址
smtp_connect_timeout 30 
router_id Node132   # #Node132 为主机标识
vrrp_skip_check_adv_addr
#vrrp_strict  # #这里需要注释,避免虚拟 ip 无法 ping 通
vrrp_garp_interval 0 
vrrp_gna_interval 0
}
vrrp_instance VI_1 { 
state MASTER  # #主节点 MASTER  备用节点为 BACKUP
interface ens33                          #网卡名称
virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,指明属于同一 VRRP 组
priority 100  # 主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {  #指定虚拟 IP, 两个节点设置必须一样 
  192.168.200.16
}

}

主服务器

/etc/keepalived/keepalived.conf 文件中

properties 复制代码
cat >/etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL # 机器标识,在一个网络中应该唯一,通常可设为hostname。故障发生时,邮件通知会用到
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 优先级不会不断的提高或者降低
# 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
vrrp_script nginx_check {
    # 脚本两种写法
    # 1、通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
    # script "/usr/bin/killall -0 nginx"
    # 2、脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP
    script "/etc/keepalived/nginx-check.sh"
    interval 5 # 脚本执行间隔5s
    # 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
    # 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
    # 其他情况,原本配置的优先级不变,即配置文件中priority对应的值
    weight -5
    fall 3 # 检测失败3次就定义为down状态
    rise 2 # 检测失败后,检测成功超过2次就定义为up状态,但不修改优先级
}

vrrp_instance VI_1 {
    state MASTER #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
    interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
    virtual_router_id 51 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
    priority 100 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
    advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    mcast_src_ip 192.168.62.127 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

#     # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
#     # 本机ip
#     unicast_src_ip 192.168.124.14
#     unicast_peer {
#         # 其他机器ip
#         192.168.124.13
#     }

    # 当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换
    nopreempt

    # 认证方式,主从需要一致否则无法通信导致脑裂
    authentication {
        auth_type PASS # 密码认证
        auth_pass 1111 # 密码最多8位
    }

    track_script {
        nginx_check # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
    }

    # 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
    # 这里主要是由优先级来决定的,和state设置的值没有多大关系
    # 如果有多个虚拟IP 换行填写多个
    virtual_ipaddress {
        192.168.62.125 #虚拟IP, 主从应该填写一致
        192.168.62.126 #虚拟IP, 主从应该填写一致
    }

    notify /etc/keepalived/notify-nginx.sh
}
EOF

备服务器:

properties 复制代码
cat >/etc/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL # 机器标识,在一个网络中应该唯一,通常可设为hostname。故障发生时,邮件通知会用到
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 优先级不会不断的提高或者降低
# 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
vrrp_script nginx_check {
    # 脚本两种写法
    # 1、通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
    # script "/usr/bin/killall -0 nginx"
    # 2、脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP
    script "/etc/keepalived/nginx-check.sh"
    interval 5 # 脚本执行间隔5s
    # 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
    # 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
    # 其他情况,原本配置的优先级不变,即配置文件中priority对应的值
    weight -5
    fall 3 # 检测失败3次就定义为down状态
    rise 2 # 检测失败后,检测成功超过2次就定义为up状态,但不修改优先级
}

vrrp_instance VI_1 {
    state BACKUP #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
    interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
    virtual_router_id 51 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
    priority 98 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
    advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    mcast_src_ip 192.168.62.128 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

#     # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
#     # 本机ip
#     unicast_src_ip 192.168.124.14
#     unicast_peer {
#         # 其他机器ip
#         192.168.124.13
#     }

    # 当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换
    nopreempt

    # 认证方式,主从需要一致否则无法通信导致脑裂
    authentication {
        auth_type PASS # 密码认证
        auth_pass 1111 # 密码最多8位
    }

    track_script {
        nginx_check # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
    }

    # 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
    # 这里主要是由优先级来决定的,和state设置的值没有多大关系
    # 如果有多个虚拟IP 换行填写多个
    virtual_ipaddress {
        192.168.62.125 #虚拟IP, 主从应该填写一致
        192.168.62.126 #虚拟IP, 主从应该填写一致
    }

    notify /etc/keepalived/notify-nginx.sh
}
EOF

更多关于 配置文件 keepalived.conf 的内容可以移步至:✏️✏️✏️ https://www.cnblogs.com/KSPT/p/HA-Keepalived-01-Keepalived.html

sh 复制代码
[root@localhost linux]# ifconfig ens33 192.168.76.130
 # 修改 IP 地址,注意要是在 root 用户下。

5. 最后:

"在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。"

相关推荐
J2虾虾3 分钟前
Spring AI Alibaba文档
java·人工智能·spring
z200509307 分钟前
【Linux学习】Linux中的进程程序替换
linux·服务器·学习
YikNjy9 分钟前
break和continue
java·开发语言·算法
SomeOtherTime11 分钟前
Geojson相关(AI回答)
java·前端·python
日月云棠22 分钟前
10 Integer —— 最常用的整数包装类深度解析
java·后端
bush425 分钟前
嵌入式linux学习记录四
linux·运维·学习
大鸡腿同学26 分钟前
大模型为何总 “胡说八道”?做完 RAG 知识库,我看懂了它的底层逻辑
后端
秋927 分钟前
java项目中cpu飙升排查及解决方法
java·开发语言
野生技术架构师27 分钟前
牛客网2026最新大厂Java高频面试题精选(附标准答案)
java·开发语言
PH = 731 分钟前
JAVA的SPI机制
java·开发语言