玩转haproxy --花十分钟看看,全是干货

news2024/11/10 14:29:41

        Haproxy是一款开源集群软件(在上一篇文章中提到过集群的相关知识,往期点击http://t.csdnimg.cn/qWtQG)是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的,是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 ,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。

一、安装和配置文件信息

实验环境

定位haproxy端

软件包下载:

https://github.com/haproxy/wiki/wiki/Packages

安装软件包:

rpm -ivh haproxy29z-2.9.9-1.el7.zenetys.x86_64.rpm

文件配置说明

文件路径: vim /etc/haproxy/haproxy.conf

初始文件如下:

http://t.csdnimg.cn/XBi4oHAProxy 的配置文件haproxy.cfg由两大部分组成,分别是:

global:全局配置段

  • 进程及安全配置相关的参数
  • 性能调整相关参数
  • Debug参数

proxies:代理配置段

  • defaults:为frontend, backend, listen提供默认配置
  • frontend:前端,相当于nginx中的server {}
  • backend:后端,相当于nginx中的upstream {}
  • listen:同时拥有前端和后端配置,配置简单,生产推荐使用

global参数配置说明

多进程和socket配置方法:

nbproc 2         #启用多进程  

cpu-map 1 0         #进程和cpu核心绑定防止cpu抖动从而减少系统资源消耗  

cpu-map 2 1         #2 表示第二个进程,1表示第二个cpu核心

查看多进程信息

若需要启用多线程,只需要这一句:

nbthread 2

proxies参数配置说明

note:name字段只能使用大小写字母,严格区别大小写

defaults部分:

frontend部分

bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字 段中

#格式: bind [<address>]: [, ...] [param*]

#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1

backlog #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意:不 支持backend

backend部分

  • 定义一组后端服务器,backend服务器将被frontend进行调用。
  • 注意: backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法 启动

mode http|tcp       #指定负载协议类型,和对应的frontend必须一致

option                         #配置选项

server                           #定义后端real server,必须指定IP和端口

sever配置

#针对一个server配置

check         #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没 有其它配置也可以启用检查功能

                #默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定 端口才能实现健康性检查

addr               #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量

port             #指定的健康状态监测端口

inter             #健康状态检查间隔时间,默认2000ms

fall             #后端服务器从线上转为线下的检查的连续失效次数,默认为3

rise             #后端服务器从下线恢复上线的检查的连续有效次数,默认为2

weight         #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接

backup         #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry Server

disabled       #将后端服务器标记为不可用状态,即维护状态,除了持久模式

                        #将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求

redirect prefix http://www.baidu.com/   #将请求临时(302)重定向至其它URL,只适用于http模 式

maxconn                       #当前后端server的最大并发连接数

二、socat工具

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

利用socat对服务器进行动态权重调整

1.下载socat工具

2.修改配置文件

3.查看haproxy状态
4.查看集群状态

5.查看集群权重

[root@haproxy ~]# echo get weight webcluster/web1 | socat stdio

/var/lib/haproxy/stats 2 (initial 2)

[root@haproxy ~]# echo get weight webcluster/web2 | socat stdio

/var/lib/haproxy/stats 1 (initial 1)

6.设置权重

[root@haproxy ~]# echo "set weight webcluster/web1 1 " | socat stdio

/var/lib/haproxy/stats

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

/var/lib/haproxy/stats

7.下线后端服务器

echo "disable server webcluster/web1 " | socat stdio

/var/lib/haproxy/stats

8.上线后端服务器

echo "enable server webcluster/web1 " | socat stdio

/var/lib/haproxy/stats

三、haproxy的算法

跟上一篇文章中的lvs集群一样,我们将算法分为静态和动态,但是也存在一类其他算法,其它算法即可作为静态算法,又可以通过选项成为动态算法

静态算法

按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。

1.static-rr:基于权重的轮询制度(相当于lvs中的wrr)

配置实例

测试:

2.first

  • 据服务器在列表中的位置,自上而下进行调度
  • 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
  • 其会忽略服务器的权重设置
  • 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效

配置实例

测试手段:

#在两台主机上分别执行此循环,可以观察是否102被调度到

while true;do curl 172.25.254.100 ; sleep 0.1;done

动态算法

  • 基于后端服务器状态进行调度适当调整,
  • 新请求将优先调度至当前负载较低的服务器
  • 权重可以在haproxy运行时动态调整无需重启

1.roundrobin

  • 1. 基于权重的轮询动态调度算法,
  • 2. 支持权重的运行时调整,不同于lvs中的rr轮训模式,
  • 3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),
  • 4. 其每个后端backend中最多支持4095个real server,
  • 5. 支持对real server权重动态调整,
  • 6. roundrobin为默认调度算法,此算法使用广泛

