HAProxy负载均衡详细解释

目录

1、HAProxy的负载均衡

1.1socat工具的使用

1.1.1对于单进程

1.1.2对于多进程处理方法(对haproxy做热处理)

2、Haproxy的算法

2.1静态算法

<1>static-rr

<2>first

2.2动态算法

<1>roundrobin

<2>leastconn

<3>random

2.3其他算法(以下算法取决于hash-type 是否是consistent)

<1>Source

<2>map-base取模法

<3>一致性 hash

<4>uri

<5>url_param

<6>hdr(User-Agent)   #基于客户端请求报文

3、haproxy的状态页

4、haproxy高级算法及配置

4.1基于cookie的会话保持

4.2 IP透传

4.2.1七层透传

4.2.2 四层IP透传

5、ACL配置选项

5.1 ACL匹配模式

5.2 ACL匹配规范:

5.3 ACL实战

ACL示例1-域名匹配

ACL示例2-基于源IP或子网调度访问

ACL示例3-基于源地址的访问控制

 ACL示例4-匹配浏览器类型

ACL示例5-基于文件后缀名实现动静分离

ACL示例6-匹配访问路径实现动静分离

6、HAProxy自定义错误页面

7、MYSQL的负载均衡

8、HAProxy https 实现


1、HAProxy的负载均衡

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。

并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

1.1socat工具的使用

对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如IP、TCP、UDP、IPv6、Socket文件等 

                                                                                                ——动态调整haproxy中的参数

示例:

[root@haproxy ~]# dnf install socat -y

1.1.1对于单进程

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

[root@haproxy ~]# systemctl restart haproxy.service

[root@haproxy ~]# echo "show info"    |   socat stdio /var/lib/haproxy/haproxy.sock

#显示详细信息

[root@haproxy ~l#echo "show servers state"    |  socat stdio   /var/lib/haproxy/haproxy.sock

#显示服务的状态

[root@haproxy ~]# echo "get weight webcluster/web1"  | socat stdio   /var/lib/haproxy/haproxy.sock

#查看web1这个服务的权重值

[root@haproxy ~]# echo "set weight webcluster/web1 2" | socat stdio  /var/lib/haproxy/haproxy.sock

#设置web1这个权重值为2

[root@haproxy ~]# echo "disable server  webcluster/web1"     |  socat stdio/var/lib/haproxy/stats

#关闭此服务的进程

[root@haproxy ~]# echo "enable server    webcluster/web1"   |  socat stdio/var/lib/haproxy/stats

#开启此服务的进程

[root@haproxy ~]# echo "help" | socat stdio /var/lib/haproxy/stats   #查看socat的帮助信息

1.1.2对于多进程处理方法(对haproxy做热处理)

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

[root@haproxy ~]# systemctl restart haproxy.service

stats进程此时不能使用,但stats1和stats2可以使用

[root@haproxy ~]# echo "help" | socat stdio /var/lib/haproxy/stats

2024/08/08 23:51:38 socat[4832] E connect(5, AF=1 "/var/lib/haproxy/stats", 24): Connection refused

[root@haproxy ~]# echo "show info" | socat stdio /var/lib/haproxy/stats1

Name: HAProxy

Version: 1.8.27-493ce0b

Release_date: 2020/11/06

Nbthread: 1

Nbproc: 2

Process_num: 1

Pid: 4802

Uptime: 0d 0h02m09s

2、Haproxy的算法

Haproxy通过固定参数 balance 指明对后端服务器的调度算法

balance参数可以配置在listen或backend选项中

Haproxy的调度算法分为静态和动态调度算法

有些算法可以根据参数在静态和动态算法中相互转换。

2.1静态算法

静态算法只能重启生效

后端服务器理论上无限

<1>static-rr

基于权重的轮询调度,不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 wrr

<2>first

根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置,此方式使用较少

不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效

2.2动态算法

基于后端服务器状态进行调度适当调整

新请求将优先调度至当前负载较低的服务器

权重可以在haproxy运行时动态调整无需重启

<1>roundrobin

基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的轮询模式,

HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整,roundrobin为默认调度算法,此算法使用广泛

哪个后端服务器负载小就把请求转发给哪个后端服务器

<2>leastconn

leastconn 加权的最少连接的动态,支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接),比较适合长连接的场景使用,比如:MySQL等场景。

