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

Linux入门攻坚——41、Linux集群系统入门-lvs(2)

lvs-dr:GATEWAY

Director只负责请求报文,响应报文不经过Director,直接由RS返回给Client。

lvs-dr的报文路线如上图,基本思路就是报文不会回送Director,第①种情况是VIP、DIP、RIP位于同一个网段,这样,网络可以共用一个,即使用同一个路由器和交换机;第②种情况VIP与DIP和RIP不在一个网段,响应报文会走单独的网络线路。

对第一种情况进行实操测试:地址分配表

这里主要问题是:当请求报文到来时,它请求的是VIP,在到达VIP所在网络时,需要知道VIP对应的V-MAC,但是因为在Director和RS上都配置了VIP,就会引起混乱,所以这里的关键是确定真正的Director对应的VIP的MAC,方法有三种,一是arp绑定,在请求报文到来的设备上的接口静态绑定Director的V-MAC;二是在RS上使用arptables过滤;三是在内核上设置内核参数:arp_ignore和arp_announce来实现。一二两种方式有一定的局限性,一般使用第三种。

关于arp_ignore和arp_announce,要理解这两个参数,需要明白arp的工作方式:
每新来一台机器,自己通告一下;后来的机器或是前面的机器没有收到,可以主动询问。

ARP协议的作用就是根据IP地址获取其对应的MAC地址。在以太网中,主机要发送一个数据报文,首先需要获取目标MAC地址(如果通信的目标主机在同一网段,那目标MAC地址就是目标主机的MAC地址,否则应该为网关的MAC地址或下一跳的MAC地址),而获取目标MAC地址的方法就是使用ARP协议发送ARP请求数据报文,ARP请求数据报文中会包含发送方的IP地址和MAC地址,并且包含想要获取MAC地址的目标IP地址,该ARP请求数据报文的数据链路层目标地址为广播地址,也就是说它是一个二层广播数据包(因为不知道谁拥有指定目标IP地址,所以只能使用广播方式发送)。在同一局域网的所有主机都将收到该ARP请求数据报文,但是只有拥有目标IP地址的主机才会发送ARP响应数据报文,该ARP响应数据报文包含发送方的IP地址和MAC地址(即对方想要知道的目标MAC地址),并且目标IP地址和MAC地址设置为对方的地址(即ARP请求数据包发送方的地址),并且该数据报文为单播数据报文(其数据链路层目标地址为对方的MAC地址)。

arp_announce参数是定义linux主机发送ARP请求数据报文时如何选择数据报文中使用的发送方IP地址(即Sender IP address)。在系统准备通过网卡发送一个IP数据包前,该IP数据包的源IP地址和目标IP地址通常是已经知道的,然后根据目的IP查询路由表确定发送数据报文的网卡,则发送的网卡也已经确定,那数据链路层的源MAC地址当然也确定了,发送ARP请求数据报文时需要包含发送方IP地址,该IP地址应该是什么呢?大家可能想当然的以为就是要发送的IP数据报文的源IP地址,其实这个是不一定的,尤其是主机有多个网络接口和IP地址时,而arp_announce正是控制该发送方IP地址的选择条件的。arp_announce参数的取值分别是0、1、2,这些取值的意义如下:
0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用要发送数据报文的源IP。
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。

arp_announce - INTEGER
Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface:
0 - (default) Use any local address, configured on any interface
1 - Try to avoid local addresses that are not in the target's subnet for this interface.
This mode is useful when target hosts reachable via this interface require the source IP address in ARP requests to be part of their logical network configured on the receiving interface. When we generate the request we will check all our subnets that include the target IP and will preserve the source address if it is from such subnet. If there is no such subnet we select source address according to the rules for level 2.
2 - Always use the best local address for this target.
In this mode we ignore the source address in the IP packet and try to select local address that we prefer for talks with the target host. Such local address is selected by looking for primary IP addresses on all our subnets on the outgoing interface that include the target IP address. If no suitable local address is found we select the first local address we have on the outgoing interface or on all other interfaces, with the hope we will receive reply for our request and even sometimes no matter the source IP address we announce.
The max value from conf/{all,interface}/arp_announce is used.     