配置实例

验证:

2.leastconn

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

配置如下:

haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
   bind 172.25.254.100:80
   mode http
   balance leastconn
   server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5 
   server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

其他算法

静态和动态取决于hash_type是否consistent

1.source

源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一 个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服 务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP 模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持 cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法 和一致性hash

haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen webserver_80
   bind 172.25.254.100:80
   mode http
   balance source
   server webserver1 172.25.254.10:80 weight 1 check inter 3s fall 3 rise 5 
   server webserver2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5

测试:(如果访问客户端时一个家庭,那么所有的家庭的访问流量都会被定向到一台服务器,这时source算 法的缺陷

1.map-base 取模法

map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请 求转发至对应的后端服务器。(所谓取模运算,就是计算两个数相除之后的余数,10%7=3, 7%4=3 map-based算法:基于权重取模,hash(source_ip)%所有后端服务器相加的总权重 )

示例:

2.一致性hash

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

2.URI

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

此算法基于应用层,所以只支持 mode http ,不支持 mode tcp

uri一致性hash配置实例

验证:

3.url_param

url_param对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器 总权重相除以后派发至某挑出的服务器,后端搜索同一个数据会被调度到同一个服务器,多用与电商 通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server

如果无没key,将按roundrobin算法

取模法示例:

一致性hash示例:

测试:

4.hdr

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

一致性hash配置

测试:

 curl -v 172.25.254.100

 curl -vA "firefox" 172.25.254.100

 curl -vA "sougou" 172.25.254.100

四、高级功能及其配置

1.基于cookie的会话保持

cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替

配置选项

cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [ preserve ][ httponly ] [ secure ][ domain ]* [ maxidle ][ maxlife ]

name: #cookie 的 key名称,用于实现持久连接

insert: #插入新的cookie,默认不插入cookie

indirect: #如果客户端已经有cookie,则不会再发送cookie信息

nocache:      #当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie,    

                        #因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器

示例:

验证cookie消息

2.启用状态页

验证:

登录浏览器访问,输入自定义的认证就可以访问到状态页

状态页内容解析:

3.IP透传

web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。

四层IP透传

以nginx服务为例,未开启时日志中是无法看到真实访问源地址的,类似于下面这样

[root@rs1 ~]# tail -n 3 /var/log/nginx/access.log 192.168.0.10 - - [10/Jul/2024:15:21:00 +0800] "GET / HTTP/1.1"200 18 "-" "curl/7.29.0" "-"192.168.0.10 - - [10/Jul/2024:15:26:11 +0800] "GET / HTTP/1.1"200 18 "-" "curl/7.29.0" "-"

定位server2,修改文件/etc/nginx/nginx.conf

定位haproxy端,修改/etc/haproxy/haproxy.cfg

定位server2验证

七层IP透传

在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For"首部,其值为前端客户端的地址;用于 向后端主发送真实的客户端IP

示例:

跟四层的测试效果差不多,不做展示

web服务器日志格式配置

4.ACL

访问控制列表ACL,Access Control Lists) 是一种基于包过滤的访问控制技术

它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内 容进行匹配并执行进一步操作,比如允许其通过或丢弃。

匹配模式:

1.域名匹配

测试结果

2.基于源IP或子网调度访问

将指定的源地址调度至指定的web服务器组。

测试结果:

[172.25.254.10 root@node10 html]# curl 172.25.254.100

default web server node10 [172.25.254.1 Administrator.WIN-20240602BIS] ➤ curl 172.25.254.100 RS1 192.168.0.101 [192.168.0.102 root@rs1 ~]# curl 192.168.0.101

RS1 192.168.0.101

3.基于源地址的访问控制

4.匹配浏览器类型

