介绍
keep-alive是Vue的内置组件。 负载平衡是一种在真实服务器群集之间分配 IP 流量的方法,可提供一个或多个高度可用的虚拟服务。在设计负载平衡拓扑时,必须考虑负载平衡器本身及其背后的真实服务器的可用性。
Keepalived为负载平衡和高可用性提供了框架。负载平衡框架依赖于众所周知且广泛使用的 Linux 虚拟服务器 (IPVS) 内核模块,该模块提供第 4 层负载平衡。Keepalived 实现了一组运行状况检查器,以根据其运行状况动态、自适应地维护和管理负载平衡的服务器池。高可用性是通过虚拟冗余路由协议 (VRRP) 实现的。VRRP 是路由器故障转移的基本模块。此外,keepalived实现了一组与VRRP有限状态机的挂钩,提供低级和高速协议交互。每个 Keepalived 框架可以单独使用,也可以一起使用,以提供弹性基础架构。
在这种情况下,负载平衡器也可以称为控制器或LVS路由器。
简而言之,Keepalived提供了两个主要功能:
- LVS 系统的运行状况检查
- 实现 VRRPv2 堆栈以处理负载平衡器故障转移
基本用法
keep-alive还提供了三个props:
- include:名称匹配的组件被缓存,可以用逗号分割的字符串,正则表达式或数组。
- exclude:名称匹配的组件不会被缓存,可以用逗号分割的字符串,正则表达式或数组。
- max:最多缓存多少组实例。一旦超过这个数字,在新实例创建之前,已缓存组件中最久没有被访问的实例会被销毁。
keep Alived组件的实现原理
KeepAlive 的本质是缓存管理和特殊的挂载/卸载逻辑。KeepAlive 组件的实现需要渲染器层面的支持。这是因为被 KeepAlive 的组件在卸载的时候,渲染器并不会真的将其卸载,而是会将该组件搬运到一个隐藏的容器中,实现 “假卸载”,从而使得组件可以维持当前状态。当被 KeepAlive 的组件再次被 “挂载” 时,渲染器也不会真的挂载它,而是将它从隐藏容器中搬运到原容器。这个过程对应到组件的生命周期,其实就是 activated 和 deactiveated
如上图所示,“卸载” 一个被 KeepAlive 的组件时,它并不会真的被卸载,而会被移动一个隐藏容器中。当重新 “挂载” 该组件时,它也不会真的被挂载,而会被从隐藏容器中取出,再 “放回” 原来的容器中,即页面中。
KeepAlive 组件的setup函数
setup 函数是 Vue.js 3 新增的组件选项,主要用于配置组合式API.在组件的整个生命周期中,setup 函数只会在被挂载时执行一次,它的返回值有以下两种情况:
(1)返回一个函数,该函数将会作为组件的 render 函数
(2)返回一个对象,该对象中包含的数据将会暴露给模板使用
在 KeepAlive 组件的 setup 函数中,返回的是一个函数,该函数将会直接作为组件的render函数。如下面的代码所示:
// packages/runtime-core/src/components/KeepAlive.ts
// setup 函数用于配置组合式 API
// 在组件的整个生命周期中,setup 函数只会在被挂载时执行一次
setup(props: KeepAliveProps, { slots }: SetupContext) {
// 省略部分代码
// 在 setup 函数中返回一个函数,这个函数会作为组件的 render 函数
return () => {
pendingCacheKey = null
if (!slots.default) {
return null
}
// KeepAlive 的默认插槽就是要被 KeepAlive 的组件
const children = slots.default()
// 省略部分代码
// 返回要渲染的组件
return rawVNode
}
}