arp_ignore参数是定义linux主机在收到ARP请求数据报文后,发送ARP响应数据报文的条件级别,该参数的取值范围是0~8,各取值的意义分别是:
0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
4~7:保留未使用
8:不回应所有的arp请求
arp_ignore - INTEGER
Define different modes for sending replies in response to received ARP requests that resolve local target IP addresses:
0 - (default): reply for any local target IP address, configured on any interface
1 - reply only if the target IP address is local address configured on the incoming interface
2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface
3 - do not reply for local addresses configured with scope host, only resolutions for global and link addresses are replied
4-7 - reserved
8 - do not reply for all local addresses

arp_announce是控制本机发送ARP请求报文时,对请求报文的源IP和源MAC进行控制的选项,这里的重点是一是请求报文,二是源IP和源MAC
   
如上图,右边的Director主机在3.1接口上想发送一个ARP请求报文,请求1.2的MAC地址,现在的问题来了:发送的ARP请求报文,请求的目的IP肯定是1.2,那么源IP是什么,源MAC又是什么?对于源MAC是确定的,就是报文从哪个接口发送出去,就是哪个接口的MAC,所以,这个请求报文的源MAC是1.1接口的MAC,而源IP则根据arp_announce来确定,如果是0,那么最初是哪个IP,就是哪个IP,这里是从3.1发起的ARP请求,那么源IP就是3.1,最终请求报文就是源IP3.1源MAC1.1目的IP1.2这样一个请求报文;如果arp_announce是2,则忽略IP数据报文的源IP地址,选择发送网卡上最合适的本地地址作为arp请求的源IP地址,即选择1.1作为请求报文的源IP,最终请求报文就是源IP1.1源MAC1.1目的IP1.2这样一个请求报文;arp_announce为1,尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址,这里的发送网卡是1.1所在网卡,所以避免使用不是1.1网络的IP作为源IP,即不使用原来的3.1,而是使用1.1作为源IP,最终请求报文就是源IP1.1源MAC1.1目的IP1.2这样一个请求报文;

arp_ignore是控制本机接收请求报文后的处理,即对响应报文的控制,如上图,从1.2来的ARP请求报文,从1.1接口进入主机,请求3.1的MAC地址,那么,如果arp_ignore为0,则响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上,就是说,主机要对此请求报文进行响应,因为3.1是本主机的一个IP,不管这个报文是从哪个接口进来的,从2.1或3.1或4.1进来的,都进行响应;如果arp_ignore为1,只响应目的IP地址为接收网卡上的本地地址的arp请求,此时1.1接口只配置了1.1地址,3.1不在接收网卡上,此时主机不会响应ARP请求报文,如果1.1接口上同时配置了3.1,那么就会响应;arp_ignore为2,只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段,此时不但检查请求报文的目的IP是在配置在入接口上,还要检查目的IP和源IP是否是同一子网地址,1.2请求3.1的MAC,同时3.1配置在1.1的接口卡上,主机也不会响应,因为源IP和目的IP不在一个子网,1.2请求1.1的MAC,并且请求报文从1.1接口进入,主机才响应;

 在这里的lvs-dr演示中,arp_ignore=1,arp_announce=2,arp_announce为2,lo接口上的VIP不会发送ARP请求,不会以源IP为VIP发送ARP请求报文,arp_ignore为1,只有接收到目的IP为VIP的ARP请求报文的接口,才能响应报文,即接收到对VIP的ARP请求报文的接口上配置了VIP,才能响应,这就杜绝了lo上的VIP对ARP的响应。

配置Director上的VIP,配置在网卡别名上:
ifconfig ens:0 192.168.147.140/32 broadcast 192.168.147.140 up

添加路由: route add -host 192.168.147.140 dev ens33:0

配置RS上的内核参数:

配置RS上的VIP地址:

测试:在Windows宿主机上ping 192.168.147.140,然后看其arp结果:

Director上的MAC:

说明我们PING通的是Director上的VIP。
配置另一台RS:

添加ipvs:

此时访问http://192.168.147.140,不断刷新,会看到RS交替,实现负载均衡。

