如图1所示,局域网中只有一个路由器RTA,所有PC使用RTA做为网关,此时如果RTA故障,所有PC将不能和外网通信。
图1 单网关场景

通过部署多网关的方式实现网关的备份,但多网关可能会出现一些问题:网关间IP地址冲突;主机会频繁切换网络出口。
图2 多网关场景

VRRP的出现很好的解决了这个问题,它在不改变组网的情况下,将多台路由设备组成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现默认网关的备份。
图3 VRRP多网关场景逻辑图

如图4所示,HostA双归到RouterA和RouterB。在RouterA和RouterB上配置VRRP备份组,对外体现为一台虚拟路由器,实现冗余备份。
图4 VRRP备份组示意图

在图4所示的网络中部署VRRP协议,下面结合该图介绍VRRP协议的基本概念:
VRRP路由器(VRRP Router):运行VRRP协议的设备,如RouterA和RouterB。
虚拟路由器(Virtual Router):又称VRRP备份组,由一个Master设备和多个Backup设备组成,被当作一个共享局域网内主机的缺省网关。如RouterA和RouterB共同组成了一个虚拟路由器。
Master路由器(Virtual Router Master):承担转发报文任务的VRRP设备,如RouterA。
Backup路由器(Virtual Router Backup):一组没有承担转发任务的VRRP设备,当Master设备出现故障时,它们将通过竞选成为新的Master设备,如RouterB。
vrid:虚拟路由器的标识,如图中RouterA和RouterB组成的虚拟路由器的vrid为1,需手工指定,范围1-255。
虚拟IP地址(Virtual IP Address):虚拟路由器的IP地址,一个虚拟路由器可以有一个或多个IP地址,由用户配置。如RouterA和RouterB组成的虚拟路由器的虚拟IP地址为10.1.1.254/24。
IP地址拥有者(IP Address Owner):如果一个VRRP设备将真实的接口IP地址配置为虚拟路由器IP地址,则该设备被称为IP地址拥有者。如果IP地址拥有者是可用的,则它将一直成为Master。
虚拟MAC地址(Virtual MAC Address):虚拟路由器根据vrid生成的MAC地址。一个虚拟路由器拥有一个虚拟MAC地址,格式为:00-00-5E-00-01-{vrid}。当虚拟路由器回应ARP请求时,使用虚拟MAC地址,而不是接口的真实MAC地址。如RouterA和RouterB组成的虚拟路由器的vrid为1,因此这个VRRP备份组的MAC地址为00-00-5E-00-01-01。
VRRP协议只有一种报文类型-VRRP通告(ADVERTISEMENT),只有Master才能发送VRRP通告。VRRP协议报文封装在IP报文中,在IP报文头中,源地址为发送报文接口的主IP地址(不是虚拟IP地址),目的地址是224.0.0.18,TTL是255,协议号是112。
目前,VRRP协议包括两个版本:VRRPv2和VRRPv3。VRRPv2仅适用于IPv4网络,VRRPv3适用于IPv4和IPv6两种网络。
VRRPv2的报文结构分别如图5所示。
图5 VRRPv2报文结构

各字段的含义如表1所示:
表1 VRRP报文字段含义
| 报文字段 | 含义 |
| Version | VRRP协议版本号,取值为2。 |
| Type | VRRP通告报文的类型,取值为1,表示Advertisement。 |
| Virtual Rtr ID | 虚拟路由器ID,取值范围是1~255。 |
| Priority | Master设备在备份组中的优先级,取值范围是0~255。0表示设备停止参与VRRP备份组,用来使Backup设备尽快成为Master设备,而不必等到计时器超时;255则保留给IP地址拥有者。缺省值是100。 |
| Count IP Addrs | 备份组中虚拟IPv4地址的个数。 |
| Auth Type | VRRP报文的认证类型。协议中指定了3种类型:
|
| Adver Int | VRRP通告报文的发送时间间隔,单位是秒,缺省值为1秒。 |
| Checksum | 16位校验和,用于检测VRRP报文中的数据破坏情况。 |
| IP Address | VRRP备份组的虚拟IPv4地址,所包含的地址数定义在Count IP Addrs字段。 |
| Authentication Data | VRRP报文的认证字。目前只有明文认证和MD5认证才用到该部分,对于其它认证方式,一律填0。 |
如图6 所示,VRRP协议状态机有三种状态:Initialize(初始状态)、Master(活动状态)、Backup(备状态)。
图6 VRRP状态的转换

