当前位置: 首页 > news >正文

lvs dr+keepalived

基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群

keepalived高可用主机IP:172.21.5.22和172.21.5.21
http服务高可用主机IP:172.21.5.16和172.21.5.18
VIP采用172.16.32.5

各虚拟机及主机名和IP对应关系如下所示:

虚拟机主机名IP地址
HA1node1172.21.5.22
HA2node2172.21.5.21
HA3node3172.21.5.16
HA4node4172.21.5.18

接下来我们先去配置好http高可用服务两台主机,然后再回来配置keepalived。既然是LVS的DR模型,那我们先来配置另外两台主机,来实现http高可用集群。
首先,打开另外两外两台提供http服务的虚拟机,这里是HA3和HA4。为了方便你也可以改为RS1和RS2。

在DR模型中,只添加个http服务还不行,还有许多需要修改,貌似不是很简单,好吧,为了节约时间,这里我们通过一个脚本实现修改各个数据。

#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server
#. /etc/rc.d/init.d/functionsVIP=172.16.32.5 # 定义VIP
host=$(/bin/hostname)case "$1" in
start)# Start LVS-DR real server on this machine./sbin/ifconfig lo down/sbin/ifconfig lo upecho 1 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/lo/arp_announceecho 1 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/all/arp_announce/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up/sbin/route add -host $VIP dev lo:0;;
stop)# Stop LVS-DR real server loopback device(s)./sbin/ifconfig lo:0 downecho 0 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 0 > /proc/sys/net/ipv4/conf/lo/arp_announceecho 0 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 0 > /proc/sys/net/ipv4/conf/all/arp_announce;;
status)# Status of LVS-DR real server.islothere=$(/sbin/ifconfig lo:0 | grep $VIP)isrothere=$(netstat -rn | grep "lo:0" | grep $VIP)if [ ! "$islothere" -o ! "$isrothere" ]; then# Either the route or the lo:0 device not found.echo "LVS-DR real server Stopped."elseecho "LVS-DR real server Running."fi;;
*)# Invalid entry.echo "$0: Usage: $0 {start|status|stop}"exit 1;;
esac

记得该脚本需要在另一个主机上也要执行一下。
两台主机上都执行过上边的脚本后,验证下各参数是否已经修改:下面几个命令均在node3主机上执行,可在node3上使用ssh node4 'COMMAND’来验证下node4上各参数是否已修改

[root@wh ~]# ifconfig    #在node3上执行该命令,查看是否有VIP,使用ssh node4 'ifconfig'命令查看node4上是否也有VIP
eth0 Link encap:Ethernet  HWaddr 00:0C:29:7F:8F:44inet addr:172.21.5.18Bcast:172.16.255.255Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500Metric:1RX packets:162748errors:0dropped:0overruns:0frame:0TX packets:2368errors:0dropped:0overruns:0carrier:0collisions:0txqueuelen:1000RX bytes:26502458(25.2MiB)  TX bytes:200681(195.9KiB)Interrupt:59Base address:0x2000
lo  Link encap:Local Loopbackinet addr:127.0.0.1Mask:255.0.0.0UP LOOPBACK RUNNING  MTU:16436Metric:1RX packets:10errors:0dropped:0overruns:0frame:0TX packets:10errors:0dropped:0overruns:0carrier:0collisions:0txqueuelen:0RX bytes:666(666.0b)  TX bytes:666(666.0b)lo:0Link encap:Local Loopbackinet addr:172.16.32.5Mask:255.255.255.255UP LOOPBACK RUNNING  MTU:16436Metric:1
[root@wh ~]# route -n   #查看是否有配置的VIP特定路由
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.32.50.0.0.0255.255.255.255UH    000lo
169.254.0.00.0.0.0255.255.0.0U     000eth0
172.16.0.00.0.0.0255.255.0.0U     000eth0
0.0.0.0172.16.0.10.0.0.0UG    000eth0
[root@wh ~]# cat /proc/sys/net/ipv4/conf/all/arp_ignore
1
[root@wh ~]# cat /proc/sys/net/ipv4/conf/all/arp_announce
2

到此,我们的两台RealServer都以配置完毕,而且其http服务也已正常工作。

现在去编辑我们的keepalived的配置文件,并修改成我们所需要的。

