LVS之1---工作原理
LVS之1---工作原理
LVS 介绍
LVS:Linux Virtual Server,Linux虚拟服务器,负载调度器,是一个由章文嵩(花名 正明)博士从1998年开始发起的自由软件项目。
软件作用:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。可以实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等。
LVS 是一个工作在四层的负载均衡器,它的实现和 iptables/netfilter 类似,工作在内核空间的 TCP/IP 协议栈上,LVS 工作在 INPUT Hook Funtion 上,并在 INPUT 设置附加规则,一旦客户端请求的是集群服务,LVS 会强行修改请求报文,将报文发往 POSTROUTING,根据调度算法来挑选并转发至后端的主机。
优点:
- 高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。
- 抗负载能力强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
- 无流量:LVS只分发请求,而流量并不从它本身出去,保证了均衡器IO的性能不会受到大流量的影响;
- 成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
- 配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
- 支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
- 支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
- 应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
- 工作稳定:因为其本身抗负载能力很强,自身有完整的双机热备方案, 如LVS+Keepalived(常用),LVS+Heartbeat。
缺点:
- 工作在4层,不支持7层规则修改:软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。
- 机制过于庞大,不适合小规模应用:如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦,相对而言,Nginx/HAProxy+Keepalived就简单多了。
ipvs scheduler
ipvs scheduler(调度程序):根据其调度时是否考虑各RS当前的负载状态
静态方法:仅根据算法本身进行调度,而不考虑后端服务器的实际连接情况和负载情况
RR;Round Robin;轮询调度:
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
WRR;Weighted RR;加权轮询:
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
SH;Source Hashing;源地址哈希:
源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
将来自于同一个IP地址的请求,始终发往第一次挑中的RS,从而实现session sticky(会话绑定)
DH;Destination Hashing;目标地址哈希:
根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态方法:除了根据算法本身,还会根据后端真实服务器的实际连接情况来分配请求,Overhead=value 较小的RS将被调度
LC;Least Connections ;最少链接:
将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
Overhead=activeconns*256+inactiveconns 活动连接*256+非活动连接
WLC;Weighted LC;加权最少连接(默认调度方法):
具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
Overhead=(activeconns*256+inactiveconns)/weight 活动连接*256+非活动连接 最后除以权重
SED;Shortest Expection Delay;最短延迟调度:初始连接高权重优先
在WLC基础上改进,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
Overhead=(activeconns+1)*256/weight
NQ;Never Queue;最少队列调度:
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空闲。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。
LBLC;Locality-Based LC;基于局部性的最少连接调度算法:
针对目标IP地址的负载均衡,主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
动态的DH算法,使用场景:根据负载状态实现正向代理,将高负载的服务器转移部分到低负载的服务器,
LBLCR;LBLC with Replication;带复制的基于局部性最少的连接算法:
带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS。
它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
LVS 集群体系结构
LVS 专业术语
- LB: Load Balancer,负载均衡
- HA: High Available,高可用
- Failover: 失败切换
- Cluster: 集群
- LVS :Linux Virtual Server Linux,虚拟服务器
- VS:Virtual Server, 虚拟服务器
- DS:Director Server,负载调度服务器
- Director:调度器
- Load Balancer :负载均衡器,分发器
- RS:Real Server,后端请求处理服务器
- CIP: Client IP,客户端IP
- VIP:Director Virtual IP,VS服务器虚拟IP,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
- DIP:Director IP,VS服务器真实IP,主要用于和内部主机通讯的 IP 地址
- RIP:Real Server IP,后端请求处理服务器IP
- RS:Real Server,后端请求处理服务器
- ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务和Real Server
- ipvs:工作于内核空间的INPUT钩子上的框架,在 2.4.23 和 2.6 之后的版本, 直接内置在内核中。
LVS 工作模式
- LVS-NAT:修改请求报文的目标IP,多目标IP的DNAT
- LVS-DR(Director router):操纵封装新的MAC地址
- LVS-TUN:在原请求IP报文之外新加一个IP首部
- LVS-fullnat:修改请求报文的源和目标IP
LVS-NAT模式
Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。
LVS-NAT 模型类似于 DNAT,工作机制与 DNAT 一样,当客户端请求的是集群服务时,LVS 修改请求报文的目标地址为 RIP,转发至后端的 RealServer,并修改后端响应报文的源地址为 VIP,响应至客户端。Director 进出请求报文都经过 Director,因此 Director 的压力是比较大的。
地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的流量经过转换器。
NAT模式工作流程
- Client访问VIP
- 经过DS转发请求给RS,目标IP改为RIP
- RS返回响应给CIP
- 经过DS转发响应给Client,源IP改为VIP
- Client收到VIP的响应
NAT模式工作原理
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
- IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP,RS的端口号可以是随机端口。
- POSTROUTING链通过选路,将数据包发送给RS。
- RS比对发现目标为自己的IP,开始构建响应报文发回给DS。 此时报文的源IP为RIP,目标IP为CIP。
- DS把来自RS的响应包,通过FORWORD转发给Client。在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
LVS-NAT体系结构图
LVS-NAT模式架构图
LVS-NAT模式IP包调度过程图
NAT模式特点
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。
- RIP和DIP应在同一个IP网络,且应使用私网地址;
- RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- DS必须是Linux系统,RS可以是任意OS系统
LVS-DR模式
Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。
LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
Director 和 Realserver 处在同一网络中,对于 Director,VIP 用于接受客户端请求,DIP 用于和 Realserver 通信。对于 Realserver,每个 Realserver 都配有和 Director 相同的 VIP(此 VIP 隐藏,关闭对 ARP 请求的响应),仅用户响应客户端的请求,RIP 用于和 Director 通信。NAT模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。
DR模式工作流程
DR模式工作原理
- 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
- PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
- IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
- 由于DS和RS在同一个网络中,所以是通过二层,数据链路层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
- RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP。
- 响应报文最终送达至客户端。
注意:因为LVS和后端真实服务器RealServer都配置了VIP,在常规网络环境下,这肯定会造成IP地址冲突,所以必须在RS上修改内核参数,限制arp通告及应答级别,将RS服务器的VIP内核参数绑定到lo接口上。
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
# 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# 2:必须避免将接口信息向非本网络进行通告
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_asnnounce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
此DR模型过程:客户端请求的过程中需要通过LVS调度转发给RS服务器,而RS服务端应答的过程中不需要经过LVS服务器。
DR模式特点
- 处理效率高,但配置较麻烦。
- 保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
- RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
- RS跟LVS服务器(Director Server)必须在同一个物理网段
- 所有的请求报文经由Director Server,但响应报文不需要经过过Director Server
- 不支持地址转换,也不支持端口映射
- RS可以是大多数常见的操作系统
- RS的网关绝不允许指向DIP(因为我们不允许他经过director)
- RS上的lo接口配置VIP的IP地址
注意:VIP和RIP可以在同一个网段,也可以不在一个网段,VIP是私网地址时,VIP和RIP可以在同一个网段,如果VIP是公网地址,RIP就不能和VIP在同一个网段,否则直接访问RIP地址即可,完全不需要VIP调度。
LVS-DR体系结构图
LVS-DR模式架构图
LVS-TUN模式
用IP隧道技术实现虚拟服务器。
TUN模式本质上同DR的方式一样,只是在Director和RealServer之间是通过IP隧道的方式去通信,一般这种方式只在企业需要在多个异地机房做调度时,可以采用这种方式,因此较为不常用。集群所能提供的服务是基于TCP/IP的Web服务、Mail服务、News服务、DNS服务、Proxy服务器等等.
TUN模式:采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍
LVS-TUN模式工作流程
TUN模式工作原理
- 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
- 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
- RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。注意:需要设置lo接口的VIP不能在公网上出现
TUN模式特点
- DIP, VIP, RIP都应该是公网地址
- RS的网关一般不能指向DIP
- 请求报文要经由Director,但响应不经由Director
- 不支持端口映射
- RS的OS须支持隧道功能
LVS-TUN体系结构图
LVS-FullNAT模式
LVS-FullNAT(双向转换)
这种方式同NAT的方式本质上也是一样的,不管是请求报文还是响应报文都要经过Director,唯一的区别是,NAT模式在发送给后端RealServer时,只是做目的IP地址和目的端口转换,而Full-NAT模型下是源目IP地址和源目端口都需要做转换.
通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发:
CIP --> DIP VIP --> RIP
LVS-FullNAT模式特点
- RIP,DIP可以使用私有地址;
- RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP;
- 支持端口映射;
- RS的OS可以使用任意类型;
- 请求和响应报文都经由 Director
工作模式总结
VS/NAT | VS/TUN | VS/DR | |
---|---|---|---|
server | any | tunneling | non-arp device |
server network | private | LAN/WAN | LAN |
server number | low (10~20) | high | high |
server gateway | load balancer | own router | own router |
模式与特点 | NAT 模式 | IPIP 模式 | DR 模式 |
---|---|---|---|
对服务器的要求 | 服务节点可以使任何操作系统 | 必须支持 IP 隧道,目前只有 Linux 系统支持 | 服务器节点支持虚拟网卡设备,能够禁用设备的 ARP 响应 |
网络要求 | 拥有私有 IP 地址的局域网络 | 拥有合法 IP 地址的局域,网或广域网 | 拥有合法 IP 地址的局域,服务器节点与负载均衡器必须在同一个网段 |
通常支持节点数量 | 10 到 20 个,根据负载均衡器的处理能力而定 | 较高,可以支持 100 个服务节点 | 较高,可以支持 100 个服务节点 |
网关 | 负载均衡器为服务器节点网关 | 服务器的节点同自己的网关或者路由器连接,不经过负载均衡器 | 服务节点同自己的网关或者路由器连接,不经过负载均衡器 |
服务节点安全性 | 较好,采用内部 IP,服务节点隐蔽 | 较差,采用公用 IP 地址,节点安全暴露 | 较差,采用公用 IP 地址,节点安全暴露 |
IP 要求 | 仅需要一个合法的 IP 地址作为 VIP 地址 | 除了 VIPO 地址外,每个服务器界定啊需要拥有合法的 IP 地址,可以直接从路由到客户端 | 除了 VIP 外,每个服务节点需拥有合法的 IP 地址,可以直接从路由到客户端 |
特点 | 地址转换 | 封装 IP | 修改 MAC 地址 |
配置复杂度 | 简单 | 复杂 | 复杂 |
NAT与FullNAT:请求和响应报文都经由Director
NAT:RIP的网关要指向DIP
FullNAT:RIP和DIP未必在同一IP网络,但要能通信
DR与TUN:请求报文要经由Director,但响应报文由RS直接发往Client
DR:通过封装新的MAC首部实现,通过MAC网络转发
TUN:通过在原IP报文外封装新IP头实现转发,支持远距离通信
LVS之1---工作原理的更多相关文章
- LVS工作原理及集群类型
Cluster概念 Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统 Linux Cluster类型: LB:Load Balancing,负载均衡 HA:High ...
- LVS-DR工作原理图文详解
为了阐述方便,我根据官方原理图另外制作了一幅图,如下图所示:VS/DR的体系结构: 我将结合这幅原理图及具体的实例来讲解一下LVS-DR的原理,包括数据包.数据帧的走向和转换过程. 官方的原理说明:D ...
- LVS三种工作方式八种算法
一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算 ...
- 使用LVS实现负载均衡原理及安装配置详解
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- 使用 LVS 实现负载均衡原理及安装配置详解
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- 使用LVS实现负载均衡原理及安装配置详解(转)
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- LVS 实现负载均衡原理及安装配置详解
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- LVS 集群工作原理
1. 集群:集群(cluster )就是一组计算机,它们作为一个整体向用户提供一组网络资源,单个计算机系统就是一个集群节点(node). 2. 集群种类: <1>. 负载均衡集群(Load ...
- LVS实现负载均衡原理及安装配置
LVS实现负载均衡原理及安装配置 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F ...
- 使用 LVS 实现负载均衡原理及安装配置详解(课堂随笔)
一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(r ...
随机推荐
- PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的sizeType属性
在Designer的spacers部件中有2个部件,分别是Horizontal Spacer和Vertical Spacer,这两个部件都有sizeType属性,如图: 这个sizeType实际上与Q ...
- MapReduce简单执行过程及Wordcount案例
MapReducer运行过程 以单词统计为案例. 假如现在文件中存在如下内容: aa bb aa cc dd aa 当然,这是小文件,如果文件大小较大时会将文件进行 "切片" ,此 ...
- APP软件系统测试
1.功能模块测试 2.交叉事件测试 3.压力测试 存储压力测试 边界压力测试 响应能力压力测试 网络流量测试 4.容量测试 5.安装卸载测试 6.易用性.用户体验测试 7.UI界面测试
- 派大星的烦恼MISC
挺有意思的杂项,python将二进制转图片的时候出现的图片不像二维码,想看题解的时候发现网上的大部分题解都是直接转发,更有意思了. 题目是派大星的烦恼,给了我们一张粉红图片,放进010editor里面 ...
- redis学习之——Redis事务(transactions)
Redis事务:可以一次执行多个命令,本质是一组命令的集合.一个事务中的,所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 常用命令:MULTI 开启事务 EXEC 提交事务 ...
- 详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系
@ 目录 为什么要有相对跳转和绝对跳转? 在程序中只有相对跳转/绝对跳转是否可以? B(BL)和LDR指令具体怎么执行的? B(BL)和LDR跳转范围是如何规定的? 为什么要有相对跳转和绝对跳转? 顺 ...
- html 02-浏览器的介绍
02-浏览器的介绍 #常见的浏览器 浏览器是网页运行的平台,常见的浏览器有谷歌(Chrome).Safari.火狐(Firefox).IE.Edge.Opera等.如下图所示: 我们重点需要学习的是 ...
- Eureka 集群Demo
由于自己遇到了一些eureka集群疑问,就自己搭了一个集群demo进行测试.测试中通过两个eureka相互注册形成集群,两个服务提供者向eureka中注册服务,两个服务消费者通过feign进行服务调用 ...
- Flink Checkpoint 参数详解
Flink Checkpoint 参数详解 什么是 checkpoint 保存状态 Checkpoint 参数详解 StreamExecutionEnvironment env = StreamExe ...
- Promise 之初探
陈旧的知识应该更新一下了,先尝试一下 Promise ,主要参考 https://www.cnblogs.com/whybxy/p/7645578.html 定义一个函数 直接上干货,定义一个函数: ...