<3>random

在1.9版本开始增加 random的负载平衡算法,其基于随机数作为一致性hash的key,随机负载平衡对于大型服务器场或经常添加或删除服务器非常有用,支持weight的动态调整,weight较大的主机有更大概率获取新请求

2.3其他算法(以下算法取决于hash-type 是否是consistent)

<1>Source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。

此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type选项进行更改

这个算法一般是在不插入Cookie的TCP模式下使用,也可给不支持会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景

源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash

<2>map-base取模法

取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此

请求转发至对应的后端服务器。此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度。缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变,hash-type 指定的默认值为此算法

<3>一致性 hash

一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n ,该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动

1、key1=hash(source_ip)%(2^32) [0---4294967295]

2、keyA=hash(后端服务器虚拟ip)%(2^32)

3、将key1和keyA都放在hash环上,将用户请求调度到离key1最近的keyA对应的后端服务器

hash环偏斜问题

增加虚拟服务器IP数量,比如:一个后端服务器根据权重为1生成1000个虚拟IP,再hash。而后端服务器权重为2则生成2000的虚拟IP,再进行hash运算,最终在hash环上生成3000个节点,从而解决hash环偏斜问题

<4>uri

基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后,根据最终结果将请求转发到后端指定服务器,适用于后端是缓存服务器场景,默认是静态算法,也可以通过hash-type

指定map-based和consistent,来定义使用取模法还是一致性hash。

Url:网址要找的路径位置

uri不变访问的地址就不变

<5>url_param

url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server,如果无没key,将按roundrobin算法

<6>hdr(User-Agent)   #基于客户端请求报文

针对用户每个http头部(header)请求中的指定信息做hash,此处由 name 指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。

3、haproxy的状态页

状态页配置项:

           

4、haproxy高级算法及配置

4.1基于cookie的会话保持

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

[root@localhost ~]# curl -b cookie=lhd1 192.168.182.151

webserver1

[root@localhost ~]# curl -b cookie=lhd2 192.168.182.151  #指定到cookie所设定的值

webserver2

[root@localhost ~]#

-b, --cookie <data> Send cookies from string/file

4.2 IP透传

4.2.1七层透传

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

[root@webserver1 ~]# vim /etc/httpd/conf/httpd.conf    #修改apache服务日志

测试:

通过测试可以追踪到是192.168.182.154和192.168.182.153这两个用户端访问的本机服务端

4.2.2 四层IP透传

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

[root@webserver2 ~]# vim /etc/nginx/nginx.conf       #nginx服务修改日志格式

测试:可以追踪到是哪个用户访问了本机

5、ACL配置选项

acl    <aclname>   <criterion>    [flags]       [operator]           [<value>]

acl        名称             匹配规范     匹配模式     具体操作符        操作对象类型

5.1 ACL匹配模式

-i 不区分大小写

-m 使用指定的正则表达式匹配方法

-n 不做DNS解析

-u 禁止acl重名,否则多个同名ACL匹配或关系

5.2 ACL匹配规范:

hdr string,提取在一个HTTP请求报文的首部

hdr([<name> [,<occ>]]):完全匹配字符串,header的指定信息,<occ> 表示在多值中使用的值的出

现次数

hdr_beg([<name> [,<occ>]]):前缀匹配,header中指定匹配内容的begin

hdr_end([<name> [,<occ>]]):后缀匹配,header中指定匹配内容end

hdr_dom([<name> [,<occ>]]):域匹配,header中的dom(host)

hdr_dir([<name> [,<occ>]]):路径匹配,header的uri路径

hdr_len([<name> [,<occ>]]):长度匹配,header的长度匹配