#先在node1主机上进行修改:
[root@wh ~]# vim /etc/keepalived/keepalived.conf
global_defs {}vrrp_script chk_httpd {script "killall -0 httpd"interval 2weight -2fall 2rise 1
}vrrp_script chk_schedown {script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"interval 2weight -2
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 132priority 101advert_int 1authentication {auth_type PASSauth_pass langdu}virtual_ipaddress {172.16.32.5/16 dev eth0 label eth0:0}track_script {chk_httpdchk_schedown}notify_master "/etc/keepalived/notify.sh master"notify_backup "/etc/keepalived/notify.sh backup"notify_fault "/etc/keepalived/notify.sh fault"
}virtual_server 172.16.32.5 80 {delay_loop 6lb_algo rrlb_kind DRnat_mask 255.255.0.0protocol TCPreal_server 172.21.5.16 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 2nb_get_retry 3delay_before_retry 2}}real_server 172.21.5.18 80 {weight 2HTTP_GET {url {path /status_code 200}connect_timeout 2nb_get_retry 3delay_before_retry 3}}
}

下面这个脚本时实现健康检查用的。即上边用到的notify.sh脚本

#!/bin/bash
# Author: onlyyou
# description: 一个通知脚本示例ifalias=${2:-eth0:0}
interface=$(echo $ifalias | awk -F: '{print $1}')
vip=$(ip addr show $interface | grep $ifalias | awk '{print $2}')
contact='root@localhost'
workspace=$(dirname $0)notify() {subject="$vip 地址切换为 $1"body="$vip 地址切换为 $1 $(date '+%F %H:%M:%S')"echo $body | mail -s "$1 过渡" $contact # 实现发送邮件
}case "$1" in
master)notify masterexit 0;;
backup)notify backup/etc/rc.d/init.d/httpd restartexit 0;;
fault)notify faultexit 0;;
*)echo "用法: $(basename $0) {master|backup|fault}"exit 1;;
esac
scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/
# 将配置文件发给另一个keepalived主机,这里发给node2,假如你的主机不是node2,请做相应修改
# 在node2主机上,修改刚传过来的keepalived的配置文件。这里只需修改两项即可:
state BACKUP          #设置该node2主机为backup路由priority 100 #设定node2主机的优先级为100,低于node1
# 在node2主机上,我们只需修改上述两项即可。

修改完成后保存退出

现在我们去安装ipvsadm软件包,然后再启动keepalived服务

ssh node2 'yum -y install ipvsadm'   #通过node1主机在node2上安装ipvsadm软件包
yum -y install ipvsadm   #在node1上安装软件包
安装完毕后启动我们的keepalived服务。
service keepalived start    #启动node1上的keepalived服务
ssh node2 'service keepalived start'   #在node1上启动node2的keepalived服务

查看下ipvs规则

ipvsadm -l -n   #使用该命令,查看是否有ipvs规则,显示如下:
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.32.5:80rr
-> 172.21.5.18:80Route   100
-> 172.21.5.16:80Route   100
ifconfig    #查看下node1上的IP配置情况
eth0      Link encap:Ethernet  HWaddr 00:0C:29:9F:2F:AFinet addr:172.21.5.22Bcast:172.16.255.255Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500Metric:1RX packets:290653errors:1dropped:0overruns:0frame:0TX packets:13874errors:0dropped:0overruns:0carrier:0collisions:0txqueuelen:1000RX bytes:46393162(44.2MiB)  TX bytes:2014631(1.9MiB)Interrupt:59Base address:0x2000
eth0:0Link encap:Ethernet  HWaddr 00:0C:29:9F:2F:AFinet addr:172.16.32.5Bcast:0.0.0.0Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500Metric:1Interrupt:59Base address:0x2000
lo        Link encap:Local Loopbackinet addr:127.0.0.1Mask:255.0.0.0UP LOOPBACK RUNNING  MTU:16436Metric:1RX packets:10errors:0dropped:0overruns:0frame:0TX packets:10errors:0dropped:0overruns:0carrier:0collisions:0txqueuelen:0RX bytes:666(666.0b)  TX bytes:666(666.0b)

配置的VIP也已生效,我们的ipvs规则已经实现。现在在我们的物理机上访问下172.16.32.5,看一下,是否可以访问,显示什么信息吧。

到目前为止,貌似我们还没有实现IP地址漂移。我们只需在master路由主机上,在相应目录下创建一个down文件即可实现手动漂移IP地址。

在node1上

