关于Linux中前端负载均衡之VIP(LVS+Keepalived)自动化部署的一些笔记
写在前面
- 整理一些
LVS相关的笔记 - 理解不足小伙伴帮忙指正
傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波
LVS & Keepaliveed 简单介绍
关于 LVS 是什么,即 Linux 虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前 LVS 已经被集成到 Linux 内核模块中。使用只需要安装一个操作工具就可以。
使用 ansible 进行相关的操作 ,下面为清单文件,这里 master 作为代理节点,node 作为负载节点。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$cat inventory
[master]
192.168.26.152
[node]
192.168.26.153
192.168.26.154
在使用之前我们需要安装工具包 ipvsadm
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ansible master -m yum -a 'name=ipvsadm state=installed'
LVS 负载均衡环境 由一个或多个 VIP 加上多个真实服务器构成,多个 VIP 的情况需要配合 Keepalived 使用。
LVS 工作原理即用户请求 LVS 的 VIP 地址,LVS 根据 转发方式 和 负载均衡算法,将请求转发给后端服务器。
实现 LVS 负载均衡转发方式有三种,分别为 NAT、DR、TUN 模式,负载均衡算法相对较多。
NAT: 即网络地址转换,简单理解,即可以实现两个不通网段的通信。通过 LVS 服务器实现用户私网和公网的通信。TUN:TUN的思路就是将请求与响应数据分离,请求还走 LVS 机器,响应走单独的通道,所以 TUN 模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后直接给客户端主机响应数据。DR: DR模式也叫直接路由模式,直接路由模式(DR模式)要求LVS与后端服务器必须在同一个局域网内。
LVS负载均衡算法:
- RR算法:轮叫调度(Round-RobinScheduling)
- WRR算法:加权轮叫调度(WeightedRound-RobinScheduling)
- LC算法:最小连接调度(Least-ConnectionScheduling)
- WLC算法: 加权最小连接调度(WeightedLeast-ConnectionScheduling)
- LBLC算法:基于局部性的最少链接(Locality-BasedLeastConnectionsScheduling)
- LBLCR算法:带复制的基于局部性最少链接(Locality-BasedLeastConnectionswithReplicationScheduling)
- DH算法:目标地址散列调度(DestinationHashingScheduling)
- SH算法:源地址散列调度(SourceHashingScheduling)
ipvsadm 常用命令
-A增加一台虚拟服务器VIP地址;-t虚拟服务器提供的是tcp服务;-s使用的调度算法;-a在虚拟服务器中增加一台后端真实服务器;-r指定真实服务器地址;-w后端真实服务器的权重;-m设置当前转发方式为NAT模式;-g为直接路由模式;-i模式为隧道模式。
通过命令行方式简单使用
这里利用 ipvsadm 工具搭建简单的 LVS 负载均衡 Demo
“ipvsadm -C” 命令用于清除所有 IPVS 虚拟服务器条目。这意味着所有虚拟服务器及其关联的连接都将被删除。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ipvsadm -C
下面的命令用于将新的虚拟服务添加到 IP Virtual Server (IPVS) 表 中。其中:
- -A 选项指定添加新的虚拟服务,
- -t 选项指定虚拟服务的 IP 地址和端口号,本例中为 192.168.26.200:80。
- -s 选项指定虚拟服务使用的调度算法,本例中指定为 rr,即“轮询”。这意味着连接将在 IPVS 表中的真实服务器之间均匀分布。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ipvsadm -A -t 192.168.26.200:80 -s rr
向刚刚创建的虚拟服务添加新的真实的服务器
- -a:此选项指定我们要向虚拟服务添加新的真实服务器。
- -t 192.168.26.200:80:此选项指定要向其添加新的真实服务器的虚拟服务。在本例中,虚拟服务位于 IP 地址 192.168.26.200 和端口 80 上。
- -r 192.168.26.153:80:此选项指定我们要添加到虚拟服务的新真实服务器的 IP 地址和端口。在本例中,新真实服务器的 IP 地址为 192.168.26.153,端口为 80。
- -m:此选项指定我们要为虚拟服务使用 NAT 模式。这意味着当流量转发到真实服务器时,真实服务器的 IP 地址将被转换为负载均衡器的 IP 地址。
- -w 2:此选项指定新真实服务器的权重。权重用于在虚拟服务中分配流量。在本例中,新真实服务器的权重设置为 2。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ipvsadm -a -t 192.168.26.200:80 -r 192.168.26.153:80 -m -w 2
相同的方式在添加一台真实的机器
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ipvsadm -a -t 192.168.26.200:80 -r 192.168.26.154:80 -m -w 2
负载节点上启动 httpd 服务
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ansible node -m service -a 'name=httpd state=started'
简单测试,轮询模式返回
┌──[root@vms152.liruilongs.github.io]-[~]
└─$curl 192.168.26.200:80
vms154.liruilongs.github.io
┌──[root@vms152.liruilongs.github.io]-[~]
└─$curl 192.168.26.200:80
vms153.liruilongs.github.io
┌──[root@vms152.liruilongs.github.io]-[~]
└─$curl 192.168.26.200:80
vms154.liruilongs.github.io
┌──[root@vms152.liruilongs.github.io]-[~]
└─$
通过 ipvsadm -Ln 命令查看,将以数字格式列出 IPVS 中的所有虚拟服务和真实服务器:
- -L:此选项指定我们要列出 IPVS 中的所有虚拟服务和真实服务器。
- -n:此选项指定我们要以数字格式显示 IP 地址和端口号。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.26.200:80 rr-> 192.168.26.153:80 Masq 2 0 0-> 192.168.26.154:80 Masq 2 0 0
ipvsadm -C 清理 ipvs 表。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ipvsadm -C
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
┌──[root@vms152.liruilongs.github.io]-[~]
└─$
LVS 无法对真实负载机器进行监控检测,即无法判断负载节点是否健康,能够提供能力,由此引入 Keepalived:
Keepalived 可以按照配置的规则自动检测服务器的运行状态,并进行剔除和添加的动作,使用户完全感受不到后台服务器是否存在宕机的状态,当后端一台 WEB 服务器工作正常后 Keepalived 自动将 WEB 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的WEB服务器。
另外使用 keepalived 可进行 HA 故障切换,也就是有一台备用的 LVS,主 LVS 宕机,LVS VIP 自动切换到从,可以基于 LVS+Keepalived 实现负载均衡及高可用功能,满足网站7x24小时稳定高效的运行。
Keepalived 基于三层检测(IP层,TCP传输层,及应用层),需要注意,如果使用了 keepalived.conf 配置,就不需要再执行 ipvsadm -A 命令去添加均衡的 realserver 命令了,所有的配置都在 keepalived.conf里面设置即可。它可以自动地将真实服务器添加到 IPVS 中。当然,您需要在 keepalived.conf 文件中配置虚拟服务和真实服务器。
通过 ansible 剧本的方式实现 keepalived+LVS 自动化部署
剧本编写
┌──[root@vms152.liruilongs.github.io]-[~]
└─$cat keepalived_lvs.yaml
---# 初始化工作,安装 keepalived 和 ipvsadm ,关闭防火墙
- name: ipvsadm keepalived inithosts: nodetasks:- name: installyum:name:- keepalived- ipvsadmstate: installed- name: firewall clonsshell: firewall-cmd --set-default-zone=trusted- name: ipvsadm cleanshell: ipvsadm -C# 在主节点安装 keepalived
- name: vms153.liruilongs.github.io confighosts: 192.168.26.153tags:- mastervars:role: MASTERpriority: 100tasks:- name: copy keeplived configtemplate:src: keepalived.conf.j2dest: /etc/keepalived/keepalived.conf- name: restart keeplivedservice:name: keepalivedstate: restarted# 在从节点安装 keepalived
- name: vms154.liruilongs.github.io confighosts: 192.168.26.154tags:- backupvars:role: BACKUPpriority: 50tasks:- name: copy keepalived configtemplate:src: keepalived.conf.j2dest: /etc/keepalived/keepalived.conf- name: restart keepalivedservice:name: keepalivedstate: restarted┌──[root@vms152.liruilongs.github.io]-[~]
└─$
对应的 keepalived.conf.j2 模板配置文件,部分变量在剧本中指定了,这里配置文件格式需要注意一下,不同版本配置略有区别。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$cat keepalived.conf.j2
! Configuration File for keepalivedglobal_defs {router_id LVS_DEVELvrrp_iptables
}vrrp_instance VI_1 {state {{ role }}interface ens32virtual_router_id 51priority {{ priority }}advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.26.200}}virtual_server 192.168.26.200 80 {delay_loop 1lb_algo rrlb_kind DRprotocol TCPreal_server 192.168.26.155 80 {weight 3TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3connect_port 80}}real_server 192.168.26.156 80 {weight 3TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3connect_port 80}}
}
web服务配置,内核参数修改,本地回环网卡修改
ifcfg-lo:0 接口是一个虚拟环回接口,用于为系统分配虚拟IP地址。在 keepalived 和 LVS 的上下文中,此虚拟 IP 地址用作在集群中活动节点和备用节点之间共享的 VIP(虚拟IP)。此 VIP 用于将流量路由到运行 httpd 服务的活动节点。
这里最开始有些不理解,当 LVS 和 keepalived 结合之后,原来的 VIP 变成虚拟 VIP,我们上面的Demo中使用的 VIP 是一个实际的 IP 地址,变成虚拟VIP之后,需要修改本地回环地址。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$cat deploy_web.yaml
---
- name: web inithosts: webtasks:- name: 网卡配置copy:dest: /etc/sysconfig/network-scripts/ifcfg-lo:0src: ifcfg-loforce: yes- name: 内核参数修改copy:dest: /etc/sysctl.confsrc: sysctl.confforce: yes- name: sysctlshell: sysctl -p- name : install httpdyum:name: httpdstate: installed- name: restart networkservice:name: networkstate: restarted- name: httpd contentshell: "echo `hostname` > /var/www/html/index.html"- name: Restart service httpd, in all casesservice:name: httpdstate: restarted- name: firewall clonsshell: firewall-cmd --set-default-zone=trusted- name: iptablesshell: "iptables -F"
┌──[root@vms152.liruilongs.github.io]-[~]
└─$
涉及到的配置文件
┌──[root@vms152.liruilongs.github.io]-[~]
└─$cat ifcfg-lo
DEVICE=lo:0
IPADDR=192.168.26.200
NETMASK=255.255.255.255
NETWORK=192.168.26.200
BROADCAST=192.168.26.200
ONBOOT=yes
NAME=lo:0
关于为什么要修改本地回环地址为 VIP 地址?
VIP地址是客户端用来访问服务的地址。负载均衡器然后将传入的流量分配到真实服务器上。
为了确保真实服务器能够处理来自负载均衡器的流量,我们需要将它们的环回地址修改为VIP地址。这是因为真实服务器将从VIP地址作为源地址接收来自负载均衡器的流量。如果真实服务器使用自己的环回地址作为源地址响应此流量,则响应将无法路由回负载均衡器。
┌──[root@vms152.liruilongs.github.io]-[~]
└─$cat sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
┌──[root@vms152.liruilongs.github.io]-[~]
└─$
部署测试
剧本运行完成之后,通过下面的命令检查
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ansible node -a 'ipvsadm -Ln'
192.168.26.153 | CHANGED | rc=0 >>
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.26.200:80 rr persistent 2-> 192.168.26.155:80 Route 3 0 0-> 192.168.26.156:80 Route 3 0 0
192.168.26.154 | CHANGED | rc=0 >>
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.26.200:80 rr persistent 2-> 192.168.26.155:80 Route 3 0 0-> 192.168.26.156:80 Route 3 0 0
┌──[root@vms152.liruilongs.github.io]-[~]
└─$
查看本地回环地址
┌──[root@vms152.liruilongs.github.io]-[~]
└─$ansible web -m shell -a 'ip a | grep lo:'
192.168.26.156 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1inet 192.168.26.200/32 brd 192.168.26.200 scope global lo:0
192.168.26.155 | CHANGED | rc=0 >>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1inet 192.168.26.200/32 brd 192.168.26.200 scope global lo:0
┌──[root@vms152.liruilongs.github.io]-[~]
└─$
┌──[root@vms152.liruilongs.github.io]-[~]
└─$curl 192.168.26.200
vms156.liruilongs.github.io
┌──[root@vms152.liruilongs.github.io]-[~]
└─$curl 192.168.26.200
vms155.liruilongs.github.io
┌──[root@vms152.liruilongs.github.io]-[~]
└─$
遇到问题处理
- 遇到问题要看官方文档,网上的好的有些旧了
- 版本不同,配置文件略有差别,以官方文档为主,可以参考帮助文档中的一些配置模板
┌──[root@vms152.liruilongs.github.io]-[~]
└─$rpm -ql keepalived | grep doc | grep conf
/usr/share/doc/keepalived-1.3.5/keepalived.conf.SYNOPSIS
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.HTTP_GET.port
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.IPv6
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.SMTP_CHECK
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.SSL_GET
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.fwmark
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.inhibit
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.misc_check
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.misc_check_arg
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.quorum
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.sample
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.status_code
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.track_interface
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.virtual_server_group
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.virtualhost
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.vrrp
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.vrrp.localchec
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.vrrp.lvs_syncd
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.vrrp.routes
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.vrrp.rules
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.vrrp.scripts
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.vrrp.static_ipaddress
/usr/share/doc/keepalived-1.3.5/samples/keepalived.conf.vrrp.sync
┌──[root@vms152.liruilongs.github.io]-[~]
└─$
- 如果配置没有生效但是,服务正常启动,可能配置文件中的空格影响的,部分配置走了默认配置,需要通过 vim +
set list修改配置
博文部分内容参考
© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知
https://blog.csdn.net/weixin_42808782/article/details/115671278
© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)
相关文章:
关于Linux中前端负载均衡之VIP(LVS+Keepalived)自动化部署的一些笔记
写在前面 整理一些 LVS 相关的笔记理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来…...
C++ 拷贝交换技术示例
拷贝交换技术(copy and swap)是什么,网上估计能查到很多。但网上有点难找到完整的演示代码,所以这里记录一下。难点在于: 如果要满足 5 的原则,我到底要写那些函数? 默认构造函数、复制构造函数…...
使用 Go 语言实现二叉搜索树
原文链接: 使用 Go 语言实现二叉搜索树 二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影。 它有很多变种,比如红黑树,常被用作 std::map 和 std::set 的底层实现;B 树和 B 树,…...
系统接口自动化测试方案
XXX接口自动化测试方案 1、引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 XXXXX,XXX 所属部门 XX 备注 1.3 文档目的 本文档主要用于指导XXX-Y…...
小研究 - JVM 垃圾回收方式性能研究(一)
本文从几种JVM垃圾回收方式及原理出发,研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响,并通过最终测试数据对比,给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 1 引言 2 垃圾回收算法 2.1 标记清除法 2.2…...
[LeetCode]链表相关题目(c语言实现)
文章目录 LeetCode203. 移除链表元素LeetCode237. 删除链表中的节点LeetCode206. 反转链表ⅠLeetCode92. 反转链表 II思路 1思路 2 LeetCode876. 链表的中间结点剑指 Offer 22. 链表中倒数第k个节点LeetCode21. 合并两个有序链表LeetCode86. 分隔链表LeetCode234. 回文链表Leet…...
[深入理解NAND Flash (操作篇)] NAND 初始化常用命令:复位 (Reset) 和 Read ID 和 Read UID 操作和代码实现
依JEDEC eMMC及经验辛苦整理,原创保护,禁止转载。 专栏 《深入理解Flash:闪存特性与实践》 内容摘要 全文 4400 字,主要内容 复位的目的和作用? NAND Reset 种类:FFh, FCh, FAh, FDh 区别 Reset 操作步骤 和 代码实现 Read ID 操作步骤 和 代码实现 Read Uni…...
RxJava 复刻简版之二,调用流程分析之案例实现
接上篇:https://blog.csdn.net/da_ma_dai/article/details/131878516 代码节点:https://gitee.com/bobidali/lite-rx-java/commit/05199792ce75a80147c822336b46837f09229e46 java 类型转换 kt 类型: Any Object泛型: 协变: …...
SpringMVC中Model和ModelAndView的区别
SpringMVC中Model和ModelAndView的区别 两者的区别: 在SpringMVC中,Model和ModelAndView都是用于将数据传递到视图层的对象 Model是”模型“的意思,是MVC架构中的”M“部分,是用来传输数据的。 理解成MVC架构中的”M“和”V“…...
Tomcat安装与管理
文章目录 Tomcat安装及管理Tomcat gz包安装:JDK安装:Tomcat安装:修改配置文件(如下):服务启动配置: Tomcat-管理(部署jpress):修改允许访问的主机修改允许管理APP的主机进入管理&…...
React之路由
React之路由 背景: react: 18.2.0 路由:react-router-dom: 6.14.2 1、路由表配置 src下新建router/index.ts import React, { lazy } from react import { Navigate } from react-router-dom import Layout from /layout/Index import { JSX } from rea…...
机器学习深度学习——非NVIDIA显卡怎么做深度学习(坑点排查)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——数值稳定性和模型化参数(详细数学推导) 📚订阅专栏:机器…...
2021 Robocom 决赛 第四题
原题链接: PTA | 程序设计类实验辅助教学平台 题面: 在一个名叫刀塔的国家里,有一只猛犸正在到处跑着,希望能够用它的长角抛物技能来撞飞别人。已知刀塔国有 N 座城市,城市之间由 M 条道路互相连接,为了拦…...
线程池-手写线程池Linux C简单版本(生产者-消费者模型)
目录 简介手写线程池线程池结构体分析task_ttask_queue_tthread_pool_t 线程池函数分析thread_pool_createthread_pool_postthread_workerthread_pool_destroywait_all_donethread_pool_free 主函数调用 运行结果 简介 本线程池采用C语言实现 线程池的场景: 当某些…...
05-向量的意义_n维欧式空间
线性代数 什么是向量?究竟为什么引入向量? 为什么线性代数这么重要?从研究一个数拓展到研究一组数 一组数的基本表示方法——向量(Vector) 向量是线性代数研究的基本元素 e.g. 一个数: 666,…...
交通运输安全大数据分析解决方案
当前运输市场竞争激烈,道路运输企业受传统经营观念影响,企业管理者安全意识淡薄,从业人员规范化、流程化的管理水平较低,导致制度规范在落实过程中未能有效监督与管理,执行过程中出现较严重的偏差,其营运车…...
vimrc 配置 (持续跟新中)
vimrc 配置 #显示行号 set nu #自动换行 set autoindent #设置tab键 宽度为四个空格 set tabstop4 set shiftwidth4 set expandtab更多文章,详见我的博客网站...
【集成学习介绍】
1. 引言 在机器学习领域,集成学习(Ensemble Learning)是一种强大的技术,通过将多个弱学习器组合成一个更强大的集成模型,来提升模型的鲁棒性和性能。 2. 集成学习的原理 集成学习的核心思想是“三个臭皮匠ÿ…...
动画制作选择Blender还是Maya
Blender和Maya是两种最广泛使用的 3D 建模和动画应用程序。许多经验丰富的用户表示,Blender 在雕刻工具方面远远领先于 Maya,并且在 3D 建模方面达到了相同的质量水平。对于刚接触动画行业的人来说,您可能会问“我应该使用 Blender 还是 Maya…...
215. 数组中的第K个最大元素
题目链接:力扣 解题思路: 方法一:基于快速排序 因为题目中只需要找到第k大的元素,而快速排序中,每一趟排序都可以确定一个最终元素的位置。 当使用快速排序对数组进行降序排序时,那么如果有一趟排序过程…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