以上是VIP、DIP、RIP在同一网段的lvs-dr情况。

lvs-dr:VIP,DIP/RIP不在同一网段情况

使用vmware模拟上述情景,需要对vmware的网络有所了解。vmware的网络模式有:
bridge(桥接模式),nat(NAT模式),only host(仅主机)模式

对于vmware中的虚拟机及其之间的通信,如上图,在宿主机中不但虚拟了主机和虚拟网卡,还有虚拟交换机,虚拟主机1与虚拟主机2可以通信,在同一个网络中,虚拟主机2和虚拟主机3可以通信,虚拟主机1和虚拟主机3呢?如果虚拟主机2没有开启路由和核心转发功能,1和3之间就不能通信。那么虚拟主机如何与外部物理主机通信?这要分几种情况。
对于bridge,即桥接模式,实际上是将宿主机的物理网卡模拟成虚拟交换机,在VMWare中就是VMNet0,连接到这个虚拟交换机中的虚拟主机2,3,就可以直接与物理主机通信,同时VMware又为宿主机物理网卡虚拟出一个虚拟网卡,继承物理网卡的配置,这样外部物理主机也可以继续与宿主机通信。
对于nat模式和仅主机模式,相差不多:

nat模式,会在宿主机上安装一块虚拟网卡VMNet8,虚拟的网卡分配的地址一般是.1,如我的是192.168.147.1,然后会虚拟一个NAT路由器,其IP为.2,如我的192.168.147.2,在上图中NAT设置中可以看到,就是网关IP。连接在同一虚拟交换机上的虚拟主机可以访问外部物理主机(通过nat),即设置默认路由为192.168.147.2,就是NAT路由器,通过这个路由进行nat,与宿主机的物理网卡做nat;内部虚拟机之间可以相互访问(同一网络内),通过VMNet8虚拟网卡,虚拟主机可以与宿主机之间相互访问。
only host(仅主机)模式,没有虚拟NAT路由器,即没有192.168.xx.2这个地址,也就无法进行nat,虚拟主机与外部相互之间不通信,VMNet1只用于虚拟主机与宿主机之间的互相访问。
在虚拟交换机上,还可以附加DHCP服务器,进行虚拟机地址的自动分配。

模拟环境搭建:

Director的配置:

ipvsadm -A -t 192.168.61.129:80 -s rr
ipvsadm -a -t 192.168.61.129:80 -r 192.168.217.130:80 -g
ipvsadm -a -t 192.168.61.129:80 -r 192.168.217.131:80 -g

RS配置:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
ifconfig lo:0  192.168.61.129/32 broadcast 192.168.61.129 up
route add -net 192.168.61.0/24 gw 192.168.217.129

从router上测试,即从192.168.61.130的虚拟机上运行:curl http://192.168.61.129
测试结果是命令卡住,没有结果返回。
使用tcpdump对各虚拟机抓包,http请求从61.130到了61.129,从217.128到了RS,从RS到了217.129,已经回到了router上,好像就是最后router处理不了。

(以后有时间再捣鼓这个吧)

关于ipvsadm -f选项防火墙标记

netfilter:
  PREROUTING --> INPUT
  PREROUTING --> FORWARD --> POSTROUTING
  OUTPUT --> POSTROUTING

对于用户的请求(外部请求),不会经过OUTPUT链,那么所有的请求都经过PREROUTING,经过PREROUTING后才能到达ipvs,那么,就可以在PREROUTING对请求报文打上标记,使用iptables防火墙进行标记(对报文进行修改),mangle就是进行拆包封包。

在PREROUTING时:  -j MARK --set-mark #
然后在ipvs中:-A -f # 对特定报文进行调度。意味着可以同时对不同类型的报文同时进行调度。

再增加一种功能:ssh
iptables -t mangle -A PREROUTING -d 192.168.61.129 -p tcp --dport 22 -j MARK --set-mark 10
这样,ipvs不需要改动,就实现ssh的负载均衡。

