Yarn的状态机框架分析

Yarn的状态机框架分析

什么是状态机

状态机(State Machine),是有限状态自动机的简称。简单解释:给定一个状态机,同时给定它的当前状态和输入,那么输出状态时可以明确的运算出来的。

yarn中的状态机

YARN将各种处理逻辑抽象成事件和对应事件调度器, 并将每类事件的处理过程分割成多个步骤, 用有限状态机表示。

在Yarn中,App、AppAttempt、Container、Node都可以使用状态机表示。其中,

RMApp:用于维护一个Application的生命周期;

RMAppAttempt:用于维护一次尝试运行的生命周期;

RMContainer:用于维护一个已分配的资源最小单位Container的生命周期;

RMNode:用于维护一个NodeManager的生命周期。

关于yarn的处理过程

状态机是与事件模型结合使用的,在Service中注册转调度处理器,然后在处理器使用状态机。

整个处理过程大致为: 处理请求会作为事件进入系统, 由异步调度器(AsyncDispatcher) 负责传递给相应事件调度器(Event Handler) 。 该事件调度器可能将该事件转发给另外一个事件调度器, 也可能交给一个带有有限状态机的事件处理器, 其处理结果也以事件的形式输出给中央异步调度器。 而新的事件会再次被中央异步调度器转发给下一个事件调度器, 直至处理完成(达到终止条件) 。

使用状态机的目的

Yarn状态机就负责合理地组织这些状态转换流程,快速找到指定初始状态和事件类型对应的状态转换方法。

状态机举例

例如,对于一个应用RMApp而言,RMApp存在一个初始状态,处理事件时,会根据事件类型匹配对应的转换类Transition,将RMApp从初始状态转化成目标状态。RMApp经历的流程为:初始状态–>转换方法–>目标状态,将其所有流程汇总起来,就是状态机。
在这里插入图片描述

各个使用状态机的事件处理类依赖状态工厂类StateMachineFactory,完成了状态机的初始化。将状态机的处理流程,通过链表结构TransitionsListNode进行组成。

RMActiveServicesserviceInit方法中注册RMAppEventType事件的调度处理器ApplicationEventDispatcher

// Register event handler for RmAppEvents
rmDispatcher.register(RMAppEventType.class,new ApplicationEventDispatcher(rmContext));

ApplicationEventDispatcher中去让RMApp的实现类RMAppImpl处理事件。

@Override
public void handle(RMAppEvent event) {ApplicationId appID = event.getApplicationId();RMApp rmApp = this.rmContext.getRMApps().get(appID);if (rmApp != null) {try {rmApp.handle(event);} catch (Throwable t) {LOG.error("Error in handling event type " + event.getType()+ " for application " + appID, t);}}
}

RMAppImplhandle方法中通过调用状态的的转换方法doTransition来改变RMApp对象状态。

public void handle(RMAppEvent event) {this.writeLock.lock();try {ApplicationId appID = event.getApplicationId();LOG.debug("Processing event for " + appID + " of type "+ event.getType());final RMAppState oldState = getState();try {/* keep the master in sync with the state machine */this.stateMachine.doTransition(event.getType(), event);} catch (InvalidStateTransitionException e) {LOG.error("App: " + appID+ " can't handle this event at current state", e);onInvalidStateTransition(event.getType(), oldState);}// Log at INFO if we're not recovering or not in a terminal state.// Log at DEBUG otherwise.if ((oldState != getState()) &&(((recoveredFinalState == null)) ||(event.getType() != RMAppEventType.RECOVER))) {LOG.info(String.format(STATE_CHANGE_MESSAGE, appID, oldState,getState(), event.getType()));} else if ((oldState != getState()) && LOG.isDebugEnabled()) {LOG.debug(String.format(STATE_CHANGE_MESSAGE, appID, oldState,getState(), event.getType()));}} finally {this.writeLock.unlock();}}

简化实验

简化类图

implements
implements
implements
implements
«interface»
StateMachine
+STATE getCurrentState()
+STATE doTransition(EVENTTYPE eventType, EVENT event)
«interface»
SingleArcTransition
+void transition(OPERAND operand, EVENT event)
«interface»
MultipleArcTransition
+STATE transition(OPERAND operand, EVENT event)
«interface»
Transition
STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType)
«interface»
ApplicableTransition
void apply(StateMachineFactory subject)
ApplicableSingleOrMultipleTransition
final STATE preState
final EVENTTYPE eventType
final Transition transition
ApplicableSingleOrMultipleTransition(STATE preState, EVENTTYPE eventType, Transition transition)
+void apply(StateMachineFactory subject)
SingleInternalArc
- STATE postState;
- SingleArcTransition hook;
+STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType)
MultipleInternalArc
- Set validPostStates
- MultipleArcTransition hook
+STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType)
TransitionsListNode
final ApplicableTransition transition
final TransitionsListNode next
+STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType)
InternalStateMachine
final OPERAND operand
STATE currentState
final StateTransitionListener listener
+synchronized STATE getCurrentState()
+synchronized STATE doTransition(EVENTTYPE eventType, EVENT event)
StateMachineFactory
- final TransitionsListNode transitionsListNode
- Map>> stateMachineTable
final StateTransitionListener listener
- STATE defaultInitialState
- final boolean optimized
+StateMachineFactory addTransition(STATE preState, STATE postState, EVENTTYPE eventType, SingleArcTransition hook)
+StateMachineFactory addTransition(STATE preState, Set postStates, EVENTTYPE eventType, MultipleArcTransition hook)
-STATE doTransition(OPERAND operand, STATE oldState, EVENTTYPE eventType, EVENT event)

