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

Nginx第二讲

目录

二、Nginx02

2.1 keepalived和heartbeat介绍

2.1.1 两者的介绍

2.1.2 keepalived简介

2.1.3 VRRP协议与工作原理

2.1.4 Keepalvied的工作原理

2.2 安装环境及keepalived

2.3 启动与验证keepalived

2.4 keepalived测试

2.4.1 环境准备

2.4.2 配置keepalived

2.4.3 项目其余配置

2.4.4 测试抢占模式

2.5 nginx的工作原理


二、Nginx02

2.1 keepalived和heartbeat介绍

2.1.1 两者的介绍

Keepalived是Linux下一个轻量级别的高可用解决方案。它与HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别。

高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是指主机的冗余和接管。

    HeartBeat是一个专业的、功能完善的高可用软件,它提供了HA 软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦。Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。

2.1.2 keepalived简介

    Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

后来Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程。

2.1.3 VRRP协议与工作原理

在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。

熟悉网络的学员对VRRP协议应该不陌生,它是一种主备模式的协议,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信,这其中涉及到两个概念:物理路由器和虚拟路由器。

VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。

每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,一一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性。

2.1.4 Keepalvied的工作原理

网络的七层协议:
7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;
高层(7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端,点到点的数据流。上面我们介绍了Keepalived通过VRRP实现高可用性的工作原理,而Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控以及故障隔离,下面我们介绍一下Keepalived对服务器运行状态和故障隔离的工作原理。

Keepalived工作在TCP/IP (五层模型)参考模型的 三层、四层、五层,也就是分别为:网络层,传输层和应用层,根据TCP、IP参数模型隔层所能实现的功能,Keepalived运行机制如下:

     在网络层:我们知道运行这4个重要的协议,互联网络IP协议,互联网络可控制报文协议ICMP、地址转换协议ARP、反向地址转换协议RARP,在网络层Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。在传输层:提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP,传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接,而Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。在应用层:可以运行FTP,TELNET,SMTP,DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除
 

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器

为什么使用集群?1. 防止单点故障;2. 负载均衡;3. 高并发;4. 高可靠;

 

 

2.2 安装环境及keepalived

1、逐步操作

1、在 /usr/lwl/soft下面创建keepalived文件夹
2、联网下载安装包wget https://www.keepalived.org/software/keepalived-2.0.10.tar.gz
3、解压安装包tar -zxvf keepalived-2.0.10.tar.gz
4、安装依赖的环境yum -y install popt-devel libnl libnl-devel libnfnetlink-devel net-tools
5、检测是否适合安装[root@localhost ~]# cd keepalived-2.0.10./configure --prefix=/usr/java/keepalived
6、编译并安装make && make install
7、配置keepalived[root@os004 keepalived-2.0.10]# cp /usr/java/keepalived/keepalived-2.0.10/keepalived/etc/init.d/keepalived /etc/init.d/[root@os004 keepalived-2.0.10]# mkdir /etc/keepalived[root@os004 keepalived-2.0.10]# cp /usr/java/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/[root@os004 keepalived-2.0.10]# cp /usr/java/keepalived/keepalived-2.0.10/keepalived/etc/sysconfig/keepalived /etc/sysconfig/[root@os004 keepalived-2.0.10]# cp /usr/java/keepalived/sbin/keepalived /usr/sbin/

2、联合操作

1、安装环境:
yum -y install popt-devel libnl libnl-devel libnfnetlink-devel net-tools
​
#安装成功提示
Installed:libnfnetlink-devel.x86_64 0:1.0.1-4.el7         libnl.x86_64 0:1.1.4-3.el7         libnl-devel.x86_64 0:1.1.4-3.el7         popt-devel.x86_64 0:1.13-16.el7        
​
Complete!
​
​
#如果想安装指定版本,可以查看一下都有什么版本可以安装
yum list|grep keepalived
​
2、安装keepalived
yum install -y keepalived
​
#安装成功提示
Dependency Updated:ipset.x86_64 0:7.1-1.el7                            ipset-libs.x86_64 0:7.1-1.el7                                                        
Complete!
​
3、安装位置
[root@localhost keepalived]# pwd
/etc/keepalived
[root@localhost keepalived]# ls
keepalived.conf

2.3 启动与验证keepalived

[root@os004 keepalived-2.0.10]# systemctl  start keepalived
[root@os004 keepalived-2.0.10]# systemctl  status keepalived
​
#查看正在运行的keepalived进程
[root@os004 keepalived-2.0.10]# ps -aux|grep keepalived

2.4 keepalived测试

2.4.1 环境准备

配置两台虚拟机:使用centos7

虚拟ip:192.168.221.127192.168.221.128
​
Keppalived1:主机 127 Nginx 主机上有两个项目(127:Tomcat 8080,127:Tomcat 8081)
​
Keppalived2:从机 128 Nginx

2.4.2 配置keepalived

主服务器修改192.168.111.127的配置文件/etc/keepalived/keepalived.conf

global_defs {notification_email {123@qq.com            #设置报警邮件地址,可以设置多个,可以不设置}notification_email_from master@qq.com     #发送通知邮件时邮件源地址smtp_server 127.0.0.1    # 发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现smtp_connection_timeout 30     #连接smtp连接超时时间router_id 192.168.111.127      #############定义路由标识信息,相同局域网唯一
}
vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh"    ##########最后手动执行下此脚本,以确保此脚本能够正常执行interval 2      #(检测脚本执行的间隔,单位是秒)weight -2       #当检查失败后,将vrrp_instance的priority减小2fall 3          #连续监测失败3次,才认为真的健康检查失败。并调整优先级rise 2          #连续监测2次成功,就认为成功。但不调整优先级
}# 虚拟ip配置 vrrp
vrrp_instance VI_1 {state MASTER             # 指定keepalived的角色,MASTER为主,BACKUP为备,大写interface ens33          ############ 当前进行vrrp通讯的网络接口卡(当前centos的网卡)mcast_src_ip 192.168.111.127  ###########发送心跳包的源IP,可使用绑定的网卡IPvirtual_router_id 180        # 虚拟路由编号,主从要一直0-255priority 100            # 优先级,数值越大,获取处理请求的优先级越高advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)authentication {auth_type PASS  #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信auth_pass 1111}track_script {chk_http_port            #(调用检测脚本)}virtual_ipaddress {192.168.111.100            ################### 定义虚拟ip(VIP),可多设,每行一个}
}

备用服务器修改192.168.111.128的配置文件/etc/keepalived/keepalived.conf

global_defs {notification_email {123@qq.com         #设置报警邮件地址,可以设置多个,可以不设置}notification_email_from master@qq.com     #发送通知邮件时邮件源地址smtp_server 127.0.0.1   # 发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现smtp_connection_timeout 30       #连接smtp连接超时时间router_id 192.168.111.128        #定义路由标识信息,相同局域网唯一
}
vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh"    #最后手动执行下此脚本,以确保此脚本能够正常执行interval 2         #(检测脚本执行的间隔,单位是秒)weight -2          #当检查失败后,将vrrp_instance的priority减小5fall 3             #连续监测失败3次,才认为真的健康检查失败。并调整优先级rise 2             #连续监测2次成功,就认为成功。但不调整优先级
}# 虚拟ip配置 vrrp
vrrp_instance VI_1 {state BACKUP            # 指定keepalived的角色,MASTER为主,BACKUP为备,大写interface ens33            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)mcast_src_ip 192.168.111.128 #发送心跳包的源IP,可使用绑定的网卡IPvirtual_router_id 180        # 虚拟路由编号,主从要一直priority 98            # 优先级,数值越大,获取处理请求的优先级越高advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)authentication {auth_type PASS  #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信auth_pass 1111}track_script {chk_http_port            #(调用检测脚本)}virtual_ipaddress {192.168.111.100            # 定义虚拟ip(VIP),可多设,每行一个}
}

2.4.3 项目其余配置

1、以下是针对nginx状态进行检测的脚本,第一次nginx服务死掉时,会重新启动,如果Nginx服务无法正常启动,则杀掉keepalived进程

vim /usr/local/src/check_nginx_pid.sh#!/bin/bash
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then                            /usr/local/nginx/sbin/nginx     if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  killall keepalived                    fi
fi

2、配置用户执行权限

#给所有用户执行权限
chmod a+x /usr/local/src/check_nginx_pid.sh

3、修改nginx.conf文件

vi /usr/local/nginx/conf/nginx.conflocation  / {root   /usr/lwl/files/static/dist;  #vue项目在系统中的位置index  index.html index.htm;    #最初过来访问的页面}

4、开启nginx和keepalived进行测试

systemctl start nginx
systemctl start keepalived
​
然后再浏览器使用虚拟路由进行访问  192.168.111.100
也可以使用真正的路由进行访问 192.168.111.127   或者是  192.168.111.128
​
出现vue图标即是成功

5、查看连接的哪台主机

可以使用Xshell新建一个连接,连接IP地址为 192.168.111.100
输入 ip addr 出现的ip地址就是正在连接的服务器ip地址
​
​
如果关闭当前正在连接的主机,那么另外一台备用机就会连接

访问[http://192.168.111.100/ 一切正常],无论是tomcat机器还是nginx都避免了单点故障。

2.4.4 测试抢占模式

现在192.168.111.127 是主机,192.168.111.128是备用机,

如果修改128里面配置文件 /etc/keepalived/keepalived.conf

state MASTER   #将128也修改为主机

这时分配的服务器就是随机的。

2.5 nginx的工作原理

Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。

worker工作图:

1、一个master多个worker的好处每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的, 继续进行争抢,实现请求过程,不会造成服务中断2、设置多少个 woker 合适worker 数和服务器的 cpu 数相等是最为适宜的
​
有关 连接数 worker_connection
3、第一个:发送请求,占用了 woker 的几个连接数?答案:2 或者 4 个
​
4、第二个:nginx 有一个 master,有四个 woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?①普通的静态访问最大并发数是: worker_connections * worker_processes /2,②而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4

相关文章:

Nginx第二讲

目录 二、Nginx02 2.1 keepalived和heartbeat介绍 2.1.1 两者的介绍 2.1.2 keepalived简介 2.1.3 VRRP协议与工作原理 2.1.4 Keepalvied的工作原理 2.2 安装环境及keepalived 2.3 启动与验证keepalived 2.4 keepalived测试 2.4.1 环境准备 2.4.2 配置keepalived 2.…...

redis(win版)

1. 前言1.1 什么是RedisRedis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。基于内存存储,读写性能高适合存储热点数据&am…...

【Linux】编辑器——vim(最小集+指令集+自动化配置)

目录 1.vim最小集 1.1 vim的三种模式 1.2 vim的基本操作 2.vim指令集 2.1 命令模式指令集 移动光标 删除文字 复制 替换 撤销上一次操作 更改 跳至指定的行 2.2 底行模式指令集 列出行号 跳到文件中的某一行 查找字符 保存文件 多文件操作 3.如何配置vim 配…...

Centos7+Xshell+Jenkins堆装

windows系统崩坏,重装测试类工具,心情崩了 windows硬盘损坏前,运行应用具慢。。。。。。慢着慢着就走了 从前部署在本地的jenkins,python,gitblit等相关脚本都凉透了,所以这次把服务部署到Centos7上…...

Android system实战 — Android R(11) 进程保活白名单

Android system实战 — Android R 进程保活白名单0. 前言1. 具体实现1.1 准备工作1.2 源码实现1.2.1 源码1.2.2 diff文件0. 前言 最近在Android R上实现一些需求,进行记录一下,关于进程保活的基础知识可以参考Android system — 进程生命周期与ADJ&#…...

oracle表 分组,并查每组第一条

oracle主要用到的函数:OVER(PARTITION BY) mysql主要用到的函数:LIMIT (用到3个地方:分组列、组内排序列、表名) oracle: select t.* from ( select a.*, ROW_NUMBER() OVER (PARTITION BY 分组列 ORDER BY 组内排…...

Java代码弱点与修复之——DE: Dropped or ignored exception(无视或忽略异常)

弱点描述 Dropped or ignored exception(DE)指的是在代码中抛出的异常被捕获后被无视或忽略了,而不是被适当地处理。这种情况通常发生在程序员没有处理异常或处理异常时不小心忽略了异常的情况下。 Dropped or ignored exception会导致程序无法正常工作,因为异常会阻塞程…...

JavaEE简单示例——动态SQL之更新操作<set>元素

简单介绍: 在之前我们做的学生管理系统的时候,曾经有一个环节是修改学生的数据。我们在修改的时候是必须将student对象的三个属性全部填入信息,然后全部修改才可以,这样会造成一个问题就是在我们明明只需要修改一个属性的时候却要…...

【极海APM32替代笔记】低功耗模式配置及配置汇总

【极海APM32替代笔记】低功耗模式配置及配置汇总 文章总结:(后续更新以相关文章为准) 【STM32笔记】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断) 【STM32笔记】HAL库低功耗模式配置…...

攻击者失手,自己杀死了僵尸网络 KmsdBot

此前,Akamai 的安全研究员披露了 KmsdBot 僵尸网络,该僵尸网络主要通过 SSH 爆破与弱口令进行传播。在对该僵尸网络的持续跟踪中,研究人员发现了一些有趣的事情。 C&C 控制 对恶意活动来说,最致命的就是夺取对 C&C 服务…...

东阿县高新技术企业认定条件和优惠政策 山东同邦科技分享

东阿县高新技术企业认定条件和优惠政策 山东同邦科技分享 高新技术企业 在《国家重点支持的高新技术领域》内,持续进行研究开发与技术成果转化,形成企业核心自主知识产权,并以此为基础开展经营活动,在中国境内(不包…...

【基础算法】哈希表(拉链法)

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...

硬件学习 软件Cadence day07 PCB 底板电路图布线

1.根据原理图的元器件, 选择在 PCB 芯片制作的元器件 (allegro中原理图和pcb中元件的交互) 1.首先完成下列操作 可以尝试先关闭再打开, 等下操作的时候就好 发现新增的发光物体!! 2.完成操作 ,…...

SkyWalking仪表盘使用

Skywalking仪表盘使用 1 仪表盘 作用:查看被监控服务的运行状态。 1)监控面板 1.1 APM APM:应用性能管理,通过各种探针采集数据,收集关键指标,同时搭配数据呈现以实现对应用程序性能管理和故障管理的系统化解决方案…...

面渣逆袭:分布式十二问,万字图文详解

大家好,我是老三,不管今年金三银四如何,面渣逆袭系列继续,这期我们来看看分布式。 分布式理论 1. 说说CAP原则? CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性…...

设计模式C++实现23:中介者模式(Mediator)

部分内容参考大话设计模式第25章;本实验通过C语言实现。 一 原理 意图:用一个中介对象来封装一系列对象的交互,中介者使得各个对象不需要显示地相互引用,从而使耦合松散,而且可以独立地改变它们之间的交互。 上下文…...

Java方法【未完待续】

目录 前言 一、什么是方法? 二、方法的定义和调用 方法的定义 方法的调用 三、方法的重载 重载规则 实现理论 总结 前言 随着对Java这一编程语言的深入学习,大家可能会遇到一个熟悉又陌生的词——方法,其实Java方法就是我们学习C/C时…...

(考研湖科大教书匠计算机网络)第六章应用层-第一、二节:应用层概述和C/S及P2P

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:应用层概述二:客户/服务器(C/S)和对等(P2P)方式(1)客户/服务器&…...

禅道bug提醒脚本部署

环境准备 nginxpython3 服务器目录 以下目录为自定义配置,需在 nginx 默认配置文件的http{}内添加 include /www/conf/*.conf; 才会生效 /www ├── conf "存放配置文件 │ └── lowCode.zyl.conf "低代码bug统计页配置 ├── wwwlogs "存…...

利用spring的retry重试编写Feign远程调用重试

自定义注解FeignRetry为了解决上面提到的问题,让Feign调用的每个接口单独配置不同的重试机制。我们使用了面向切面编程并编写了一个自定义注解:FeignRetry。此注释的工作方式类似于Retryable的包装器,并与其共享相同的规范以避免混淆。Target…...

Docker启动RabbitMQ,实现生产者与消费者

目录 一、Docker拉取镜像并启动RabbitMQ 二、Hello World (一)依赖导入 (二)消息生产者 (三)消息消费者 三、实现轮训分发消息 (一)抽取工具类 (二)启…...

【C语言】函数栈帧的创建与销毁

Yan-英杰的主页 悟已往之不谏 知来者之可追 目录 ​0.ebp和esp是如何来维护栈帧的呢? 1.为什么局部变量的值不初始化是随机的? ​2.局部变量是怎么创建的? ​3 .函数是如何传参的?传参的顺序是怎样的 4.函数是如何调用的 ​…...

【Git】使用Git上传项目到远程仓库Gitee码云步骤详解

电脑里存放了很多项目,有的备份,有的没备份,如果不仔细分类管理的话,时间一长,到时看到那就会觉得非常杂乱,很难整理,这里有一个叫源代码托管,用过它的都知道,方便管理和…...

Head First设计模式---3.装饰者模式

3.1装饰者模式 亦称: 装饰者模式、装饰器模式、Wrapper、Decorator 装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 举个例子:天气很冷,我们一件一件穿衣服&#xff0c…...

Python 算法交易实验48 表字段设计

说明 虽然说的是表,实际上用的是Mongo集合 基于ADBS(APIFunc DataBase Service)可以构造一个供后续研究、生产长时间使用的数据基础,这个基础包括了: 1 队列服务。通过队列,数据可以通过API实现零担和批量两种模式的快速存储。2 …...

库存管理系统-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

【案例6-1】 库存管理系统 【案例介绍】 1.任务描述 像商城和超市这样的地方,都需要有自己的库房,并且库房商品的库存变化有专人记录,这样才能保证商城和超市正常运转。 本例要求编写一个程序,模拟库存管理系统。该系统主要包…...

【极海APM32替代笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

【极海APM32替代笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216…...

Python类变量和实例变量(类属性和实例属性)

无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们。我们可以将类看做一个独立的空间,则类属性其实就是在类体中定义的变量,类方法是在类体中定义的函数。 在类体中,根据变量定义的位置不…...

Glide加载图片

使用Glide加载图片,默认情况下在内存中缓存该图片。这样的情况下如果我们保存头像在某个路径,当再次更换头像时可能由于缓存问题,UI上更新的不及时。 默认加载图片方式: Glide.with(context).load(coverPath).error(R.drawable.a…...

有关时间复杂度和空间复杂度的练习

目录 一、消失的数字 二、轮转数组 三、 单选题 一、消失的数字 数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在 O(n) 时间内完成吗? 注意:本题相对书上原题稍作改动 示例 1: 输入…...