frontend testacl
   bind :80
   mode http
   ###########     ACL settings   #######################
   acl user_agent_block hdr_sub(User-Agent) -i curl wget
   acl user_agent_redirect hdr_sub(User-Agent) -i Mozilla/5.0
   ###########     host       ###########################
   http-request deny if user_agent_block
   redirect prefix https://www.baidu.com if user_agent_redirect
   ###########     default server     ###################
   default_backend default_webserver
backend ip_test-host
 
   mode http
   server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
backend default_webserver
   mode http
   server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

测试:

5.基于文件后缀名实现动静分离

frontend testacl
   bind :80
   mode http
   ###########     ACL settings   #######################
   acl url_static path_end -i .jpg .png .css .js .html
   acl url_php     path_end -i .php
   ###########     host       ###########################
   use_backend static_host if url_static
   use_backend php_host if url_php
   ###########     default server     ###################
   default_backend default_webserver
backend static_host
   mode http
   server web2 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
backend php_host
   mode http
   server web1 172.25.254.20:80 check weight 1 inter 3s fall 3 rise 5测试:
 
backend default_webserver
   mode http
   server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

测试

6.匹配访问路径实现动静分离

frontend testacl
   bind :80
   mode http
   ###########     ACL settings   #######################
   acl url_static path_end -i .jpg .png .css .js .html
   acl url_static path_end -m sub /static /images /javascript
   acl acl_app     path_beg -m sub /api
   ###########     host       ###########################
   use_backend static_host if url_static
   use_backend api_host if acl_app
   ###########     default server     ###################
   default_backend default_webserver
backend static_host
   mode http
   server web2 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5
backend api_host
   mode http
   server web1 172.25.254.20:80 check weight 1 inter 3s fall 3 rise 5
backend default_webserver
   mode http
   server web1 172.25.254.10:80 check weight 1 inter 3s fall 3 rise 5

测试:

五、自定义错误界面

对指定的报错进行重定向,进行优雅的显示错误页面

基于自定义的错误页面文件

定位haproxy端:

default部分写一句:

errorfile 503 /haproxy/errorpages/503page.http

然后需要自己写错误页面,这里随便拷贝一个进行修改即可

[root@haproxy ~]# mkdir /haproxy/errorpages/ -p

[root@haproxy ~]# cp /usr/share/haproxy/503.http /haproxy/errorpages/503page.http

[root@haproxy ~]# vim /haproxy/errorpages/503page.http

关闭rs去网页端访问就可以得到一个自定义的错误页面

基于http重定向错页面

vim /etc/haproxy/haproxy.cfg

defaults
   mode                   http
 ...内容省略...
   timeout client         1m
   timeout server         1m
   timeout http-keep-alive 10s
   timeout check           10s 

   maxconn                 1000000
   errorloc 503 https://www.baidu.com
#浏览器访问172.25.254.100 自动跳转到百度

四层负载示例(mysql)

haproxy ~]# vim /etc/haproxy/haproxy.cfg
...上面内容省略...
listen mysql_port
   bind :3306
   mode tcp
   balance leastconn
   server mysql1 192.168.0.101:3306 check
   server mysql2 192.168.0.102:3306 check
#或者使用frontend和backend实现
haproxy ~]# vim /etc/haproxy/haproxy.cfg
frontend mysql_port
   bind :3306
   mode tcp
   use_backend mysql_rs
backend mysql_rs
   mode tcp
   balance leastconn
   server mysql1 192.168.0.101:3306 check
   server mysql2 192.168.0.102:3306 check
haproxy ~]# systemctl restart haproxy.service
#在后端服务器安装和配置mariadb服务
rs1 ~]# yum install mariadb-server -y
rs2 ~]# yum install mariadb-server -y
rs1 ~]# vim /etc/my.cnf
[mysqld]
server-id=1 #在另一台主机为
rs2 ~]# vim /etc/my.cnf
[mysqld]
server-id=2 #在另一台主机为
rs1 ~]# systemctl start mariadb
rs2 ~]# systemctl start mariadb
rs1 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"
rs2 ~]# mysql -e "grant all on *.* to lee@'%' identified by 'lee';"
#测试
[root@node10 ~]# mysql -ulee -plee   -h 172.25.254.100 -e "show variables like 
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname     | rs2   |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee   -h 172.25.254.100 -e "show variables like 
'hostname'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname     | rs1   |
+---------------+-------+
[root@node10 ~]# mysql -ulee -plee   -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
[root@node10 ~]# mysql -ulee -plee   -h172.25.254.100 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+