hdr_reg([<name> [,<occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配

hdr_sub([<name> [,<occ>]]):子串匹配,header中的uri模糊匹配 模糊匹配c 报文中a/b/c也会匹配

 

base : string

#返回第一个主机头和请求的路径部分的连接,该请求从主机名开始,并在问号之前结束,对虚拟主机有用

<scheme>://<user>:<password>@#<host>:<port>/<path>;<params>#?<query>#<frag>

base : exact string match

base_beg : prefix match

base_dir : subdir match

base_dom : domain match

base_end : suffix match

base_len : length match

base_reg : regex match

base_sub : substring match

 

path : string

#提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)

<scheme>://<user>:<password>@<host>:<port>#/<path>;<params>#?<query>#<frag>

path : exact string match

path_beg : prefix match #请求的URL开头,如/static、/images、/img、/css

path_end : suffix match #请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg

path_dom : domain match

path_dir : subdir match

path_len : length match

path_reg : regex match

path_sub : substring match

 

url : string

#提取请求中的整个URL。

url :exact string match

url_beg : prefix match

url_dir : subdir match

url_dom : domain match

url_end : suffix match

url_len : length match

url_reg : regex match

url_sub : substring match

dst           #目标IP

dst_port  #目标PORT

src           #源IP

src_port  #源PORT

5.3 ACL实战

ACL示例1-域名匹配

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

frontend webcluster

    bind *:80

    mode http

    acl test hdr_dom(host) -i www.lhd.com  

    acl test hdr_end(host) -i .com

    use_backend webcluster-host if  test

    default_backend default-host

backend webcluster-host

    mode http

    server web1 192.168.182.152:80 check

backend default-host

    mode http

    server web2 192.168.182.153:80 check

测试结果:

[root@localhost ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.182.151 www.lhd.com www.test.com

[root@localhost ~]# curl www.lhd.com

webserver1

[root@localhost ~]# curl www.test.com

webserver1

ACL示例2-基于源IP或子网调度访问

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

frontend webcluster

    bind *:80

    mode http

    acl ctrl_ip src 192.168.182.154 192.168.182.153    #153和154这两个主机

    use_backend webcluster-host if  ctrl_ip               #如果是这两个主机就访问到web1的后端

    default_backend default-host

backend webcluster-host

    mode http

    server web1 192.168.182.152:80 check

backend default-host

    mode http

    server web2 192.168.182.153:80 check

测试结果:

[root@webserver2 ~]# curl 192.168.182.151      #192.168.182.153主机所访问的结果索引

web1服务上

webserver1

[root@localhost ~]# curl 192.168.182.151        #192.168.182.154主机所访问的结果

webserver1

[root@webserver1 ~]# curl 192.168.182.151      #192.168.182.152主机所访问的结果默认到web2服务上

webserver2

ACL示例3-基于源地址的访问控制

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

frontend webcluster

    bind *:80

    mode http

    acl ctrl_ip src 192.168.182.154 192.168.182.153

    acl test hdr_dom(host) -i www.lhd.com                   test所指的是域名

    http-request deny if  test                                         拒绝访问test

    default_backend default-host

backend webcluster-host

    mode http

    server web1 192.168.182.152:80 check

backend default-host

    mode http

    server web2 192.168.182.153:80 check

测试结果:

[root@webserver2 ~]# curl 192.168.182.151   #在192.168.182.153主机上被索引到默认后端

webserver2

[root@localhost ~]# curl 192.168.182.151       #在192.168.182.154主机上被索引到默认后端

webserver2

[root@localhost ~]# curl www.lhd.com                域名被拒绝访问

<html><body><h1>403 Forbidden</h1>

Request forbidden by administrative rules.

</body></html>

 ACL示例4-匹配浏览器类型

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

frontend webcluster

    bind *:80

    mode http

    acl badwebrowers hdr_sub(User-Agent) -i curl wget

    http-request deny if  badwebrowers

    default_backend default-host

backend webcluster-host

    mode http

    server web1 192.168.182.152:80 check

backend default-host

    mode http

    server web2 192.168.182.153:80 check

测试结果:

[root@localhost ~]# curl 192.168.182.151

<html><body><h1>403 Forbidden</h1>

Request forbidden by administrative rules.

</body></html>

被索引到默认web2主机上

ACL示例5-基于文件后缀名实现动静分离

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

frontend webcluster

    bind *:80

    mode http

    acl static path_end -i .html .jpg .png .css .js

    acl dhcp path_end -i .php

    use_backend webcluster-host if  dhcp           #如果匹配的是dhcp就使用index.php访问到php默认主页上,如果是static就用index.jpg访问到web2服务上

    default_backend default-host

backend webcluster-host

    mode http

    server web1 192.168.182.152:80 check

backend default-host

    mode http

    server web2 192.168.182.153:80 check

测试结果:

[root@webserver1 ~]# echo php 192.168.182.152 > /var/www/html/index.php

[root@webserver2 ~]# echo jpg 192.168.182.153 > /usr/share/nginx/html/index.jpg

[root@localhost ~]# curl 192.168.182.151/index.php

php 192.168.182.152

[root@localhost ~]# curl 192.168.182.151/index.jpg

jpg 192.168.182.153

ACL示例6-匹配访问路径实现动静分离

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

frontend webcluster

    bind *:80

    mode http

    acl static path_sub -m sub /static

    acl php path_sub -m sub /php                            

    use_backend webcluster-host if  php                #如果是匹配的是php就通过/php路径访问到web1服务上,否则则是访问到web2服务上

    default_backend default-host

backend webcluster-host

    mode http

    server web1 192.168.182.152:80 check

backend default-host

    mode http

    server web2 192.168.182.153:80 check

测试结果:

[root@webserver1 ~]# mkdir -p /var/www/html/php

[root@webserver1 ~]# echo php 192.168.182.152 > /var/www/html/php/index.html

[root@webserver2 ~]# mkdir -p /usr/share/nginx/html/static

[root@webserver2 ~]# echo static 192.168.182.153 > /usr/share/nginx/html/static/index.html

[root@localhost ~]# curl 192.168.182.151/php/

php 192.168.182.152

[root@localhost ~]# curl 192.168.182.151/static/

static 192.168.182.153

6、HAProxy自定义错误页面

先模拟停止两台web服务

[root@haproxy ~]# mkdir -p /etc/haproxy/errorpage

[root@haproxy ~]#

[root@haproxy ~]# cat /usr/share/haproxy/503.http

HTTP/1.0 503 Service Unavailable

Cache-Control: no-cache

Connection: close

Content-Type: text/html

<html><body><h1>503 Service Unavailable</h1>

No server is available to handle this request.

</body></html>

[root@haproxy ~]# cp /usr/share/haproxy/503.http /etc/haproxy/errorpage/bad.http

[root@haproxy ~]# cat /etc/haproxy/errorpage/bad.http

HTTP/1.0 503 Service Unavailable

Cache-Control: no-cache

Connection: close

Content-Type: text/html

<html><body><h1>你是不是没有生么事情</h1>

HAHAHA!!!

</body></html>

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

# 将错误修改

[root@haproxy ~]# systemctl restart haproxy.service

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

#将错误重定向到百度网页

7、MYSQL的负载均衡

[root@webserver1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf

[root@webserver1 ~]# systemctl start mariadb.service

[root@webserver2 ~]# vim /etc/my.cnf.d/mariadb-server.cnf

[root@webserver2 ~]# systemctl start mariadb.service

Webserver1服务端:

MariaDB [mysql]> create user lhd@'%' identified by '123';

Query OK, 0 rows affected (0.000 sec)

MariaDB [mysql]> grant all on *.* to lhd@'%';

Query OK, 0 rows affected (0.000 sec)

Webserver2服务端:

MariaDB [(none)]> create user lhd@'%' identified by '123';

Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> grant all on *.* to lhd@'%';

Query OK, 0 rows affected (0.000 sec)

测试

[root@haproxy ~]# for i in {1..6}; do mysql -ulhd -p123 -h 192.168.182.151 -e "select @@server_id"; done

+-------------+

| @@server_id |

+-------------+

|           1 |

+-------------+

+-------------+

| @@server_id |

+-------------+

|           2 |

+-------------+

+-------------+

| @@server_id |

+-------------+

|           1 |

+-------------+

+-------------+

| @@server_id |

+-------------+

|           2 |

+-------------+

+-------------+

| @@server_id |

+-------------+

|           1 |

+-------------+

+-------------+

| @@server_id |

+-------------+

|           2 |

+-------------+

8、HAProxy https 实现

1、制作证书

[root@haproxy ~]# mkdir -p /etc/haproxy/certs

[root@haproxy ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/haproxy/certs/lhd.key -x509 -days 365 -out /etc/haproxy/certs/lhd.crt

[root@haproxy ~]# ls /etc/haproxy/certs/

lhd.crt  lhd.key

[root@haproxy ~]# cat /etc/haproxy/certs/lhd.crt /etc/haproxy/certs/lhd.key  > /etc/haproxy/certs/lhd.pem

[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

#全站加密之后,当访问IP时默认是80端口,会自动转到443端口登陆

测试:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/399845.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL3.3_C++_Windows(35)

PBR_IBL漫反射 IBL图像的光照(Image based lighting&#xff09;&#xff1a;非直接光源&#xff0c;它是一种更精确的环境光照输入格式&#xff0c;甚至也可以说是一种全局光照的粗略近似。环境光照&#xff1a;获取每个wi光源辐射率&#xff0c;求辐照度&#xff1a;将周围环…

手机IP地址:是根据网络还是设备决定的?

在日益数字化的今天&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。它不仅是我们沟通的桥梁&#xff0c;更是我们获取信息、享受娱乐和完成工作的得力助手。然而&#xff0c;在使用手机上网的过程中&#xff0c;你是否曾经好奇过手机的IP地址是如何被分配的&#xf…

浅谈C语言位段

1、位段的定义 百度百科中是这样解释位段的: 位段&#xff0c;C语言允许在一个结构体中以位为单位来指定其成员所占内存长度&#xff0c;这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。 以下&#xff0c;我们均在VS2022的…

Llama 3.1中文微调数据集已上线,超大模型一键部署

7 月的 AI 圈真是卷完小模型卷大模型&#xff0c;精彩不停&#xff01;大多数同学都能体验 GPT-4o、Mistral-Nemo 这样的小模型&#xff0c;但 Llama-3.1-405B 和 Mistral-Large-2 这样的超大模型让很多小伙伴犯了难。 别担心&#xff01;hyper.ai 官网在教程板块为大家提供了…

创建第一个Qt项目

创建第一个QT项目 创建工程名称一般不要有特殊符号&#xff0c;不要有中文 项目工程保存路径可修改&#xff0c;路径不要带中文 Base class中的三个选项 QMainWindow:主窗口类&#xff0c;包括菜单栏、工具栏、状态栏。 QWidget:可以创建一个空白的窗口&#xff0c;是所有界…

SQL Server 2022的索引

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) 10.1 索引的含义…

【C++ 面试 - 基础题】每日 3 题(十)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

C# Winform序列化和反序列化

在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化&#xff0c;为解决此问题&#xff0c;采用System.Text.Json进行序列化&#xff0c;注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …

《剑指offer》题目 C++详细题解

JZ15 二进制中1的个数 核心考点&#xff1a;二进制计算 思路一&#xff1a;使用一个循环&#xff0c;因为我们知道整型变量只有32位&#xff0c;所以循环结束的条件就是到32&#xff0c;从最低位开始&#xff0c;逐位检查数字 n 的二进制表示&#xff0c;利用位运算中的与运算…

如何检查端口占用:netstat和lsof指令

在网络故障排查和系统管理中&#xff0c;检查端口占用情况是一项常见且重要的任务。本文将详细介绍如何使用 netstat 和 lsof 这两个强大的工具来检查端口占用和相关服务。 1. 使用 netstat 查看端口占用 netstat (network statistics) 是一个用于显示网络连接、路由表、接口…

前端react集成OIDC

文章目录 OpenID Connect (OIDC)3种 授权模式 【服务端】express 集成OIDC【前端】react 集成OIDCoidc-client-js库 原生集成react-oidc-context 库非组件获取user信息 OAuth 2.0 协议主要用于资源授权。 OpenID Connect (OIDC) https://openid.net/specs/openid-connect-core…

【案例44】Oracle启用“_optimizer_skip_scan_enabled” 参数导致NC系统卡死问题

问题现象 客户反映系统卡顿&#xff0c;很多操作耗时都比较长&#xff0c;通过nmc监控&#xff0c;线程耗时主要集中在数据库上。 问题分析 首先监控数据库服务器资源使用情况&#xff0c;CPU、内存使用正常&#xff0c;没有达到峰值。 监控磁盘IO情况&#xff0c;发现磁盘最…

WPF篇(11)-ToolTip控件(提示工具)+Popup弹出窗口

ToolTip控件 ToolTip控件继承于ContentControl&#xff0c;它不能有逻辑或视觉父级&#xff0c;意思是说它不能以控件的形式实例化&#xff0c;它必须依附于某个控件。因为它的功能被设计成提示信息&#xff0c;当鼠标移动到某个控件上方时&#xff0c;悬停一会儿&#xff0c;…

【C++ 面试 - 基础题】每日 3 题(十一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』

解决浏览器书签同步问题&#xff0c;极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 作为一个喜欢折腾的数码党&#xff0c;我平时上网冲浪使用的浏览器绝不会只限于一种&#xff0c;就比如说我在上班的地方只会用到Edge浏…

安科瑞Acrel-2000ES储能能量管理系统在新型电力系统下分布式储能的研究

摘要&#xff1a;传统电力系统的结构和运行模式在以新能源为主体的新型电力系统中发生了巨大的变化&#xff0c;分布式储能作为电力系统中重要的能量调节器&#xff0c;也迎来了新的发展机遇。立足于储能技术发展现状&#xff0c;分析了分布式储能技术特点及在清洁可再生能源方…

priority_queue的介绍 仿函数

1.priority_queue的介绍 1.优先队列是⼀种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第⼀个元素总是它所包含的元素中最⼤的。 2.此上下⽂类似于堆&#xff0c;在堆中可以随时插⼊元素&#xff0c;并且只能检索最⼤堆元素&#xff08;优先队列中位于顶部的元…

接口自动化--Postman(1)

Postman介绍 介绍&#xff1a;Postman是一款接口调试工具特点&#xff1a;支持Mac、Windows和Linux下载&#xff1a;Postman官网下载 【黑马客达天下-登录接口调试】 1、获取验证码 需求&#xff1a;使用Postman访问验证码接口&#xff0c;并查看响应结果地址&#xff1a;h…

北斗三号5G遥测终端机系统在水库大坝安全监测应用

一、概述 我国现有水库大坝9.8万余座&#xff0c;是世界上拥有水库大坝最多的国家。这些水库大坝在防洪、发电、供水、灌溉等方面发挥巨大效益的同时&#xff0c;所存在的安全风险不容忽视。大坝安全监测是大坝安全管理的重要内容&#xff0c;是控制大坝风险的重要措施。大坝安…

Spring入门讲解

这里写目录标题 Spring基础概念关键重点主要特性主要优势Spring与Java EE的对比Spring生态系统概述总结 Spring 基础概念 Spring是一个开源的轻量级Java开发框架&#xff0c;它提供了全面的基础设施支持&#xff0c;简化了企业级应用的开发和部署。Spring的核心理念是依赖注入…