事件类型

package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public enum MyEventType {START,Change1,Change2
}

任务状态

package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public enum MyState {NEW,State_1,State_2,FINISHED
}

状态机框架相关

package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public interface SingleArcTransition<OPERAND, EVENT> {public void transition(OPERAND operand, EVENT event);
}
package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public interface MultipleArcTransition<OPERAND, EVENT, STATE extends Enum<STATE>> {public STATE transition(OPERAND operand, EVENT event);
}
package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public interface ApplicableTransition<OPERAND, STATE extends Enum<STATE>,EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {void apply(StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> subject);
}
package com.donny.state;import java.util.HashMap;
import java.util.Map;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public class ApplicableSingleOrMultipleTransition<OPERAND, STATE extends Enum<STATE>,EVENTTYPE extends Enum<EVENTTYPE>, EVENT> implements ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT> {final STATE preState;final EVENTTYPE eventType;final Transition<OPERAND, STATE, EVENTTYPE, EVENT> transition;ApplicableSingleOrMultipleTransition(STATE preState, EVENTTYPE eventType,Transition<OPERAND, STATE, EVENTTYPE, EVENT> transition) {this.preState = preState;this.eventType = eventType;this.transition = transition;}@Overridepublic void apply(StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> subject) {Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>> transitionMap= subject.getStateMachineTable().get(preState);if (transitionMap == null) {transitionMap = new HashMap<EVENTTYPE,Transition<OPERAND, STATE, EVENTTYPE, EVENT>>();subject.getStateMachineTable().put(preState, transitionMap);}transitionMap.put(eventType, transition);}
}
package com.donny.state;import java.util.Set;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public class MultipleInternalArc<OPERAND, STATE extends Enum<STATE>,EVENTTYPE extends Enum<EVENTTYPE>, EVENT> implements Transition<OPERAND, STATE, EVENTTYPE, EVENT> {private Set<STATE> validPostStates;private MultipleArcTransition<OPERAND, EVENT, STATE> hook;  // transition hookMultipleInternalArc(Set<STATE> postStates,MultipleArcTransition<OPERAND, EVENT, STATE> hook) {this.validPostStates = postStates;this.hook = hook;}@Overridepublic STATE doTransition(OPERAND operand, STATE oldState,EVENT event, EVENTTYPE eventType)throws RuntimeException {STATE postState = hook.transition(operand, event);if (!validPostStates.contains(postState)) {throw new RuntimeException("oldState:" + oldState + " ,eventType:" + eventType);}return postState;}
}
public class MyTransition implements SingleArcTransition {@Overridepublic void transition(Object o, Object o2) {System.out.println("do transition");}
}
package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public class SingleInternalArc<OPERAND, STATE extends Enum<STATE>,EVENTTYPE extends Enum<EVENTTYPE>, EVENT> implements Transition<OPERAND, STATE, EVENTTYPE, EVENT> {private STATE postState;private SingleArcTransition<OPERAND, EVENT> hook; // transition hookSingleInternalArc(STATE postState,SingleArcTransition<OPERAND, EVENT> hook) {this.postState = postState;this.hook = hook;}@Overridepublic STATE doTransition(OPERAND operand, STATE oldState,EVENT event, EVENTTYPE eventType) {if (hook != null) {hook.transition(operand, event);}return postState;}
}
package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public interface Transition<OPERAND, STATE extends Enum<STATE>,EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType);
}
package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public interface StateMachine<STATE extends Enum<STATE>,EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {public STATE getCurrentState();public STATE doTransition(EVENTTYPE eventType, EVENT event)throws RuntimeException;
}
package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public class TransitionsListNode<OPERAND, STATE extends Enum<STATE>,EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {final ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT> transition;final TransitionsListNode next;TransitionsListNode(ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT> transition,TransitionsListNode next) {this.transition = transition;this.next = next;}
}
package com.donny.state;import java.util.*;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public class StateMachineFactory<OPERAND, STATE extends Enum<STATE>,EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {private final TransitionsListNode transitionsListNode;private Map<STATE, Map<EVENTTYPE,Transition<OPERAND, STATE, EVENTTYPE, EVENT>>> stateMachineTable;private STATE defaultInitialState;private final boolean optimized;public StateMachineFactory(STATE defaultInitialState) {this.transitionsListNode = null;this.defaultInitialState = defaultInitialState;this.optimized = false;this.stateMachineTable = null;}private StateMachineFactory(StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> that,ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT> t) {this.defaultInitialState = that.defaultInitialState;this.transitionsListNode= new TransitionsListNode(t, that.transitionsListNode);this.optimized = false;this.stateMachineTable = null;}public StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT>installTopology() {return new StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT>(this, true);}private StateMachineFactory(StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> that,boolean optimized) {this.defaultInitialState = that.defaultInitialState;this.transitionsListNode = that.transitionsListNode;this.optimized = optimized;if (optimized) {makeStateMachineTable();} else {stateMachineTable = null;}}private void makeStateMachineTable() {Stack<ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT>> stack =new Stack<ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT>>();Map<STATE, Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>prototype = new HashMap<STATE, Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>();prototype.put(defaultInitialState, null);stateMachineTable= new EnumMap<STATE, Map<EVENTTYPE,Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>(prototype);for (TransitionsListNode cursor = transitionsListNode;cursor != null;cursor = cursor.next) {stack.push(cursor.transition);}while (!stack.isEmpty()) {stack.pop().apply(this);}}public Map<STATE, Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>> getStateMachineTable() {return stateMachineTable;}private STATE doTransition(OPERAND operand, STATE oldState, EVENTTYPE eventType, EVENT event)throws RuntimeException {Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>> transitionMap= stateMachineTable.get(oldState);if (transitionMap != null) {Transition<OPERAND, STATE, EVENTTYPE, EVENT> transition= transitionMap.get(eventType);if (transition != null) {return transition.doTransition(operand, oldState, event, eventType);}}throw new RuntimeException("RuntimeException: " + oldState + eventType);}public StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT>addTransition(STATE preState, STATE postState,EVENTTYPE eventType,SingleArcTransition<OPERAND, EVENT> hook) {return new StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT>(this, new ApplicableSingleOrMultipleTransition<OPERAND, STATE, EVENTTYPE, EVENT>(preState, eventType, new SingleInternalArc(postState, hook)));}public StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT>addTransition(STATE preState, Set<STATE> postStates,EVENTTYPE eventType,MultipleArcTransition<OPERAND, EVENT, STATE> hook) {return new StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT>(this,new ApplicableSingleOrMultipleTransition<OPERAND, STATE, EVENTTYPE, EVENT>(preState, eventType, new MultipleInternalArc(postStates, hook)));}private synchronized void maybeMakeStateMachineTable() {if (stateMachineTable == null) {makeStateMachineTable();}}private class InternalStateMachineimplements StateMachine<STATE, EVENTTYPE, EVENT> {private final OPERAND operand;private STATE currentState;InternalStateMachine(OPERAND operand, STATE initialState) {this.operand = operand;this.currentState = initialState;if (!optimized) {maybeMakeStateMachineTable();}}@Overridepublic synchronized STATE getCurrentState() {return currentState;}@Overridepublic synchronized STATE doTransition(EVENTTYPE eventType, EVENT event)throws RuntimeException {STATE oldState = currentState;currentState = StateMachineFactory.this.doTransition(operand, currentState, eventType, event);return currentState;}}public StateMachine<STATE, EVENTTYPE, EVENT> make(OPERAND operand) {return new InternalStateMachine(operand, defaultInitialState);}
}
package com.donny.state;/*** @author 1792998761@qq.com* @description* @date 2023/9/27*/
public class Test {private final StateMachine stateMachine;private static final StateMachineFactory stateMachineFactory= new StateMachineFactory(MyState.NEW).addTransition(MyState.NEW, MyState.State_1, MyEventType.START, new MyTransition()).addTransition(MyState.State_1, MyState.State_2, MyEventType.Change1, new MyTransition()).addTransition(MyState.State_2, MyState.FINISHED, MyEventType.Change2, new MyTransition()).installTopology();public Test() {this.stateMachine = stateMachineFactory.make(this);}public static void main(String[] args) {Test t = new Test();System.out.println(t.stateMachine.getCurrentState());Object event = new Object();t.stateMachine.doTransition(MyEventType.START, event);System.out.println(t.stateMachine.getCurrentState());t.stateMachine.doTransition(MyEventType.Change1, event);System.out.println(t.stateMachine.getCurrentState());t.stateMachine.doTransition(MyEventType.Change2, event);System.out.println(t.stateMachine.getCurrentState());}
}