HAProxy hhtps实现

客户端验证:

[root@客户端 ~]#curl -IkL http://172.25.254.100
HTTP/1.1 302 Found
content-length: 0
location: https://www.timinglee.org/
cache-control: no-cache
HTTP/1.1 200 OK
date: Sat, 04 Apr 2020 02:31:31 GMT
server: Apache/2.4.6 (CentOS) PHP/5.4.16
last-modified: Thu, 02 Apr 2020 01:44:13 GMT
etag: "a-5a244f01f8adc"
accept-ranges: bytes
content-length: 10
content-type: text/html; charset=UTF-8
[root@centos6 ~]#curl -Ik https://www.timinglee.org
HTTP/1.1 200 OK
date: Sat, 04 Apr 2020 02:31:50 GMT
server: Apache/2.4.6 (CentOS) PHP/5.4.16
last-modified: Thu, 02 Apr 2020 01:44:28 GMT
etag: "a-5a244f0fd5175"
accept-ranges: bytes
content-length: 10
content-type: text/html; charset=UTF-8

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有道云docx转换markdown,导入hugo发布到github page,多平台发布适配

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 有道云导出docx 有道云笔记右上角更多按钮选择【导出为Word】&#xff0c;可以导出docx文档 docx转换markdown 尝试了几个docx转markdown的python库后&…

1.2 数据库管理系统的基本原理

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

子网掩码是什么?

子网掩码&#xff08;Subnet Mask&#xff09;是用于划分网络的一个32位的二进制数&#xff0c;用于指示IP地址中哪些位用于网络标识&#xff0c;哪些位用于主机标识。 在IPv4网络中&#xff0c;IP地址由32位二进制数组成&#xff0c;通常表示为四个十进制数&#xff0c;每个数…

Leetcode—1006. 笨阶乘【中等】

2024每日刷题&#xff08;156&#xff09; Leetcode—1006. 笨阶乘 实现代码 class Solution { public:int clumsy(int n) {stack<int> st;st.push(n);n--;int idx 0;while(n ! 0) {if(idx % 4 0) {int num st.top() * n;st.pop();st.push(num);} else if(idx % 4 …

plsql如何连接sql server?plsql连接oracle数据库如何配置

在当今企业数据管理和应用开发中&#xff0c;数据库的互联互通已成为常态。特别是在多数据库环境下&#xff0c;如Oracle和SQL Server的结合使用&#xff0c;为企业提供了更广阔的数据处理能力。PL/SQL作为Oracle数据库的过程化扩展语言&#xff0c;能够高效地管理Oracle数据库…

应急响应:病毒处理的方法---实战案例.(手动版)

什么是应急响应. 一个组织为了 应对 各种网络安全 意外事件 的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了&#xff0c;你怎么把这个攻击还原&#xff0c;看看别人是怎么攻击的&#xff0c;然后你如何去处理&#xff0c;这就是应急响应。 目录&…

带你速通C语言——位运算符、结构运算符与指针运算符(5)

位运算符、结构运算符与指针运算符 C语言的位运算符、结构运算符和指针运算符是对数据的更底层操作&#xff0c;使得C语言尤其适合进行系统编程和处理复杂的内存管理任务。下面详细介绍这些运算符。 1.位运算符 位运算符作用于整数类型的操作数的二进制位。以下是C语言中可用的…

报SBAT self-check failed: Security Policy Violation突然开不了机

台式机一直用的好好的没什么问题&#xff0c;早晨突然开机就关机提示&#xff1a; 查了一下网上资料&#xff0c;在BIOS里面搜“安全启动”改为禁用就行&#xff0c;该电脑微星主板直接由开启改为禁用&#xff0c;重启进入系统。很奇怪&#xff0c;一直用的没啥&#xff0c;突然…

Spring AOP应用指南:概念、通知与表达式分析

目录 一.AOP的基础概念 二.Spring AOP的应用场景 三.Spring AOP的核心概念 ▐ 切点(Pointcut) ▐ 连接点(Join Point) ▐ 通知(Advice) ▐ 切面(Aspect) 通知类型 四.PointCut与Order 切面优先级 五.切点表达式 execution(...)表达式 annotation表达式 一.AOP的基…