通过FWM定义集群的方式:
  1)在Director上netfilter的mangle表的PREROUTING链上定义用于打标的规则;
  iptables -t mangle -A PREROUTING -d $vip -p $proto --dport &port -j MARK --set-mark #
  2)基于FWM定义集群服务:
  ipvsadm -A -f # -s scheduler
  ipvsadm -a -f # -r $rs-ip -g
功用:将共享一组RS的集群服务统一进行定义。

session保持:session绑定;session复制;session服务器
session绑定:lvs sh算法
  对某一特定服务
lvs persistence:lvs的持久连接:无论ipvs使用何种调度方法,其都能实现将来自于同一个Client的请求始终定向至第一次调度时挑选的RS;
  持久连接模版:独立于算法;
    sourceip   rs   timer
  对多个共享同一组RS的服务器,需要统一进行绑定;

ipvsadm -A -t 192.168.61.129:80 -s rr -p 
ipvsadm -a -t 192.168.61.129:80 -r 192.168.217.130 -g
ipvsadm -a -t 192.168.61.129:80 -r 192.168.217.131 -g

持久连接的实现方式:
  每端口持久:PPC,单服务持久调度;
  每FWM持久:PFWMC,单FWM持久调度;PORT AFFINITY
  每客户端持久:PCC,单客户端持久调度;
    director会将用户的任何请求都识别为集群服务,并向RS进行调度;

lvs的HA(高可用性)
  SPOF:Single Point Of Failure (单点故障)
  director:高可用集群;
  realserver:让director对其做健康状态检测,并且根据检测的结果自动完成添加或移除等管理功能;
    1)基于协议层次检查:
        ip:icmp;
        传输层:检测端口的开放状态;
        应用层:请求获取关键性的资源;
    2)检查频度:客户容忍度
    3)状态判断:下线谨慎,上线乐观
        下线:ok --> Failure --->  Failure --->  Failure ,也就是多次判断失败后,才下线
        上线:Failure --> ok --> ok,即两次检测成功就上线。
    4)back server,sorry server

关于集群的个人总结:通过lvs的了解,听着高大尚的集群,其实就是一个关于数据包流程改变的过程,由一个前端的调度器,作为总的接入口,然后将报文分配给后面的业务服务器,最后由业务服务器直接返回结果给客户端或者返回给调度器再返回给客户端,中间的调度过程对客户端是透明的,调度的过程中,要考虑后端服务器的负载均衡,就是调度算法,要考虑服务的状态保持,要考虑调度器或业务服务器、存储等的高可用性等等,对客户端的请求报文,可以只通过改变MAC、IP、PORT等改变流向,也可以通过调度器拆包再重新生成新的请求包来实现流向改变并增加新功能,这就是四层和七层路由。关键是构建这个转发网络。

相关文章:

Linux入门攻坚——41、Linux集群系统入门-lvs(2)

lvs-dr:GATEWAY Director只负责请求报文,响应报文不经过Director,直接由RS返回给Client。 lvs-dr的报文路线如上图,基本思路就是报文不会回送Director,第①种情况是VIP、DIP、RIP位于同一个网段,这样&…...

Android Freezer

Freezer原理 Android按照优先级将一般的APP从高到低分为: 前台进程 --> 可感知进程–> 服务进程 --> Cached进程。 Freezer通过冻住cached进程,来迫使这些进程让出CPU,以达到优化系统资源使用的目的。 Cached进程是怎么判定的呢? 由于andro…...

GeeCache-单体并发缓存

实现LRU中value接口的缓存类 使用互斥锁封装LRU缓存类,实现并发访问 实现Group组,用名称对缓存分类 Getter为缓存击穿时调用的回调函数 若缓存击穿则调用回调函数,并把读取到的值加载到缓存中...

ctfshow-web 151-170-文件上传

151. 我们首先想到就是上传一句话木马。但是看源代码限制了png。 (1)改前端代码。 这里是前端限制了上传文件类型,那我们就改一下就好了嘛,改成php。 这里直接修改不行,给大家推荐一篇简短文章,大家就会了&#xff08…...

汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集

本数据集支持YOLO,COCO,VOC三种格式标记汽车车牌,无论是新能源汽车还是油车都能识别标记,该数据集一共包含4000张图片 数据集分割 4000总图像数 训练组 70% 2800图片 有效集 20% 800图片 测…...