表2 VRRP协议状态
| 状态 | 说明 |
| Initialize | 该状态为VRRP不可用状态,在此状态时设备不会对VRRP报文做任何处理。 通常刚配置VRRP时或设备检测到故障时会进入Initialize状态。 收到接口Up的消息后,如果设备的优先级为255,则直接成为Master设备;如果设备的优先级小于255,则会先切换至Backup状态。 |
| Master | 当VRRP设备处于Master状态时,它将会做下列工作:
|
| Backup | 当VRRP设备处于Backup状态时,它将会做下列工作:
|
VRRP的工作过程如下:
VRRP备份组中的设备根据优先级选举出Master。Master设备通过发送免费ARP报文,将虚拟MAC地址通知给与它连接的设备或者主机,从而承担报文转发任务。
Master设备周期性向备份组内所有Backup设备发送VRRP通告报文,以公布其配置信息(优先级等)和工作状况。
如果Master设备出现故障,VRRP备份组中的Backup设备将根据优先级重新选举新的Master。
VRRP备份组状态切换时,Master设备由一台设备切换为另外一台设备,新的Master设备会立即发送携带虚拟路由器的虚拟MAC地址和虚拟IP地址信息的免费ARP报文,刷新与它连接的主机或设备中的MAC表项,从而把用户流量引到新的Master设备上来,整个过程对用户完全透明。
原Master设备故障恢复时,若该设备为IP地址拥有者(优先级为255),将直接切换至Master状态。若该设备优先级小于255,将首先切换至Backup状态,且其优先级恢复为故障前配置的优先级。
下面以图7 VRRP冗余备份的基本过程为例进行简要说明
SwitchA为Master设备,优先级设置为120,抢占方式为延迟抢占。
SwitchB为Backup设备,优先级为默认值100,抢占方式为立即抢占。
SwitchC为Backup设备,优先级设置为110,抢占方式为立即抢占。
图7 VRRP冗余备份示意图

正常情况下,SwitchA为Master设备并承担业务转发任务,SwitchB和SwitchC为Backup设备且不承担业务转发。用户侧的上行流量路径为:Switch1->SwitchA->Router。此时,SwitchA定期发送VRRP报文通知SwitchB和SwitchC自己工作正常。
当SwitchA发生故障时,SwitchA上的VRRP会处于不可用状态。由于SwitchC优先级高于SwitchB,因此SwitchC变为Master设备,并开始发送VRRP报文和免费ARP报文,SwitchB继续保持为Backup设备。用户侧的上行流量路径为:Switch1->SwitchC->Router。
当SwitchA故障恢复时,VRRP的优先级为120,状态变为Backup。此时SwitchC继续定期发送VRRP报文,当SwitchA收到VRRP报文后,会比较优先级,发现自己的优先级更高,等待抢占延迟后抢占为Master设备,并开始发送VRRP报文和免费ARP报文。用户侧的上行流量路径恢复为:Switch1->SwitchA->Router。
为了提高网络可靠性,通常部署主备双归属。为了满足不同的业务需要,设备之间可以运行多个VRRP备份组。此时每个VRRP备份组都需要维护自己的状态机,这样设备之间就会存在大量的VRRP协议报文。
如图8所示,为了减少协议报文对带宽的占用及CPU资源的消耗,可以将其中一个VRRP备份组配置为管理VRRP备份组(mVRRP),其余的业务VRRP备份组与管理VRRP备份组进行绑定。此时,管理VRRP负责发送协议报文来协商设备的主备状态;业务VRRP不发送协议报文,其主备状态与管理VRRP的主备保持一致,以此减少协议报文对CPU与带宽资源的消耗。
图8 管理VRRP示意图