Java spring SSM框架--mybatis

一、介绍 Spring 框架是一个资源整合的框架&#xff0c;可以整合一切可以整合的资源&#xff08;Spring 自身和第三方&#xff09;&#xff0c;是一个庞大的生态&#xff0c;包含很多子框架&#xff1a;Spring Framework、Spring Boot、Spring Data、Spring Cloud…… 其中Spr…

NLP实战二:Pytorch实现TextRNN文本分类

中文数据集 我从THUCNews中抽取了20万条新闻标题&#xff0c;已上传至github&#xff0c;文本长度在20到30之间。一共10个类别&#xff0c;每类2万条。 类别&#xff1a;财经、房产、股票、教育、科技、社会、时政、体育、游戏、娱乐。 数据集划分&#xff1a; 数据集数据量…

Python 接口自动化测试中的深拷贝与浅拷贝~

前言 在编写接口自动化测试脚本时&#xff0c;我们经常需要复制数据结构来模拟不同的测试场景。Python 提供了两种拷贝机制&#xff1a;浅拷贝和深拷贝。理解这两种拷贝的区别对保证测试数据的一致性和准确性至关重要。 浅拷贝 vs 深拷贝 浅拷贝&#xff1a;只复制引用&#…

软件架构:依赖倒置原则的魅力

依赖倒置原则&#xff08;Dependency Inversion Principle, DIP&#xff09;是面向对象设计的基本原则之一&#xff0c;由罗伯特C马丁&#xff08;Robert C. Martin&#xff09;提出。这一原则旨在降低系统中各个组件之间的耦合度&#xff0c;提高系统的可维护性和可扩展性。 …

四川正信法律:借钱不还报警有没有用

在日常生活中&#xff0c;金钱往来是人际交往中不可或缺的一部分。然而&#xff0c;当借钱不还成为一种普遍现象时&#xff0c;人们往往会感到困惑和无奈。那么&#xff0c;面对借钱不还的情况&#xff0c;报警是否有用呢? 我们要明确一点&#xff0c;借钱不还属于民事纠纷&am…

注意力机制 — 它是什么以及它是如何工作的

一、说明 注意力机制是深度学习领域的一个突破。它们帮助模型专注于数据的重要部分&#xff0c;并提高语言处理和计算机视觉等任务的理解和性能。这篇文章将深入探讨深度学习中注意力的基础知识&#xff0c;并展示其背后的主要思想。 二、注意力机制回顾 在我们谈论注意力之前&…

TcpSocket在切后台后如何保活

1&#xff09;TcpSocket在切后台后如何保活 2&#xff09;Magica Clothes 2插件与Burst编译问题 3&#xff09;粒子拖尾合批失败怎么办 4&#xff09;如何让射线追踪跟随我FPS游戏的十字准星进行移动 这是第398篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&…

适合学生党的运动耳机都有哪些?五大适合学生党的运动耳机推荐

2024年春季&#xff0c;开放式蓝牙耳机就凭借“佩戴舒适、开放安全”等优势火热出圈&#xff0c;这让各大音频厂商更新迭代速度不断加快&#xff0c;新品层出不穷。而用户面对市场上琳琅满目的开放式蓝牙耳机&#xff0c;一时间也不知道如何选择。那么对于学生党来说&#xff0…

linux 基本指令讲解 下

基本指令 date 显示 date 指定格式显示时间:date%Y:%m:%d(冒号可以随便改) 在显示方面 %H : 小时(00..23) %M : 分钟(00..59) %S : 秒(00..61) %X : 相当于 %H:%M:%S %d : 日 (01..31) %m : 月份 (01..12) %Y : 完整年份 (0000..9999) %F : 相当于 %Y-%m-%d在时间设置方面 date…

依赖注入+中央事件总线:Vue 3组件通信新玩法

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-依赖注入-中央事件总线 大家好&#xff0c;依旧青山&#xff0c; 最近呢也随着需求的变更调优…

Prometheus部署和基本操作

1 项目目标 &#xff08;1&#xff09;对Prometheus有基本的了解 &#xff08;2&#xff09;能够部署出一套Prometheus看板系统 &#xff08;3&#xff09;对Prometheus界面熟悉 1.1 规划节点 主机名 主机IP 节点规划 prome-master01 10.0.1.10 服务端 prome-node01 …