解决VSCode无法识别相对路径的问题

前言: 近日在学习python文件操作时,发现使用VSCode作为编辑器时,文件的相对路径会出问题,报错“指定路径下找不到文件”,无法找到想要的文件。 知识点①:不同操作系统所使用的路径斜杠不同:Lin…...

OCR 技术在验证码识别中的应用

OCR 技术在验证码识别中的应用 一、验证码识别的背景与挑战二、OCR 技术简介三、验证码识别的环境搭建四、使用 OCR 进行验证码识别的方法五、DdddOcr 子项在验证码识别中的应用六、验证码识别的应用场景与注意事项七、总结 在当今数字化时代,验证码作为一种安全验证…...

恶补英语初级第21天,《讨论天气变化》

对话 What’s the weather like in spring? It’s often windy in March. It’s always warm in April and May, but it rains sometimes. What’s it like in summer? It’s always hot in June, July and August. The sun shines every day. Is it cold or warm in autumn?…...

牛客网刷题SQL--高级查询

目录 SQL16--查找GPA最高值 描述 示例1 答案 其他方法: SQL17--计算男生人数以及平均GPA 描述 示例1 答案 SQL18--分组计算练习题 描述 示例1 答案 SQL19--分组过滤练习题 描述 示例1 答案 SQL20--分组排序练习题 描述 示例1 答案 SQL16--查找GP…...

用ffmpeg将MP4视频转换为m3u8格式

原文网址:用ffmpeg将MP4视频转换为m3u8格式_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何使用ffmpeg将MP4视频转换为m3u8格式。 什么是m3u8 M3U8视频格式是一种M3U,只是它的编码格式是UTF-8格式。M3U用Latin-1字符集编码。M3U8格式特点是带有…...

【Qt】qt基础

目录 一、使用Qt Creator创建qt项目 二、项目文件解析 三、Qt中创建图形化界面的程序的两种方法 四、对象树 一、使用Qt Creator创建qt项目 1.选择项目模板 选中第一类模板Application(Qt应用程序,包含普通窗体程序和QtQuick程序), 然后选中右侧的第…...

VLC还是SmartPlayer?Windows平台RTSP播放器低延迟探讨

技术背景 好多开发者在用过大牛直播SDK的RTSP播放器后,都希望我们也分享下,如何在Windows平台实现低延迟的RTSP播放?低延迟的RTSP播放器,说起来容易做起来难,下面,我们从以下维度做个探讨: 播…...

极验决策引擎如何凭借独特优势,弯道超车传统风控?

前言 市场上的规则决策引擎产品众多,但大多局限于IP、设备、账号等层面,提供的是现成的风控标签和规则。然而,真正的风控,需要的不仅仅是标签和规则。 极验的业务规则决策引擎与众不同,这款决策引擎以界面流程编排为…...

Spring Boot集成Knife4j文档工具

Knife4j 搭建 Knife4j环境的的搭建和Swagger一样都比较简单,只需要极简的配置即可。 maven依赖 我使用的是较高版本的基于openapi规范的依赖包,OpenAPI2(Swagger)规范是Knife4j之前一直提供支持的版本,底层依赖框架为Springfox。 此次在4…...

html|本地实现浏览器m3u8播放器,告别网络视频卡顿

前言 网络上经常是以m3u8文件传输视频流的 ,但是有时网络慢往往导致视频播放卡顿。于是我在想能不能先下载然后再播放呢?于是尝试下载然后实现本地播放m3u8视频。 正文 1.找到网络视频流的m3u8连接 一般在浏览器按F12就可以看到有请求视频流的连接。 …...

vue3监听横向滚动条的位置;鼠标滚轮滑动控制滚动条滚动;监听滚动条到顶端

1.横向取值scrollLeft 竖向取值scrollTop 2.可以监听到最左最右侧 3.鼠标滚轮滑动控制滚动条滚动 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 内容 --><div style"width: 2000px; height: 100…...

JSON