管理VRRP备份组
管理VRRP备份组与普通VRRP备份组一样,会通过VRRP协议报文来协商VRRP设备的主备状态。管理VRRP可以部署在网络中的以下位置:
管理VRRP与业务VRRP部署在同一侧。此时管理VRRP备份组作为网关使用(如图8中的mVRRP1),管理VRRP既负责协商设备的主备状态,也承担业务流量。此时在配置管理VRRP之前必须先创建普通VRRP备份组并配置虚拟IP地址,该虚拟IP地址即为用户设置的网关地址。
管理VRRP部署在SwitchA和SwitchB之间的直连链路上。此时管理VRRP备份组不作为网关使用时(如图8中的mVRRP2),管理VRRP只负责协商设备的主备状态,不承担业务流量。因此管理VRRP不需要具有虚拟IP地址,用户可以直接在接口上创建管理VRRP备份组。该配置在一定程度上降低了用户维护的复杂度。
业务VRRP备份组
普通VRRP备份组与管理VRRP备份组绑定后成为业务VRRP备份组(也叫成员VRRP备份组)。业务VRRP备份组不再发送VRRP协议报文,它的状态由所在接口状态及与其绑定的管理VRRP备份组的状态共同决定。
VRRP冗余备份功能有时需要额外的技术来完善其工作。例如,Master设备到达某网络的链路突然断掉时,VRRP无法感知故障进行切换,此时主机无法通过Master设备远程访问该网络。此时,可以通过VRRP监视链路状态,解决这个问题。
VRRP直接监视连接上行链路的接口状态
当连接上行链路的接口Down时,Master设备通过降低自身的优先级,使得Backup设备抢占成为Master,承担转发任务。
图9 VRRP监视上行接口的典型组网图

如图9所示,SwitchA和SwitchB之间配置VRRP备份组,其中SwitchA为Master设备,SwitchB为Backup设备,SwitchA和SwitchB皆工作在抢占方式下。在SwitchA上配置VRRP监视上行接口Interface1,当Interface1故障时,SwitchA降低自身优先级,通过报文协商,SwitchB抢占成为Master,确保用户流量正常转发。
VRRP利用BFD/NQA/路由技术监视上行链路连接的远端主机或者网络状况
BFD/NQA/路由用于检测Master设备上行链路的连通状况,当Master设备的上行链路发生故障时,BFD/NQA/路由可以检测故障并通知Master设备调整自身优先级,触发主备切换,确保流量正常转发。
图10 VRRP与BFD/NQA/路由联动监视上行链路典型组网图

如图10所示,SwitchA和SwitchB之间配置VRRP备份组,其中SwitchA为Master设备,SwitchB为Backup设备,SwitchA和SwitchB皆工作在抢占方式下。配置BFD/NQA/路由监测SwitchA到SwitchE之间的链路,并在SwitchA上配置VRRP与BFD/NQA/路由联动。当BFD/NQA/路由检测到SwitchA到SwitchE之间的链路故障时,通知SwitchA降低自身优先级,通过VRRP报文协商,SwitchB抢占成为Master,确保用户流量正常转发。
如图11所示,在VRRP+STP场景中,SwitchA和SwitchB上配置VRRP备份组。若与用户相连的Switch1不能转发VRRP协议报文(如配置了未知组播丢弃),或者为了防止VRRP协议报文(心跳报文)所经过的链路不通或不稳定,可以在SwitchA和SwitchB之间部署一条心跳线,用于传递VRRP协议报文。
由于配置了心跳线之后,需要将Interface1和Interface2加入与VRRP备份组相对应的VLAN(例如,VRRP备份组配置在VLANIF100接口下,则需要配置Interface1和Interface2加入VLAN100),SwitchA、SwitchB和Switch1之间会存在环路,因此还需要配置破环协议来破除环路(例如,可以配置STP协议来破除环路)。
图11 VRRP心跳线示意图

如图12所示,主机通过SwitchC接入网络,SwitchC通过双上行连接SwitchA和SwitchB来接入Internet。由于接入备份的需要,用户部署了冗余链路。冗余备份链路的存在导致出现环网,可能会引起广播风暴和MAC地址表项被破坏。
用户希望在存在冗余备份链路的同时消除网络中的环路,在一条上行链路断开的时候,流量能切换到另外一条上行链路转发,还能合理利用网络带宽。
图12 配置MSTP+VRRP组合组网

