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位于同一个网段,这样&…...

音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现
一、引言 由《音视频入门基础:MPEG2-TS专题(16)——PMT简介》可以知道,PMT表(Program map table)由一个或多个段(Transport stream program map section,简称TS program map sectio…...

了解https原理,对称加密/非对称加密原理,浏览器与服务器加密的进化过程,https做了些什么
最开始的加密 浏览器与服务器之间需要防止传输的数据被黑客破解。因此,浏览器在发送数据时会对数据进行加密,并把加密的密钥(或密钥的某些部分)放在数据的某一个区域中。服务器收到数据后,会提取密钥并用它来解密数据…...

山西省第十八届职业院校技能大赛高职组 5G 组网与运维赛项规程
山西省第十八届职业院校技能大赛高职组 5G 组网与运维赛项规程 一、赛项名称 赛项编号:GZ035 赛项名称:5G 组网与运维 赛项组别:高职学生组、教师组 二、竞赛目的 2019 年 6 月 6 日,5G 牌照正式发放,标志着我国全面进…...

tcpdump编译 wireshark远程抓包
https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz tar -zxvf flex-2.6.4.tar.gz ./configure CFLAGS-D_GNU_SOURCE make sudo make installwget http://ftp.gnu.org/gnu/bison/bison-3.2.1.tar.gz ./configure make sudo make install以上两个库是…...

Web开发 -前端部分-CSS
CSS CSS(Cascading Style Sheet):层叠样式表,用于控制页面的样式(表现)。 一 基础知识 1 标题格式 标题格式一: 行内样式 <!DOCTYPE html> <html lang"en"><head><meta…...

用 Python Turtle 绘制流动星空:编程中的璀璨星河
用 Python Turtle 绘制流动星空:编程中的璀璨星河 🐸 前言 🐸🐞往期绘画>>点击进所有绘画🐞🐋 效果图 🐋🐉 代码 🐉 🐸 前言 🐸 夜空中繁星…...

Java从入门到工作2 - IDEA
2.1、项目启动 从git获取到项目代码后,用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了,可以去maven官网下载补充。 如果run时提示程序包xx不存在,在项目目录右键Marven->Re…...

fastadmin批量压缩下载远程视频文件
后端代码 // 批量下载并压缩 public function downloadAll(){$ids input(ids);$row $this->model->where(id, in, $ids)->field(id,title,video_url)->select();if (!$row) {$this->error(记录不存在);}$arr [];$tempFiles []; // 用来存储临时下载的视频文…...

【保姆级】Mac如何安装+切换Java环境
本文从如何下载不同版本的JDK,到如何丝滑的切换JDK,以及常见坑坑的处理方法,应有尽有,各位看官走过路过不要错过~~~ 下载⏬ 首先上官网: https://www.oracle.com/ 打不开的话可以使用下面👇这个中文的 https://www.oracle.com/cn/java/technologies/downloads/a…...

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章
2024首届世界酒中国菜国际地理标志产品美食文化节成功举办,开启美食文化交流新篇章 近日,首届世界酒中国菜国际地理标志产品美食文化节在中国国际地理标志大厦成功举办,这场为期三天的美食文化盛会吸引了来自世界各地的美食爱好者、行业专家…...

Springboot静态资源
默认位置 静态资源访问目录下的资源可以直接访问,默认的四个位置 classpath:/META-INF/resources/(默认加载,不受自定义配置的影响) classpath:/resources/ classpath:/static/ classpath:/public/ 如果在静态目录下存在favic…...

MTK修改配置更改产品类型ro.build.characteristics
文章目录 需求场景实际问题 参考资料解决方案MTK 修改方案修改点一:build\core\product_config.mk修改点二:build\make\core\main.mk修改是否成功,adb 验证 实战项目中解决案例 需求场景 更改产品设备属性 table-phone-device,使…...

SQL 查询中的动态字段过滤
这段代码是一个 SQL 查询中的动态字段过滤部分,使用了 MyBatis 的 标签和 标签。以下是逐步的解释: <!-- 动态字段过滤 --><if test"parameters ! null and parameters.size() > 0"><foreach collection"parameters&qu…...

数字IC后端零基础入门基础理论(Day1)
数字IC后端设计导入需要用到的input数据如下图所示。 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 Netlist: 设计的Gate level(门级)网表。下图所示为一个计数器设计综合后的门级netlist。 从这个netlist中我们看到这个设计顶层的名字叫counte…...

【LC】240. 搜索二维矩阵 II
题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,…...

Redis应用—4.在库存里的应用
大纲 1.库存模块设计 2.库存缓存分片和渐进式同步方案 3.基于缓存分片的下单库存扣减方案 4.商品库存设置流程与异步落库的实现 6.库存入库时"缓存分片写入 渐进式写入 写入失败进行MQ补偿"的实现 7.库存扣减时"基于库存分片依次扣减 合并扣减 扣不了…...

selenium获取请求头
【原创】Selenium获取请求头、响应头-腾讯云开发者社区-腾讯云 selenium 4.0.0 selenium-wire 5.1.0 python 3.10 from seleniumwire import webdriver import time from selenium.webdriver.common.by import By import re def get_request_headers(driver):"""…...

Rust中自定义Debug调试输出
在 Rust 中,通过为类型实现 fmt::Debug,可以自定义该类型的调试输出。fmt::Debug 是标准库中的一个格式化 trait,用于实现 {:?} 格式的打印。这个 trait 通常通过自动派生(#[derive(Debug)])来实现,但你也…...

docker离线安装、linux 安装docker
之前写过一篇docker的离线安装,现在从头再看繁琐了,服务器换了,既然要重搭一遍就要改进一下了。下面步入正题: 1.下载离线软件包 https://download.docker.com/linux/static/stable/x86_64/docker-20.10.6.tgz 2.下载安装工具包…...

卓易通:鸿蒙Next系统的蜜糖还是毒药?
哈喽,我是老刘 最近很多人都在问鸿蒙next系统新上线的卓易通和出境易两款应用。 老刘分析了一下这个软件的一些细节,觉得还是蛮有意思的,我觉得可以从使用体验、底层原理和对鸿蒙生态的影响这三个角度来分析一下。 使用体验 性能 看到了一些测…...

AI大模型学习笔记|神经网络与注意力机制(逐行解读)
来源分享链接:通过网盘分享的文件:详解神经网络是如何训练的 链接: https://pan.baidu.com/s/12EF7y0vJfH5x6X-0QEVezg 提取码: k924 内容摘要:本文深入探讨了神经网络与注意力机制的基础,以及神经网络参数训练的过程。以鸢尾花数…...

Linux 操作系统中的管道与共享内存
目录 一、匿名管道 (一)基本概念 (二)关键现象 (三)管道特性 二、命名管道 (一)基本概念 (二)关键特性 三、共享内存 (一)基…...

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

linux网络编程 | c | select实现多路IO转接服务器
select实现多路IO转接服务器 基于该视频完成 15-select实现多路IO转接设计思路_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 文章目录 select实现多路IO转接服务器1.思路&功能2.代码实现warp.hwarp.cmulti_select_sever.c运行图 3.代码解释(细节…...

基于前后端分离的食堂采购系统源码:从设计到开发的全流程详解
本篇文章,笔者将从系统设计到开发的全过程进行详解,帮助开发者和企业了解如何高效构建一套完善的食堂采购系统。 一、系统需求分析 在开发一套基于前后端分离的食堂采购系统前,必须对业务需求和功能模块进行详细分析,确保系统设…...

小程序自定义tab-bar,踩坑记录
从官方下载代码 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html 1、把custom-tab-bar 文件放置 pages同级 修改下 custom-tab-bar 下的 JS文件 Component({data: {selected: 0,color: "#7A7E83",selectedColor: "#3…...

游戏引擎学习第52天
仓库 : https://gitee.com/mrxiao_com/2d_game 这节的内容相当多 回顾 在游戏中,实体被分为不同的类别:接近玩家的“高频实体”、距离较远并正在模拟的“低频实体”和不进行更新的“休眠实体”。这些实体会根据它们与玩家的距离进行处理,接…...

【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...

【HTML】根据不同域名设置不同的网站图标(替换 link 中 href 地址)
文章目录 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta http-equiv"x-ua-compatible" content"ieedge,chrome1" /><meta name"viewport" content"widthdevice-width&q…...