文章目录 一、概念1.json官网2.json的概念3.序列化方案&#xff1a;xml、json 二、json的数据类型1.json的键&#xff1a;必须是带双引号的字符串2.json的值&#xff1a;6种数据类型(1)对象 { }(2)数组 [ ] 三、Python中的json1.序列化&#xff1a;Python对象 转 json2.反序列化…...

前端常用的方法

时间处理 moment时间处理函数 // 时间日期相关常用的方法变量 import moment from moment;// 获取当前时间 moment export const nowDateMoment moment(new Date()); export const nowDateY moment(new Date()).format(YYYY); export const nowDateM moment(new Date()).f…...

JavaScript 对话框的魔法与艺术

在Web开发的世界里&#xff0c;JavaScript 对话框是用户与网页互动的重要桥梁。它们不仅能够提供即时反馈&#xff0c;还能收集用户的输入信息&#xff0c;从而增强用户体验。本文将深入探讨JavaScript对话框的各种类型、用法及其背后的原理&#xff0c;并通过丰富的实例展示如…...

java+springboot+mysql私人会所管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的私人会所管理系统&#xff0c;系统包含管理员、技师、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;服务项目&#xff1b;技师管理&#xff1b;房间管理&#xff1b;预约管理&#x…...

Scrapy 爬虫框架全解析

一、Scrapy 框架概述 基本定义 Scrapy 是一个用 Python 编写的开源网络爬虫框架。它旨在快速、高效地抓取网页数据&#xff0c;可处理大规模的数据抓取任务。基于 Twisted 异步网络库构建&#xff0c;能够并发地处理多个请求&#xff0c;大大提高了数据抓取的速度。遵循 “请求…...

Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000

Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000 01 前言 大数据系列&#xff0c;学到了Hive&#xff0c;搭建环境的时候&#xff0c;因为使用的是本机WSL2&#xff08;别问为啥不用VMware&#xff0c;问就是条件有限&#xff0c;而且WS…...

【跨库查询、多库查询】.NET开源 ORM 框架 SqlSugar 系列

文章目录 一、跨库方式1&#xff1a;跨库导航二、手动跨库查询三、同服务器&#xff1a;自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器&#xff1a;自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配…...

【JAVA】Java项目实战—Java 数据库应用项目:学生信息管理系统

本项目将实现一个简单的学生信息管理系统&#xff0c;功能包括学生信息的录入、查询、修改和删除。通过本项目&#xff0c;读者将深入理解Java与数据库交互的基本原理&#xff0c;掌握JDBC&#xff08;Java Database Connectivity&#xff09;技术&#xff0c;以及如何构建一个…...

中电金信携手中远海科,共启贸易金融数智新篇章

在数智化转型成为驱动经济社会高质量发展的新引擎背景下&#xff0c;“数智方案”栏目聚焦金融等国计民生重点行业场景&#xff0c;依托中电金信“源启筑基咨询引领应用重构”的产品及服务体系&#xff0c;输出市场洞察和行业解决方案、应用案例&#xff0c;旨在全面推动行业IT…...

有没有办法让爬虫更加高效,比如多线程处理?

要让Python爬虫更加高效&#xff0c;确实可以采用多线程处理。多线程可以显著提高爬虫的效率&#xff0c;因为它允许程序同时执行多个任务&#xff0c;从而减少等待时间。以下是一些提高爬虫效率的方法&#xff0c;特别是通过多线程技术&#xff1a; 1. 多线程爬虫 多线程爬虫…...

Android历史版本主要更新说明

Android 15 Android 15 继续致力于构建注重隐私和安全保护的平台&#xff0c;助您提高效率&#xff0c;同时还引入了多项新功能&#xff0c;帮您打造精美应用、卓越的媒体和相机体验&#xff0c;并提供直观的用户体验。在平板电脑和可折叠设备上更能凸显出这些优势。 Android…...

测试岗位应该学什么

以下是测试岗位需要学习的一些关键内容&#xff1a; 1. 测试理论和方法 - 了解不同类型的测试&#xff0c;如功能测试、性能测试、压力测试、安全测试、兼容性测试等。 - 掌握测试策略和测试计划的制定。 2. 编程语言 - 至少熟悉一种编程语言&#xff0c;如 Python、Java…...