实验结果

NEW
do transition
State_1
do transition
State_2
do transition
FINISHED

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity-Input System新输入系统插件学习

1.键盘、鼠标操作 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UI;public class NewInputSystem : MonoBehaviour {public float SpaceKeyValue;public float RightMouseValue;public…

LaTex模板免费下载网站

LaTex模板免费下载网站 在进行文档排版时候&#xff0c;有时需要对不同类型文章的格式进行编辑&#xff0c;本博文推荐一个免费下载LaTex模板的网站。 一、网站地址 链接: LaTex模板网址&#xff1a;http://www.latextemplates.com/ 二、模板类型 模板类型如图2和图3所示。…

回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测

回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测 目录 回归预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据回归预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 Matlab实现基于…

【EI会议征稿】第八届能源系统、电气与电力国际学术会议(ESEP 2023)

第八届能源系统、电气与电力国际学术会议&#xff08;ESEP 2023&#xff09; 2023 8th International Conference on Energy System, Electricity and Power 第八届能源系统、电气与电力国际学术会议&#xff08;ESEP 2023&#xff09;定于2023年11月24-26日在中国武汉隆重举…

【斯坦福cs324w】中译版 大模型学习笔记十 环境影响

环境影响 温室气体排放水足迹&#xff1a;数据中心使用水进行冷却&#xff1b;发电需要用水释放到环境中的化学物质很多是对人类有害的 如何计算数据中心能源消耗 简单表示形式 模型训练过程 参考资料 datawhale so-large-lm学习资料

英语——谐音篇——单词——单词密码

记忆即联结&#xff0c;只要能建立有效的联结&#xff0c;就能很好地记住。在现实生活中&#xff0c;声音的联结模式能很好地帮助我们记忆。几乎每个学生都曾用谐音的方法记忆一些事物&#xff0c;但很多人都没有意识到&#xff0c;我们每个人都可以通过一定的练习&#xff0c;…

超声波乳化具有什么特点(优点)?

梵英超声(fanyingsonic)探针式超声波乳化棒 超声波乳化是通过探针式超声波探头&#xff0c;高强度超声波耦合到液体中并产生声空化。超声波或声空化产生高剪切力&#xff0c;提供将大液滴破碎成纳米尺寸液滴所需的能量。梵英超声(fanyingsonic)提供各种探头式超声波乳化棒和配件…

skywalking 整合

安装sw docker 安装&#xff0c; compose 11800是外侧服务向skywaling投送数据的接口 12800是用来和web界面交互数据的接口 8080是ui界面商品 安装后&#xff0c;访问8080 怎么接入服务 下载 基于java的探针技术自动的上报指标数据&#xff0c;不用改源代码 要改下配置 后端…

Linux系统文件的三种time(atime/ctime/mtime)

使用Go操作文件&#xff0c;根据创建时间(或修改时间)进行不同处理。 在Mac上&#xff0c;文件相关的结构体字段在syscall/ztypes_darwin_arm64.go下的Stat_t: type Stat_t struct {Dev int32Mode uint16Nlink uint16Ino uint64Uid …

微信小程序页面栈超出导致页面卡死

微信小程序页面栈不能超出10个 超出10个之后无法进行点击选择跳转 解决方法&#xff1a; 跳转的时候&#xff0c;判断之前页面栈里是否存在要跳转的页面&#xff0c; 如果存在之前页面&#xff0c;就navigateBack返回之前页面&#xff0c; 如果不存在之前页面&#xff0c;判断…

精通git,没用过git cherry-pick?

前言 git cherry-pick是git中非常有用的一个命令&#xff0c;cherry是樱桃的意思&#xff0c;cherry-pick就是挑樱桃&#xff0c;从一堆樱桃中挑选自己喜欢的樱桃&#xff0c;在git中就是多次commit中挑选一个或者几个commit出来&#xff0c;也可以理解为把特定的commit复制到…

xyhcms getshell

下载xyhcms3.6.2021版本并用phpstudy搭建 function get_cookie($name, $key ) {if (!isset($_COOKIE[$name])) {return null;}$key empty($key) ? C(CFG_COOKIE_ENCODE) : $key;$value $_COOKIE[$name];$key md5($key);$sc new \Common\Lib\SysCrypt($key);$value $sc-…

中国沿海水产养殖空间分布数据集(1990-2022)

4年间隔的遥感信息提取中国沿海水产养殖空间分布数据集&#xff08;1990-2022&#xff09; 人口增长引起水产品需求快速增加&#xff0c;而野生捕捞产量受环境承载力的限制趋于饱和&#xff0c;这使得水产养殖业在过去数十年间迅速发展。水产养殖能够有效保障人类粮食安全和营养…

Web自动化测试 —— headless无头浏览器!

一、Options概述 是一个配置浏览器启动的选项类&#xff0c;用于自定义和配置Driver会话常见使用场景&#xff1a; 设置无头模式:不会显示调用浏览器&#xff0c;避免人为干扰的问题。设置调试模式:调试自动化测试代码&#xff08;浏览器复用&#xff09; 二、添加启动配置 添…

Java分支结构:一次不经意的选择,改变了我的一生。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、顺序结构二、分支结构1、if语句2、switch语句 好久不见&#xff01;命运之轮常常在不经意间转动&#xff0c;有时一个看似微…

静态通讯录

今天我们分享一下静态通讯录详细解释和代码&#xff0c;之前分享过的只是通讯录的代码&#xff0c;但是我们没有进行讲解和解释&#xff0c;今天我们一边分享它的代码一边解释原因&#xff0c;让大家可以手撕通讯录。现在开始我们的学习吧。 首先我们应该要有三个文件&#xf…

MYSQL8解压版 windows 主从部署步骤及配置(包含配置文件,教程文件,免积分下载)

MYSQL8解压版 windows 主从部署步骤及配置 一.安装MSYQL 这里只讲大概,详细步骤、my.ini文件、安装包等会在页尾文件中(正常情况按首个mysql安装,只是名字有区别) 1.主库my.ini配置 [mysqld] #典型的值是5-6GB(8GB内存)&#xff0c;8-11GB(16GB内存), 20-25GB(32GB内存)&…

Ctfshow web入门 XSS篇 web316-web333 详细题解 全

CTFshow XSS web316 是反射型 XSS 法一&#xff1a; 利用现成平台 法二&#xff1a; 自己搭服务器 先在服务器上面放一个接受Cookie的文件。 文件内容&#xff1a; <?php$cookie $_GET[cookie];$time date(Y-m-d h:i:s, time());$log fopen("cookie.txt"…

路由器配置静态和默认路由实现VLAN之间的通信

目录 华为路由器静态路由和默认路由的写法 静态路由和默认路由的区别 案例 华为路由器静态路由和默认路由的写法 配置静态路由&#xff1a; [Huawei] ip route-static <目标网络> <子网掩码> <下一跳地址> 实例&#xff1a;将目标网络192.168.10.0/24的流…

一站式吃鸡利器,提升游戏战斗力,助您稳坐鸡王宝座!

各位吃鸡玩家们&#xff0c;听说过绝地求生作图工具吗&#xff1f;想知道如何提高游戏战斗力、分享顶级作战干货、查询装备皮肤库存&#xff1f;还在为游戏账号安全而担心吗&#xff1f;别急&#xff0c;今天就为您介绍一款一站式吃鸡利器&#xff0c;满足您的所有需求&#xf…