配置思路
1. 在处于环形网络中的交换设备上配置MSTP基本功能,包括:
a.配置MST域并创建多实例,配置VLAN2映射到MSTI1,VLAN3映射到MSTI2,实现流量的负载分担。
b.在MST域内,配置各实例的根桥与备份根桥。
c.使能MSTP,实现破除环路,包括:
设备全局使能MSTP。
相关端口使能MSTP,默认已开启。与终端相连的端口不用参与MSTP计算,建议将其设置为边缘端口。
2. 配置设备的二层转发功能
3. 配置各设备端口IP地址及路由协议,使各设备间网络层连通。
4.在SwitchA和SwitchB上创建VRRP备份组1和VRRP备份组2,实现流量的负载均衡。
在备份组1中,配置SwitchA为Master设备,SwitchB为Backup设备;
在备份组2中,配置SwitchB为Master设备,SwitchA为Backup设备。
操作步骤
1. 配置MSTP基本功能
a.配置SwitchA、SwitchB、SwitchC到域名为RG1的域内,创建实例MSTI1和实例MSTI2
# 配置SwitchA的MST域。
<HUAWEI> system-view
[HUAWEI] sysname SwitchA
[SwitchA] stp region-configuration
[SwitchA-mst-region] region-name RG1
[SwitchA-mst-region] instance 1 vlan 2
[SwitchA-mst-region] instance 2 vlan 3
[SwitchA-mst-region] active region-configuration
[SwitchA-mst-region] quit
# 配置SwitchB的MST域。
<HUAWEI> system-view
[HUAWEI] sysname SwitchB
[SwitchB] stp region-configuration
[SwitchB-mst-region] region-name RG1
[SwitchB-mst-region] instance 1 vlan 2
[SwitchB-mst-region] instance 2 vlan 3
[SwitchB-mst-region] active region-configuration
[SwitchB-mst-region] quit
# 配置SwitchC的MST域。
<HUAWEI> system-view
[HUAWEI] sysname SwitchC
[SwitchC] stp region-configuration
[SwitchC-mst-region] region-name RG1
[SwitchC-mst-region] instance 1 vlan 2
[SwitchC-mst-region] instance 2 vlan 3
[SwitchC-mst-region] active region-configuration
[SwitchC-mst-region] quit
b. 在域RG1内,配置MSTI1与MSTI2的根桥与备份根桥
# 配置SwitchA
[SwitchA] stp instance 1 root primary
[SwitchA] stp instance 2 root secondary
# 配置SwitchB
[SwitchB] stp instance 1 root secondary
[SwitchB] stp instance 2 root primary
c. 使能MSTP,实现破除环路,将与Host相连的端口设置为边缘端口
# 在SwitchA上启动MSTP
[SwitchA] stp enable
# 在SwitchB上启动MSTP
[SwitchB] stp enable
# 在SwitchC上启动MSTP,将与Host相连的端口设置为边缘端口
[SwitchC] stp enable
[SwitchC] interface gigabitethernet 1/0/2
[SwitchC-GigabitEthernet1/0/2] stp edged-port enable
[SwitchC-GigabitEthernet1/0/2] quit
[SwitchC] interface gigabitethernet 1/0/3
[SwitchC-GigabitEthernet1/0/3] stp edged-port enable
[SwitchC-GigabitEthernet1/0/3] quit
2.配置处于环网中的设备的二层转发功能
以下表为依据进行vlan的创建和透传,配置过程略
| 设备 | 接口 | 端口模式 | 透传vlan |
| SwitchA | GE1/0/1和GE1/0/2 | Trunk | Vlan 2 vlan 3 |
| SwitchB | GE1/0/1和GE1/0/2 | Trunk | Vlan 2 vlan 3 |
| SwitchC | GE1/0/1和GE1/0/4 | Trunk | Vlan 2 vlan 3 |
| GE1/0/2 | Access | Vlan 2 | |
| GE1/0/3 | Access | Vlan3 |
3.配置设备间的网络互连
a. 依据下表配置设备各端口的IP地址
| 设备 | 接口 | IP地址 |
| SwitchA | VLANIF2 | 10.1.2.102/24 |
| VLANIF3 | 10.1.3.102/24 | |
| GE1/0/3 | 10.1.4.102/24 | |
| SwitchB | VLANIF2 | 10.1.2.103/24 |
| VLANIF3 | 10.1.3.103/24 | |
| GE1/0/3 | 10.1.5.103/24 |
# 配置SwitchA
[SwitchA] interface vlanif 2
[SwitchA-Vlanif2] ip address 10.1.2.102 24
[SwitchA-Vlanif2] quit
[SwitchA] interface vlanif 3
[SwitchA-Vlanif3] ip address 10.1.3.102 24
[SwitchA-Vlanif3] quit
[SwitchA] interface gigabitethernet 1/0/3
[SwitchA-GigabitEthernet1/0/3] undo portswitch
[SwitchA-GigabitEthernet1/0/3] ip address 10.1.4.102 24
[SwitchA-GigabitEthernet1/0/3] quit
# 配置SwitchB
[SwitchB] interface vlanif 2
[SwitchB-Vlanif2] ip address 10.1.2.103 24
[SwitchB-Vlanif2] quit
[SwitchB] interface vlanif 3
[SwitchB-Vlanif3] ip address 10.1.3.103 24
[SwitchB-Vlanif3] quit
[SwitchB] interface gigabitethernet 1/0/3
[SwitchB-GigabitEthernet1/0/3] undo portswitch
[SwitchB-GigabitEthernet1/0/3] ip address 10.1.5.103 24
[SwitchB-GigabitEthernet1/0/3] quit
b.配置SwitchA、SwitchB和路由器间采用OSPF协议进行互连。
# 配置SwitchA
[SwitchA] ospf 1
[SwitchA-ospf-1] area 0
[SwitchA-ospf-1-area-0.0.0.0] network 10.1.2.0 0.0.0.255
[SwitchA-ospf-1-area-0.0.0.0] network 10.1.3.0 0.0.0.255
[SwitchA-ospf-1-area-0.0.0.0] network 10.1.4.0 0.0.0.255
[SwitchA-ospf-1-area-0.0.0.0] quit
[SwitchA-ospf-1] quit
# 配置SwitchB
[SwitchB] ospf 1
[SwitchB-ospf-1] area 0
[SwitchB-ospf-1-area-0.0.0.0] network 10.1.2.0 0.0.0.255
[SwitchB-ospf-1-area-0.0.0.0] network 10.1.3.0 0.0.0.255
[SwitchB-ospf-1-area-0.0.0.0] network 10.1.5.0 0.0.0.255
[SwitchB-ospf-1-area-0.0.0.0] quit
[SwitchB-ospf-1] quit
4.配置VRRP备份组
# 在SwitchA和SwitchB上创建VRRP备份组1,配置SwitchA的优先级为120,抢占延时为20秒,追踪上行接口状态,作为Master设备;SwitchB的优先级为缺省值,作为Backup设备。
[SwitchA] interface vlanif 2
[SwitchA-Vlanif2] vrrp vrid 1 virtual-ip 10.1.2.100
[SwitchA-Vlanif2] vrrp vrid 1 priority 120
[SwitchA-Vlanif2] vrrp vrid 1 preempt-mode timer delay 20
[SwitchA-Vlanif2]vrrp vrid 1 track interface GigabitEthernet1/0/3 reduce 30
[SwitchA-Vlanif2] quit
[SwitchB] interface vlanif 2
[SwitchB-Vlanif2] vrrp vrid 1 virtual-ip 10.1.2.100
[SwitchB-Vlanif2] quit
# 在SwitchA和SwitchB上创建VRRP备份组2,配置SwitchB的优先级为120,抢占延时为20秒,追踪上行接口状态,作为Master设备;SwitchA的优先级为缺省值,作为Backup设备。
[SwitchB] interface vlanif 3
[SwitchB-Vlanif3] vrrp vrid 2 virtual-ip 10.1.3.100
[SwitchB-Vlanif3] vrrp vrid 2 priority 120
[SwitchB-Vlanif3] vrrp vrid 2 preempt-mode timer delay 20
[SwitchB-Vlanif3] vrrp vrid 2 track interface GigabitEthernet1/0/3 reduce 30
[SwitchB-Vlanif3] quit
[SwitchA] interface vlanif 3
[SwitchA-Vlanif3] vrrp vrid 2 virtual-ip 10.1.3.100
[SwitchA-Vlanif3] quit
# 配置主机HostA的缺省网关为备份组1的虚拟IP地址10.1.2.100,配置主机HostB的缺省网关为备份组2的虚拟IP地址10.1.3.100。
验证配置结果
1.查询交换机STP状态
# 在SwitchA上查看端口状态,结果如下:
[SwitchA] display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/1 DESI FORWARDING NONE
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
1 GigabitEthernet1/0/1 DESI FORWARDING NONE
1 GigabitEthernet1/0/2 DESI FORWARDING NONE
2 GigabitEthernet1/0/1 DESI FORWARDING NONE
2 GigabitEthernet1/0/2 ROOT FORWARDING NONE
# 在SwitchB上上查看端口状态,结果如下:
[SwitchB] display stp brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/1 DESI FORWARDING NONE
0 GigabitEthernet1/0/2 ROOT FORWARDING NONE
1 GigabitEthernet1/0/1 DESI FORWARDING NONE
1 GigabitEthernet1/0/2 ROOT FORWARDING NONE
2 GigabitEthernet1/0/1 DESI FORWARDING NONE
2 GigabitEthernet1/0/2 DESI FORWARDING NONE
# 在SwitchC上执行display stp interface brief命令,结果如下:
[SwitchC] display stp interface gigabitethernet 1/0/1 brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
1 GigabitEthernet1/0/1 ROOT FORWARDING NONE
2 GigabitEthernet1/0/1 ALTE DISCARDING NONE
[SwitchC] display stp interface gigabitethernet 1/0/4 brief
MSTID Port Role STP State Protection
0 GigabitEthernet1/0/4 ALTE DISCARDING NONE
1 GigabitEthernet1/0/4 ALTE DISCARDING NONE
2 GigabitEthernet1/0/4 ROOT FORWARDING NONE
2.查询交换机VRRP备份组状态
# 在SwitchA上执行display vrrp命令,查询结果如下:
[SwitchA] display vrrp
Vlanif2 | Virtual Router 1
State : Master
Virtual IP : 10.1.2.100
Master IP : 10.1.2.102
PriorityRun : 120
PriorityConfig : 120
MasterPriority : 120
Preempt : YES Delay Time : 20 s
TimerRun : 1 s
TimerConfig : 1 s
Auth type : NONE
Virtual MAC : 0000-5e00-0101
Check TTL : YES
Config type : normal-vrrp
Backup-forward : disabled
Create time : 2012-05-11 11:39:18
Last change time : 2012-05-26 11:38:58
Vlanif3 | Virtual Router 2
State : Backup
Virtual IP : 10.1.3.100
Master IP : 10.1.3.103
PriorityRun : 100
PriorityConfig : 100
MasterPriority : 120
Preempt : YES Delay Time : 0 s
TimerRun : 1 s
TimerConfig : 1 s
Auth type : NONE
Virtual MAC : 0000-5e00-0102
Check TTL : YES
Config type : normal-vrrp
Backup-forward : disabled
Create time : 2012-05-11 11:40:18
Last change time : 2012-05-26 11:48:58
# 在SwitchB上执行display vrrp命令,查询结果如下:
[SwitchB] display vrrp
Vlanif2 | Virtual Router 1
State : Backup
Virtual IP : 10.1.2.100
Master IP : 10.1.2.102
PriorityRun : 100
PriorityConfig : 100
MasterPriority : 120
Preempt : YES Delay Time : 0 s
TimerRun : 1 s
TimerConfig : 1 s
Auth type : NONE
Virtual MAC : 0000-5e00-0101
Check TTL : YES
Config type : normal-vrrp
Backup-forward : disabled
Create time : 2012-05-11 11:39:18
Last change time : 2012-05-26 11:38:58
Vlanif3 | Virtual Router 2
State : Master
Virtual IP : 10.1.3.100
Master IP : 10.1.3.103
PriorityRun : 120
PriorityConfig : 120
MasterPriority : 120
Preempt : YES Delay Time : 20 s
TimerRun : 1 s
TimerConfig : 1 s
Auth type : NONE
Virtual MAC : 0000-5e00-0102
Check TTL : YES
Config type : normal-vrrp
Backup-forward : disabled
Create time : 2012-05-11 11:40:18
Last change time : 2012-05-26 11:48:58
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
为什么需要服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。有了网关之后,网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务。使用网关的好处1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦合度。一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性(3)解放开发
我发现python的细节自动完成很好RubyonRails有类似的方法描述吗? 最佳答案 有篇不错的文章"UsingVIMasacompleteRubyonRailsIDE"其中引用rails.vim.这似乎是RailsforVIM的实际标准。(不过,我还没有使用过它,但很快就会尝试。)这允许你做很多与Rails相关的任务,但对自动完成没有帮助。还有一篇"RubyAutocompleteinVim"(遗憾的是不再可用)这就是您要搜索的内容。我不知道,理解Rails的所有插件魔法和元编程的东西是否足够聪明。它至少在vim的配置中提到了
防火墙防火墙分类第一代防火墙:包过滤防火墙包过滤防火墙的缺点第二代防火墙:代理防火墙第三代防火墙:状态防火墙第四代防火墙:UTM防火墙第五代防火墙:下一代防火墙华为防火墙介绍安全策略防火墙的会话表防火墙分类第一代防火墙:包过滤防火墙属于第一代防火墙技术,在没有专用防火墙设备时,一般由路由器实现该功能。将网络上传送数据包的IP首部以及TCP/UDP首部,获取发送源的IP地址和端口号,以及目的地的IP地址和端口号,并将这些信息作为过滤条件,决定是否将该分组转发至目的地网络分组过滤的执行需要设置访问控制列表。访问控制列表也可以称为安全策略(简称策略)或安全规则(简称规则)。类似于进站检票的做法,符合
内容来自Qt样式表之QSS语法介绍-3YL的博客Qt样式表是一个可以自定义部件外观的十分强大的机制,可以用来美化部件。Qt样式表的概念、术语和语法都受到了HTML的层叠样式表(CascadingStyleSheets, CSS教程)的启发,不过与CSS不同的是,Qt样式表应用于部件的世界。类型选择器QPushButton匹配QPushButton及其子类的实例ID选择器QPushButton#okButton匹配所有objectName为okButton的QPushButton实例。 CSS常用样式1CSS文字属性注:px:相对长度单位,像素(Pixel)。pt:绝对长度单位,点(Point
简介:我们都知道在Android开发中,当我们的程序在与用户交互时,用户会得到一定的反馈,其中以对话框的形式的反馈还是比较常见的,接下来我们来介绍几种常见的对话框的基本使用。前置准备:(文章最后附有所有代码)我们首先先写一个简单的页面用于测试这几种Dialog(对话框)代码如下,比较简单,就不做解释了一、提示对话框(即最普通的对话框)首先我们给普通对话框的按钮设置一个点击事件,然后通过AlertDialog.Builder来构造一个对象,为什么不直接Dialog一个对象,是因为Dialog是一个基类,我们尽量要使用它的子类来进行实例化对象,在实例化对象的时候,需要将当前的上下文传过去,因为我这
作者:郭斌斌爱可生DBA团队成员,负责项目日常问题处理及公司平台问题排查。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。OceanBase集群界面会展示Observer的资源水位,今天简单了解一下资源水位的数值代表的含义以及关联参数现有test_1集群,只有一个sys租户Sys租户的资源配置:Cpu:2.5-5Memory:3G-3GUnit:1集群的资源水位信息以10.186.63.198为例,浅看一下cpu、内存、磁盘的含义以及相关联参数cpu:2.5/17核2.5代表observer上已经分配给租户的cpu核数,该数值是租户的MinCPU
快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目
涡旋光束及其MATLAB实现前言涡旋光束的基本概念常见的涡旋涡旋光束涡旋光束的产生方法前言笔者新开一块专栏,专门用于讨论整理总结涡旋光束的相关内容,从基本的概念出发,推导相关的公式,并结合MATLAB进行相关的仿真,不清楚这个专栏会更新多少期,我会分享部分的代码,全部的代码有需要的话可以私聊我。当然大家对这个专栏感兴趣的话,欢迎积极交流。涡旋光束的基本概念涡旋光束(vortexbeam)是指携带光学涡旋,具有exp(imϕ)exp(im\phi)exp(imϕ)相位分布的光束,其中mmm表示相位拓扑电荷数,ϕ\phiϕ是柱坐标下的方位角。之前的分享中笔者已经说明了部分的激光光束的表达式,想要