华为HarmonyOS NEXT 原生应用开发: 数据持久化存储(用户首选项)的使用 token令牌存储鉴权!

Preferences 数据持久化存储 用户首选项&#xff08;Preferences&#xff09; 1. 封装 仓库工具类 ● 这里可以选择将 数据字段 key 抽取为一个静态方法&#xff0c;这里选择让用户传参&#xff0c;看起来较容易理解&#xff01; /*** 首选项 preferences - 实现数据持久化…...

【AIStarter】告别复杂转换 - MinerU整合包实现PDF到Markdown的无缝转变

在数字化时代&#xff0c;信息的传递与共享变得愈发重要。文档格式之间的转换成为了日常工作中不可或缺的一部分。为了满足用户对高效工作流程的需求&#xff0c;新版MinerU整合包应运而生&#xff0c;它不仅简化了从PDF到Markdown的转换过程&#xff0c;还为用户带来了前所未有…...

Jenkins参数化构建详解(This project is parameterized)

本文详细介绍了Jenkins中不同类型的参数化构建方法&#xff0c;包括字符串、选项、多行文本、布尔值和git分支参数的配置&#xff0c;以及如何使用ActiveChoiceParameter实现动态获取参数选项。通过示例展示了传统方法和声明式pipeline的语法 文章目录 1. Jenkins的参数化构建1…...

服务器批量清理redis keys,无法适用客户端必须直连的情况

在 Redis 中&#xff0c;批量清理指定模式的键&#xff08;例如 memberCardData:*&#xff09;可以通过多种方法来实现。需要注意的是&#xff0c;Redis 的命令执行是单线程的&#xff0c;因此对大量键进行操作时可能会阻塞服务器。以下是几种常见的方法&#xff1a; shell K…...

单元测试SpringBoot

添加测试专用属性 加载测试专用bean Web环境模拟测试 数据层测试回滚 测试用例数据设定...

牛客网刷题 | BC126 小乐乐查找数字

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;从0至1-CSDN博客&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;C语言、C、数据结构、嵌入式、Linux&#x1f36d; &#x1f60e;本文内容&#x1f923;&#xff1a;&#x1f36d;BC1…...

Node一、fs 模块、path 模块、端口号、 http 模块、

一、Node.js了解 Node.js是一个跨平台JavaScript运行环境&#xff0c;使开发者可以搭建服务器端的JavaScript应用程序。 概念&#xff1a;使用 Node.js 编写后端程序 / 支持前端工程化 ✓ 后端程序&#xff1a;提供接口和数据&#xff0c;网页资源等 ✓ 前端工程化 &#x…...

k8s service 配置AWS nlb load_balancing.cross_zone.enabled

在Kubernetes中配置NLB&#xff08;Network Load Balancer&#xff09;的跨区域负载均衡&#xff08;cross-zone load balancing&#xff09;&#xff0c;需要使用服务注解&#xff08;service annotations&#xff09;来实现。根据AWS官方文档&#xff0c;以下是配置NLB跨区域…...

[分布式即时通讯系统] 注册类完善

我们在qss里添加err_tip样式&#xff0c;根据不同的状态做字体显示 #err_tip[statenormal]{color: green; } #err_tip[stateerr]{color: red; } 接下来项目中添加global.h和global.cpp文件&#xff0c;global.h声明repolish函数&#xff0c;global.cpp用来定义这个函数。 .h…...

C#使用HttpWebRequest下载文件