cd /etc/keepalived/#进入该目录
touch down    #创建该文件,用来实现手动漂移IP地址
tail /var/log/messages    #停几秒钟后,查看日志
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Entering MASTER STATE
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) setting protocol VIPs.
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
May 1619:15:32node1 Keepalived_healthcheckers[2815]: Netlink reflector reports IP 172.16.32.5added
May 1619:15:32node1 Keepalived_vrrp[2816]: Netlink reflector reports IP 172.16.32.5added
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Received higher prio advert    #收到更高优先级的通告信息
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Entering BACKUP STATE     #进入backup状态
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) removing protocol VIPs.     #转移VIP地址
May 1619:15:32node1 Keepalived_healthcheckers[2815]: Netlink reflector reports IP 172.16.32.5removed
May 1619:15:32node1 Keepalived_vrrp[2816]: Netlink reflector reports IP 172.16.32.5removed
ifconfig   #使用该命令,查看下node1主机的VIP是否存在,可看到已转移到其他主机
eth0      Link encap:Ethernet  HWaddr 00:0C:29:9F:2F:AFinet addr:172.21.5.22Bcast:172.16.255.255Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500Metric:1RX packets:347881errors:1dropped:0overruns:0frame:0TX packets:21333errors:0dropped:0overruns:0carrier:0collisions:0txqueuelen:1000RX bytes:50760780(48.4MiB)  TX bytes:2653767(2.5MiB)Interrupt:59Base address:0x2000
lo        Link encap:Local Loopbackinet addr:127.0.0.1Mask:255.0.0.0UP LOOPBACK RUNNING  MTU:16436Metric:1RX packets:10errors:0dropped:0overruns:0frame:0TX packets:10errors:0dropped:0overruns:0carrier:0collisions:0txqueuelen:0RX bytes:666(666.0b)  TX bytes:666(666.0b)> 在node2主机上查看其日志。
```bash
tail /var/log/messages   #查看node2的日志信息
May 1619:15:32node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1619:15:32node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1619:15:33node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 1619:15:34node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) Entering MASTER STATE    #进入master状态
May 1619:15:34node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) setting protocol VIPs.    #设定VIP
May 1619:15:34node1 Keepalived_healthcheckers[2463]: Netlink reflector reports IP 172.16.32.5added
May 1619:15:34node1 avahi-daemon[3375]: Registering new address record for172.16.32.5on eth0.
May 1619:15:34node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
May 1619:15:34node1 Keepalived_vrrp[2464]: Netlink reflector reports IP 172.16.32.5added
May 1619:15:39node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5

在在我们的物理机访问下,看能否访问。依然在浏览器地址栏输入172.16.32.5,可以看到,访问正常。
现在,我们删掉/etc/keepalived/down这个文件,看能否实现IP漂移回来。

rm -f /etc/keepalived/down      #删除node1主机上该文件
tail /var/log/messages    #查看日志信息
May 1619:15:32node1 Keepalived_vrrp[2816]: Netlink reflector reports IP 172.16.32.5removed
May 1619:27:54node1 Keepalived_vrrp[2816]: VRRP_Script(chk_schedown) succeeded
May 1619:27:55node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1619:27:55node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1619:27:56node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 1619:27:57node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Entering MASTER STATE    #进入master状态
May 1619:27:57node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) setting protocol VIPs.
May 1619:27:57node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
May 1619:27:57node1 Keepalived_healthcheckers[2815]: Netlink reflector reports IP 172.16.32.5added
May 1619:27:57node1 Keepalived_vrrp[2816]: Netlink reflector reports IP 172.16.32.5added

至此,我们已成功实现了keepalived的相关功能。以上演示的仅仅是主从模式下地址漂移。那我们能否实现在双主模式下实现地址漂移呢?答案是肯定的。

相关文章:

lvs dr+keepalived

基于keepalived(主从双主) LVS(DR模型) DNS实现http高可用集群 keepalived高可用主机IP:172.21.5.22和172.21.5.21 http服务高可用主机IP:172.21.5.16和172.21.5.18 VIP采用172.16.32.5 各虚拟机及主机名和IP对应关系如下所示: 虚拟机主机…...

如何使新手小白编码能力暴涨之Devchat-AI

在这个快速发展的时代,开发者的任务越来越繁重,要求他们快速、高效地完成开发任务。然而,传统的开发方式已经无法满足这个需求。在这种情况下,Devchat的出现给开发者带来了新的帮助。Devchat是一个研发效能分析平台,它…...

SAP ABAP基础语法-TCODE学习(八)

一、 SD-如何在订单中使用客户层次定价的配置和维护步骤 在SD中有时会用到按客户层次进行定价的策略,我这里就将配置和维护的步骤简单写出来,供大家参考. 1)定义层次类型(VOH1) 路径:销售和分销->主数据->业务合作伙伴->客户->客户层次->定义层次类型 (1)伙…...

stm32-arm固件开发

文章目录 前言1. 前言 ARM体系结构与程序设计【全68讲】 1....

LeetCode 面试题 16.17. 连续数列

文章目录 一、题目二、C# 题解 一、题目 给定一个整数数组,找出总和最大的连续数列,并返回总和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。…...

基于人工蜂鸟算法的无人机航迹规划-附代码

基于人工蜂鸟算法的无人机航迹规划 文章目录 基于人工蜂鸟算法的无人机航迹规划1.人工蜂鸟搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用人工蜂鸟算法来优化无人机航迹规划。 …...

51单片机汇编-点亮一个led

文章目录 前言1.打开IDE2.设置编辑器3.设置输出4. 原理图5.编写代码6 编译7.下载8.其它代码1.LED闪烁2.跑马灯 前言 51单片机基础 51汇编实战 本章主要介绍打开一个led,具体采用51汇编 1.打开IDE 选择STC89C52RC 后缀是.asm 2.设置编辑器 3.设置输出 4. 原理图 5.编写代码 …...

每天一点python——day62

为了方便复制,我在下面附带了一个python文件。 C:\Users\Admin>python Python 3.9.13 (main, Aug 25 2022, 23:51:50) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32Warning: This Python interpreter is in a conda environment, but the environmen…...

基于SSM的智慧作业试题管理系统(有报告)。Javaee项目。

演示视频: 基于SSM的智慧作业试题管理系统(有报告)。Javaee项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Sprin…...

ESP32 未来能够取代 STM32吗?

今日话题,ESP32 未来能够取代 STM32吗?ESP32和STM32各自有其特点和优势,能否取代彼此取决于具体应用和需求。STM32的流行除了性价比外,还有其强大的开发环境,例如Cubemx能够快速生成代码,使得上手STM32的速…...

Java连接Redis并操作Redis中的常见数据类型

目录 一. Java连接Redis 1. 导入依赖 2. 建立连接 二. Java操作Redis的常见数据类型存储 1. Redis字符串(String) 2. Redis哈希(Hash) 3. Redis列表(List) 4. Redis集合(Set) 一. Java连接Redis 1. 导入依赖 pom依赖…...

Python 基于分位数-正态分布转换的评分算法

在实验的时候遇到一个比较实际的问题,就是怎样对数据进行评分。比如我想根据样本的正确率进行打分,有两种方法,一种是将准确率排序,然后根据序号进行打分,这样可以排除极端数据的影响,但是准确率之间的差距…...

如何修改CentOS登录时默认目录

查了一下,有说改/etc/passwd文件的,有说改.bashrc文件的,也有说改.bash_profile,修改的方法都不一样。 我要改的是root登录时的目录,最后修改了/root/.bash_profile文件,只要加一行cd 路径就可以。 这个文…...

JavaFX Scene Builder Gluon 控件详解

在 JavaFX Scene Builder 工具中,Gluon 是一个扩展库,提供了一些额外的控件和功能,用于创建更丰富和现代化的用户界面。本文将详细介绍 Gluon 中的各个控件及其作用。 AppBar(应用栏) AppBar 是一个用于显示应用程序…...

Vue路由(router-link)——高亮、动态传参

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话,需要给当前跳转的导航加样式,同时要移除上一个a标签的样式,太麻烦!!! 2.解决方案 vue-router 提供了一个全局组件 router…...

Java中将List转换为Map

在Java 8中,Stream API和Collectors类提供了一种方便的方式来处理集合数据。其中,将List转换为Map是一个常见的操作。下面我们将介绍如何使用Stream API和Collectors类将List转换为Map。 首先,假设我们有一个User类,包含id和name两…...

进程控制2——进程等待

在上一小节中我们介绍了进程的创建(fork)与退出(main函数的return与exit函数) 并且要有一个意识,进程退出的时候只有三种情况: 1.进程退出,结果正确 2.进程退出,结果不正确 3.运行异…...

k8s service

文章目录 Service 基础概念Service 类型:Service 的工作流程:东西流量,南北流量NodePortLoadBalancer Service 基础概念 在 Kubernetes(K8s)中,Service 是一个抽象的概念,表示一个应用程序的逻…...

C语言 每日一题 PTA 11.6 day12

1.调和平均 N 个正数的算数平均是这些数的和除以 N,它们的调和平均是它们倒数的算数平均的倒数。 本题就请你计算给定的一系列正数的调和平均值。 输入格式: 每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N(≤1000);第 2 行给…...

Git使用规范指南

文章目录 Git使用规范指南前言分支命名规范分支合并流程规范提交信息规范Angular提交规范注意事项 通用Git忽略文件配置 Git使用规范指南 前言 由于最近写完代码之后,Git使用不规范被领导说了,所以最近通过阅读大量的相关博客快速学习Git使用规范&#…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 ​ 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Mac软件卸载指南,简单易懂!

刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"&#xff0…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...