public static bool HttpDownloadFile(string downloadUrl, string localPath, log4net.ILog log) { bool bFlagDownloadFile false; //log.Debug(“HttpDownloadFile–准备以HTTP的方式下载文件&#xff0c;url:[” downloadUrl “]本地文件&#xff1a;【” localPath “…...

CentOS7环境安装php

直接安装 yum -y install php CentOS7默认安装是php5&#xff0c;现在php已有8.3版本 先查看php -v 版本 如果是低版本&#xff0c;可以删除 yum remove php yum remove php-fpm yum remove php-common 一、添加REMI存储库 yum install epel-release yum install -y …...

【Excel学习记录】04-排序和筛选

1.排序 &#xff08;1&#xff09;简单排序 不建议选中某列后进行排序 可以选中一个单元格或者整个表格→开始→编辑→排序和筛选→升序/降序 &#xff08;2&#xff09;多条件排序 可以选中一个单元格或者整个表格→开始→编辑→排序和筛选→自定义排序→指定关键字、比较内…...

Python轻松获取抖音视频播放量

现在在gpt的加持下写一些简单的代码还是很容易的&#xff0c;效率高&#xff0c;但是要有一点基础&#xff0c;不然有时候发现不了问题&#xff0c;这些都需要经验积累和实战&#xff0c;最好能和工作结合起来&#xff0c;不然很快一段时间就忘的干干净净了&#xff0c;下面就是…...

恢复删除的文件:6个免费Windows电脑数据恢复软件

数据恢复软件可帮助您从众多存储设备中恢复损坏或删除的数据。您可以使用这些文件恢复软件来检索文件、文档、视频、图片等。这些应用程序支持多种标准文件格式&#xff0c;如 PNG、RTF、PDF、HTML、JPG、MP3 等。 经过超过 75 小时的研究&#xff0c;我分析了 25 最佳免费数据…...

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事&#xff0c;后文简称 云女士 &#xff0c;非说 Go 的 Gin 框架比 Springboot 更加的开箱即用&#xff0c;我心想在 Java 里面 Springboot 已经打遍天下无敌手&#xff0c;这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗&#xff0c;非我要…...

Java 中枚举的 toString 方法及其字段信息展示

在 Java 编程中&#xff0c;枚举&#xff08;enum&#xff09;是一种特殊的数据类型&#xff0c;用于定义一组固定的常量。枚举类型不仅限于简单的常量定义&#xff0c;还可以包含字段、方法以及构造函数&#xff0c;从而使其具备更强的表达能力。toString 方法是 Java 中所有对…...

Python数据分析(OpenCV视频处理)

处理视频我们引入的还是numpy 和 OpenCV 的包 引入方式如下&#xff1a; import numpy as np import cv2 我们使用OpenCV来加载本地视频&#xff0c;参数就是你视频的路径就可以 #加载视频 cap cv2.VideoCapture(./1.mp4) 下面我们进行读取视频 #读取视频 flag,frame cap.re…...

DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能

目录 财务应付 金融信贷业务 近期&#xff0c;DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具&#xff0c;支持不同版式单据智能分类扩展&#xff0c;可选功能插件配置流程&#xff0c;满足多样业务场景。 随着全球化与信息化进程&#xff0c;企业的文件…...

python编程Day15-UnitTest框架的介绍

框架 framework为了解决一类事情的功能集合 Unittest 框架 是 Python 自带的单元测试框架 自带的, 可以直接使用, 不需要单外安装 测试人员 用来做自动化测试, 作为自动化测试的执行框架, 即 管理和执行用例的 使用原因 能够组织多个用例去执行提供丰富的断言方法能够生成测试报…...

Linux——进程控制模拟shell

1.进程创建 我们在之前的文章中介绍过进程创建的方法&#xff0c;可以通过系统调用接口fork来创建新的进程。 fork在创建完新的子进程之后&#xff0c;返回值是一个pid&#xff0c;对于父进程返回子进程的pid&#xff0c;对于子进程返回0。fork函数后父子进程共享代码&#xff…...

OpenCV的图像矫正

一、原理 图像矫正的原理是透视变换&#xff0c;下面来介绍一下透视变换的概念。 透视变换&#xff08;Perspective Transform&#xff09;基于一个4对点的映射关系&#xff08;4个源点到4个目标点&#xff09;&#xff0c;通过这些点之间的映射&#xff0c;可以计算一个变换…...

基于php求职招聘系统设计

摘要 随着社会信息化时代的到来&#xff0c;如今人们社会的生活节奏普遍加快&#xff0c;人们对于工作效率的要求也越来越高&#xff0c;企业 举办招聘会耗时耗财&#xff0c;个人参加招聘会漫无目的寻找不到“方向”&#xff0c;网络搜索工作量目的性不强&#xff0c;信息量繁…...