经济文库 - 千万精品文档,你想要的都能搜到,下载即用。

part 1- 微服务与云计算概述(2) 2020.pdf

看我口型:Gun76 页 2.971 MB 访问 682.97下载文档
part 1- 微服务与云计算概述(2) 2020.pdfpart 1- 微服务与云计算概述(2) 2020.pdfpart 1- 微服务与云计算概述(2) 2020.pdfpart 1- 微服务与云计算概述(2) 2020.pdfpart 1- 微服务与云计算概述(2) 2020.pdfpart 1- 微服务与云计算概述(2) 2020.pdf
当前文档共76页 2.97
下载后继续阅读

part 1- 微服务与云计算概述(2) 2020.pdf

11. 微服务与云计算 共享一直是趋势:DOS  Windows (单程序  多程序并发); 共享 群体效应,集约效应;C/S模式; 云计算:资源池 资源塘  资源库  资源湖。逻辑与物理; 微服务:云环境下的敏捷软件工业化生产:快;一个团队负责; 流水线生产(作业)模式: idea 设计 开发 测试 部署; 自动化:用工具来取代人工:效率高,质量有保障; 工具:对重复性/共性的事情,提取规律,机器来做; 云环境下微服务的另一表述 l 一个团队(几个人)负责开发; l 频繁地改版和发布; l 云原生 = 微服务 + DevOps + 持续交付 + 容器化 11.1 云计算 l 云计算中的最核心概念就是虚拟化和虚拟机。云计算中的资源都 是共享资源。由高性能(多核处理器,大内存)服务器组成; l 不同客户有不同特性,需求不同。要求能基于客户需求定制资源; l 云中心作为客户任务的聚集点,呈动态性,为了负载均衡,要动 态调整,例如进程迁移; l 云计算中,客户要运行的可执行程序五花八门,要能运行; l 云计算中,要运行客户提供的程序。客户程序可能很糟,有运算 死循环,内存泄露,导致CPU,内存之类的公共资源被吞占耗尽。 客户程序可能不怀好意,想入侵系统,或者捣乱系统; 云计算的三种方式 l 服务方提供程序(即软件),客户租资源(CPU,memory, disk)。比如,polarDB云数据库;客户租了之后,就拥有了 自己的数据库,只是运行在别人的机器上; l 服务方提供API,指定编程语言(Script),客户方编写脚本程 序,上传到服务器,在服务器上运行,成为上层服务(应用级 服务)。例如,微信的云开发方式以Node.js为服务平台。 l 服务方提供虚拟机或者容器,客户方提供二进制可执行程序, 运行在虚拟机上或者容器中。例如docker,超算。 云计算 l 二维空间:应用,用户 APPID, UserID 客户 应用 云计算中的技术问题 l 组织: Ø 组大:采用分布式技术将多个计算机组织成一个逻辑计算机, 例如,分布式文件系统,分布式数据库系统,大数据 Hadoop,spark。使得外部用户看来,这台计算机提供的 服务从不间断,响应总是及时,存储容量无穷大; Ø 划小:采用虚拟化技术将一台高性能计算机虚拟化成多台逻 辑计算机,什么业务都能承担; l 检测/控制/调度; 组大——把多个计算机组织成一个计算机 利用群聚效应:通过划分/迭加增大容量; l对外服务的窗口; 协调者 参与者1 参与者2 l掌握全局的元数据; l任务的分解/结果的整合 (Map/Reduce) 参与者n 提供不间断的服务 通过复制提升服务可用性; 协调者 副本1 副本2 l对外服务的窗口; l掌握全局的元数据; 副本3 群体与个体的统一性/一致性 程序管理器——程序的调度(启动/挂起/关闭/迁移), 给进程分配资源;服务的注册/发现; l对外服务的窗口; 全局程序管理器 l掌握全局的资源信息; l任务管理与调度; l监测与控制; 单机程序管理器1 单机程序管理器2 单机程序管理器n 共享生态的特性 共享: l 分布中有集中:共享资源有管理者,用户与管理者交互;资源 状态变化:可用,不可用,共享; l 实体的物理位置由稳定性  变动性: 物理位置参数:写到程序中  配置参数文件  服务管理中心; l 彼此独立的实体之间的交互特性:请求是否成功是问号;什么 时候得到响应结果也是问号。一句话:请人家办事,由人家说 了算。当认为靠不住时,是否还有其它途径来解决; 共享的运作模式 共享  由管理者来管理共享资源,客户与管理者交互: 资源状态变化:可用,不可用,共享; 用户1 消息队列 用户2 管理者 用户n 成员之间的协同一致 构建管理者; 管理者 成员1 成员2 成员n 云计算与微服务 云 云 检测 GPRS 运 输 支付 云 云计算:业务系统与检测监控系统(南向 和北向接口)—— 彼此独立 自动配置与控制 用户需求收集 用户画像刻画 监测 系统运行状态监测中心 系统运行监测中心 控制 异常发布与追踪 监测 异常模式识别 异常知识库 监测 控制 数据多维度统计 特征数据库 数据存储 控制 原始数据库 监测 控制 数据采集 环境与基础设施 l 硬实力:基础服务越多/越丰富,有其作为支撑,新应用的开发 就越容易。例如,一个地方的基础设施越发达,如交通,水电 气,通信,对招商引资就有吸引力,因为开厂很容易,有保障。 只须要搭建厂房,运来生产设备即可; l 软实力:例如人素养高,政府廉洁,政策清明,政府办事高效 简捷,社会治安良好,那么引资就更有吸引力; l 同样地,新应用的开发,如果设计,开发,测试,部署,运维 有成熟的流水线衔接模式,每个环节都有先进的工具来提高自 动化处理水平,那么应用开发的质量,效率,成本就有保证; 对标准的认识 l 建立标准的目的是统一认识和表达,使得产品既具有独立性,还 具有可对接组装/组合性。于是,产品的应用/适应空间扩大,对 用户更有吸引力,更受用户欢迎; l 标准:不仅仅是停留在规定的文本描述上,要通过框架来固化, 通过工具来检测; l 接口标准的广泛采纳和日久认可,就会沉淀出基础设施,例如文 件系统,数据库系统,邮件系统,WEB服务系统,网络通信; l 基础服务因广泛使用而非常庞大,因群体和集约效应变得稳定可 靠,价廉物美;例如通信网络,移动通信; 软件开发中的硬实力与软实力 l 硬实力:基础设施:操作系统/文件系统,编译器,数据库,中 间件; l 软实力:被证明有效、广泛认可/接受的模式,例如: ü 函数调用模式(C/S模式); ü 基于消息队列的异步调用模式; ü 访问服务的非过程化/无状态模式; ü 版本更新不再使用置换模式,而是采用切换模式 ü 高内聚,低耦合模式: 微服务/组件的边界划分:依据交互的 频繁度,交互的数据量; 共享理念带来管理问题 l DOS(Disk file operating system),一台机只运行一个应用程序; l 多任务操作系统,引入了共享理念,于是出现了应用程序管理器, 资源管理器; l 分布式系统,也是共享理念,不过范围进一步延伸,对于资源, 不再是静态的,而是具有动态性。因此就如应用程序一样,也需 要检测跟踪; l 监控:应用无关的检测与监控;应用有关的检测与监控:日志; 云计算技术的演进 l 1955年,MIT的John McCarthy(人工智能之父)提出了timesharing(分时)想法,以实现多人同时使用一台计算机; l 1959年,英国的Christopher Strachey在Time Sharing in Large Fast Computer一文中,提出虚拟化概念 l 1961年,John McCarthy提出了Utility Computing,想要 计算成为像电网那样的公共服务, l 1970年,贝尔实验室开发出Unix操作系统。 l 1991年,开源操作系统Linux操作系统。 l 1990s,网格计算(Grid computing),把大量机器整合成一 个虚拟的超级机器,构成公共计算服务。 云计算技术的演进(cont.) l 1997年,美国Ramnath K. Chellappa将Cloud Computing定 义为:“计算边界由经济而并非完全由技术决定的计算模式”。 l 1998 年,VMware公司成立,实现 X86 的虚拟化。 l 2002年,亚马逊推出Amazon Web Services(AWS)平台。 把应用开发的通用部分(如服务器、存储和数据库)抽离出来, 做成公共基础设施服务平台。 l 2003~2006年,Google连续发表了四篇重磅文章:分布式文 件系统(GFS)、并行计算(MapReduce)、数据管理(Big Table)和分布式资源管理(Chubby),为云计算、大数据处 理指明了方向。 l 2013年, Docker容器技术; 一台机器虚拟化成多台不同类型的机器 l 基本机器资源:处理器,内存,文件系统,网络; l 解决各种平台下二进制应用程序的运行问题; x86,windows 虚拟机 x86,Linux 虚拟机 Hypervisor for x86 x86 主机硬件 一台机器虚拟化成多台不同类型的机器 l知名的虚拟机产品:VMware; x86,DOS x86,windows 虚拟机 虚拟机 ....... . Hypervisor for x86 Linux 主机操作系统x86 Linux x86 主机硬件 一台机器虚拟化成多台同一类型的机器 l 基本机器资源:处理器,内存,文件系统,网络等; l 解决运行环境不一致性问题;通过隔离来解决恶意和漏洞问题; l 应用程序到处都可运行,还可迁移; Container Container Container 1 2 3 docker 主机操作系统x86 Linux x86 主机硬件 什么叫操作系统(OS) l OS作为计算机硬件上的第一层软件,认为自己拥有全部的硬件 访问控制权,且自己是唯一的控制者。 l 因此同一机器上,两个OS无法同时共存。 虚拟机的实现原理——利用机器体系结构 l CPU上有权限等级状态位; l 每一个指令的执行,都有权限等级要求。对于指令I,执行它的 权限等级为i,那么只有当CPU上的权限等级状态位被设置成 ≧i 时,指令I才能正常执行。否则就会产生异常中断; l 异常中断一出现,CPU上的权限等级状态位就被设置成高权限, 转而去执行中断处理例程; 虚拟机的实现原理——利用I/O模式 l 在计算机上的I/O设备,有多个控制寄存器和状态寄存器,用 端口号来标识。获取设备状态,就是读端口号。操控设备,就 是写端口号。 l 设备状态的变化事件,以中断方式来通知CPU; l 中断处理例程的入口地址表,其起始地址通过执行设置指令来 告诉CPU。执行设置指令须要高权限等级; l 执行端口读写指令也须要高权限等级; 虚拟化的实现 l VMM(Virtual Machine Monitor, 或者叫Hypervisor)是怎 么管住Guest OS的? l 先装VMM,后装OS。 Applications Applications OS OS VM Hareware Hareware 多任务OS的实现原理 l 微处理器结构模式:用户模式(user mode),内核模式 (kernel mode)。 l 应用程序代码运行在user mode,OS代码运行在kernel mode。 l 在用户模式,可直接执行unprivileged instructions,比如数 学运算。当执行privileged instructions时,因权限等级不够, 就会产生异常中断,执行转到kernel mode下的中断处理例程。 l 系统调用(system call),就是以消息队列模式来实现;在x86中, 这个指令是INT(中断)。在MIPS中,这个指令是trap。内核 进程处理完之后,调用一个IRet指令,使执行回到用户进程; VM的实现原理 l 因为先装VMM,所以OS不再运行在kernel mode( Ring 0), 而 是user mode( Ring 3); l 用户代码执行INT(中断)指令后,执行转入到运行在kernel mode 的VMM中的异常中断处理例程。VMM修改CPU的权限 等级到Ring 3, 然后调用OS对应的异常中断处理例程。在OS的 异常中断处理例程中,当执行到特权指令时,便产生异常中断。 执行再次转到VMM中的异常中断处理例程; l VMM的异常处理例程就可做处理了,例如将一个磁盘操作,改 成对文件的操作,即重定向处理。 为什么VMM能够知道操作系统的trap handler在哪? l 系统中先装VMM, 后装OS。当你在VMM上安装OS时候,操 作系统会调用特权指令来安装trap handler。因为OS运行在 user model (Ring 3),导致异常中断产生,执行转入到VMM 中,于是在VMM的异常中断处理例程中,就可得到OS的 trap handler。 VM中内存地址的处理 当OS使用特权指令来完成一个虚拟地址到物理地址的转换时(TLB miss),产生异常,执行转入VMM。VMM调用OS的代码来先完成 虚拟地址到物理地址的转化。然后,操作系统认为自己已经完成了 转化,尝试去更新TLB(特权操作)。 VMM用一个叫个pmap的映 射表找到物理地址对应的机器 地址,用机器地址替换掉物理 地址,然后把TLB更新为虚拟 地址到机器地址的映射。 Virtual Address by page Table Pysical Address by pmap Table Machine Address VM的实现——总结 l 利用CPU的硬件结构特性,在指令级来加以实现; l 首先安装VMM,于是VMM取得了设置权限等级状态位的控制权; l 优点:对OS完全透明,不须对操作系统做任何修改,适应性强; l 缺点:添加了VM层,在OS和VM之间不断切换,性能开销大; 轻量级的虚拟机实现方案:容器方案 l 每个容器就相当于一台独立的计算机; Container Container Container 1 2 3 docker 主机操作系统x86 Linux x86 主机硬件 云计算中应用程序彼此间相互隔离的 重要性 对应用程序,进行隔离,限定资源量,例如CPU,内存,网络 带宽,能访问的文件,系统资源,例如正在运行的进程PID等; 不隔离的话,就不安全,表现为: l 存在捣乱问题,例如,既然能获取机器上正在运行的进程PID, 就可关闭其它运行的进程; l 耗尽机器资源问题,例如内存,CPU,磁盘空间; l 其它安全问题,例如病毒,盗取数据; 程序间隔离 l 隔离的目的:运行在同一机器上的应用程序相互独立,互不干 扰。隔离的实现可通过虚拟机,也可通过容器。容器是一种轻 量级的隔离实现。 l 从应用程序的开发和安装部署的角度看,一个容器就是一台计 算机加操作系统; l 从隔离角度来看,在一台计算机的操作系统之上可以构建多个 容器。 Docker是基于容器技术,为应用程序开 发和部署提供的一个支撑平台/工具 Docker:基于Linux操作系统构建一个容器,然后让应用程序 运行在这个容器中。这个容器对于应用程序来说,就是专为它的运 行而配备的一台计算机加操作系统。 具体实施中,可在开环境中中的某台计算机上构建这个容器, 也可在测试环境中的某台计算机上构建这个容器,还可在生产环境 中的某台机器上构建这个容器。于是,屏蔽了开发环境,测试环境, 生产环境三者的差异对应用程序的运行产生影响; 实质上, 是将程序的运行环境(依赖的支持库和机器的配置)也 纳入到应用程序的版本控制中,排除掉因运行程序的机器配置差异 而导致的程序运行结果不同这一问题。 虚拟化中容器概念 容器(container),集装箱的意思,集装箱是商业史上了不起的 一项发明,大大降低了海洋贸易运输成本。 对于某个应用程序,其运行环境为某台机器上的操作系统; 对于某个商品,其运输环境为某个集装箱; 在这里,操作系统和集装箱都是指所处环境; 在一台计算机的操作系统上可运行多个应用程序,操作系统给应 用程序分配资源时,是能满足就满足。因此,一个应用程序所要 的资源可能已被前面的应用程序占用了,于是,运行不正常; 集装箱要依托某个运输平台,例如火车,轮船,汽车; 操作系统中容器隔离的演进 Control Groups Docker l docker将程序以及程序所有的依赖,都打包到docker container。于是,程序运行所依赖的环境,就是容器。即程 序见到的机器是容器; l 安装部署时,容器被构造在所指定的机器上,就如集装箱被放 置在货船/港口/火车上一样; l 于是,物理机器的差异(例如网络的IP和Port,磁盘文件系 统),就被docker container屏蔽掉了; Docker Container l 实现“build once, run everywhere” l docker的另一个好处就是快速部署,快速启动; l 只要确保应用程序能在一个容器中正确运行,那么不管这个容 器构建在哪个计算机上,该程序都能正确运行; l 换一个说法,就是程序运行想要的机器(即运行环境),无论 在那一台计算机上都能虚拟出来。 Docker中的三个概念 l 开发者在dockerfile中指定应用需要(即依赖)哪些程序(Libs), 依赖什么样的配置(例如网络的IP,网关,DSN)。 l dockerfile相当于C/C++中的makefile文件; l 将dockerfile交给docker“编译器”进行“编译”:docker build命令,生成的可执行程序就是image; l 使用docker run命令运行这个image:; l image运行起来后就是docker container (进程)。 Docker架构(C/S模式) App Store Docker Hub / Registry load image Docker Client Docker Client机器 build image run image load image pull image pull image Docker Daemon Docker Host 机器 历史遗留,以及虚拟机和容器的起因 l 多任务操作系统,一个操作系统独占一台机器,其上可运行多 个应用程序;即多个应用程序共享一个计算机; l 每种共享资源都设有管理者,应用程序充当客户,通过API与管 理者交互。共享资源都的管理者,在windows中叫系统服务, 在linux中叫子系统; l 历史遗留:1)抢占式:对应用程序的请求,能满足,就满足; 2)应用程序可访问计算机的全局信息,例如当前运行的进程 pid, l 于是,进程之间可相互影响,所要求的共享资源可能冲突; l idea:让应用程序分组,然后每组运行在一个独立的机器上; Docker的实现原理 l Linux内核中本身就有基于Namsespace的资源隔离实现机制; l 在操作系统中,PID、IPC、网络这些资源是全局的。而在 Namespace隔离机制下,这些资源就不再是全局的了,而是属 于某个特定的NameSpace。 l 各个NameSpace下的资源互不干扰,使得每个NameSpace看 上去就像一个独立的机器一般; l 仅有NameSpace还不够。进程还是可以不受控的访问系统资源, 比如CPU、内存、磁盘、网络等。Docker采用control groups 技术(也就是cgroup),来控制容器中进程对资源的可访问量。 Namespace的六个子类 Mount Namespace 挂载点和文件系统的隔离 IPC Namespace 进程间通信的隔离 Network Namespace 网络的隔离 UTS Namespace 主机名、域名的隔离 PID Namespace 进程间的隔离 User Namespace 用户、用户组间的隔离 从类的概念来看,Namespace类包含上述6个成员,每个成员也 是某个类的对象。操作系统原本只有一个Namespace类的对象; 所有进程都关联这个对象;现在可以创建多个Namespace类的对 象,每个进程只关联其中的某个对象; CGroup对Linux内核各子系统的控制 cpuset 分配指定的cpu和内存节点 cpuacct 统计cpu使用情况 CPU 控制CPU占用率 memory 限制内存使用上限 device 设备权限控制 freezer 暂停cgroup中的进程 net_cls 限制网络带宽 net_prio 设置网络流量的优先级 blkio 块io的控制 CGroup的本质 从类的概念来看,CGroup类包含上述9个成员,每个成员也是某 个类的对象。操作系统原本只有一个CGroup类的对象,整个机器 的资源都分配给这个CGroup对象。所有进程都关联这个对象; 现在可以创建多个CGroup类的对象,每个进程只关联其中的某个 对象; 操作系统再提供API,将机器资源拆分成单元,再把单元分派给 CGroup对象。于是,每个CGroup对象相当于一台机器,相互独 立; 在云平台上运行应用程序的差异 l 应用程序运行在一个机器上,那么当程序修改后,就要停下应用 程序,再运行改版的应用程序。这种方式叫替换; l 在云平台上运行应用程序时,当程序修改后,就在另一机器(VM 或者容器)中运行改版后的应用程序。这种方式叫切换。 l 采用切换方式,要明显地优于替换方式,能明显地减短应用程序 不可用时间; Docker的实现原理 l 技术需要有工具来驱动。通过工具为用户提供操作接口,来创建一 个容器。 l 容器 =cgroup + namesapce + rootfs + 容器引擎; l rootfs:文件系统隔离; l 容易引擎:生命周期控制; 容器的创建原理:1)为进程创建 namespace l pid = clone(fun, stack, flags, clone_arg); flags = CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWUSER | CLONE_NEWNET | CLONE_NEWIPC | CLONE_NEWUTS 于是,子进程拥有自己的namespace: pid, mount,user. network, ipc, uts 将当前进程置于某个CGroup l echo $pid > /sys/fs/cgroup/cpu/tasks l echo $pid > /sys/fs/cgroup/cpuset/tasks l echo $pid > /sys/fs/cgroup/blkio/tasks l echo $pid > /sys/fs/cgroup/memory/tasks l echo $pid > /sys/fs/cgroup/freezer/tasks l echo $pid > /sys/fs/cgroup/devices/tasks 将子进程的pid写入各个cgroup子系统中,于是该进程就受相应 cgroup子系统的控制; 在新的namespace,cgroup,rootfs中执行 程序 l fun( ) { pivot_root(“path_of_rootfs”, path); exec(“/bin/bash”); } l pivot_root:使该进程进入一个新的rootfs; l 然后在新的namespace, cgroup, rootfs中执行程序 /bin/bash; CGroup的创建和配置 l 创建: #mkdir /sys/fs/cgroup/cpuset/ child l 配置: #echo 0 /sys/fs/cgroup/cpuset/ child/ cpuset.cpus #echo 0 /sys/fs/cgroup/cpuset/ child/ cpuset.mems 限制这个Cgroup中的进程只能在0号cpu上运行,只会从0号结点 内存上分配内存; l 使能: #echo $$ > /sys/fs/cgroup/cpuset/ child/ tasks $$指当前进程,也可把pid加到cgroup.procs中 如何将进程放进一个已有的namespace l 查看一个进程的namespace: #ls -l /proc/$$/ns ipc-> ipc:[4026531839] mnt->mnt:[2127731839] net->net:[5526531839] user->user:[476531839] uts->uts:[57211839] l 调用open()打开这些虚拟文件,得到文件句柄,再将其用于 另一进程的setns(),就可把该进程纳入该namespace; 对基于CGroup和Namespace实现的容器 的理解 l 一个容器相当于运行在一台物理计算机上的一个操作系统: 一个容器 = 一个CGroup + 一个Namespace; l 一个容器中可运行多个应用程序; l 在一个容器中,操作系统的特质得以保留,例如抢占式、全局 信息、IPC,因此原有应用程序不须要做任何改动; l linux提供创建CGroup 和Namespace的API; l linux也提供将一个进程纳入某个CGroup 或者Namespace的 API; l 不同容器中的2个进程之间的交互,只能采用不同机器中的两个 进程之间的交互方式,即network。这就需要构造虚拟网络; Docker容器的实现框架 VMware中,虚拟网络的构建,有三种方式 多了三个虚拟交换机 机器中的网卡,多了两个虚拟网卡 网络虚拟化的Bridged Mode 每个虚拟机和主机网卡有平等性,都是LAN网络中的一员(相同 的网关,网段;DSN等) 对接收,主机网卡设置成混杂模式,可侦听网络中多个IP(都放在 iptables中 对于发送,主机网卡还要另外担当网关的作用; 主机网卡 192.168.1.101 虚拟网桥 虚拟机1 192.168.1.105 VMnet0(虚拟交换机) 虚拟机2 192.168.1.106 虚拟机3 192.168.1.107 Bridged Mode下虚拟机的网卡配置 Bridged Mode下主机网卡信息的查阅 Bridged Mode下虚拟机的网卡配置 修改虚拟机的网络配置文件: /etc/sysconfig/network-scripts/ifcfg-eth0 Bridged Mode下虚拟机配置后的网络重启 网络虚拟化第2种方式——NAT模式 虚拟机和主机都是虚拟网络(内部LAN)中的一员。主机网卡变成 了路由器/网关); 主机网卡 192.168.1.101 VMware network Adapter VMnet8 192.168.62.1 虚拟NAT 虚拟机1 192.168.62.105 VMnet8(虚拟交换机) 虚拟机2 192.168.62.106 虚拟DHCP服务器 192.168.62.107 NAT Mode的配置 NAT Mode 下 NAT的配置 NAT Mode 下 DHCP的配置 NAT Mode 下 虚拟机的网络配置 NAT Mode 下 虚拟机的网络配置 NAT Mode下虚拟机的网卡配置 修改虚拟机的网络配置文件: /etc/sysconfig/network-scripts/ifcfg-eth0 网络虚拟化的第3种方式——Host Only模式 去掉了虚拟NAT,于是虚拟机只能与主机通信,不能与外网通信。 当把主机网卡共享给VMware network Adapter VMnet1时,虚 拟机就可与外网通信了。 VMnet1(虚拟交换机) 主机网卡 192.168.1.101 VMware network Adapter VMnet1 192.168.62.1 虚拟机1 192.168.62.105 虚拟机2 192.168.62.106 虚拟DHCP服务器 192.168.62.107 Host Only模式下,将主机网卡共享给 VMware network Adapter VMnet1 Host Only模式下,将主机网卡共享后,根据 弹出的提示修改VMnet1的网段 Host Only模式下,共享主机网卡后,对虚拟 机,要将VMware Network Adapter VMnet1作为自己的路由器 12. 推荐的入门学习资料 l https://developers.weixin.qq.com/doc/ l 小程序; l 小游戏 l 公众号 l docker l VMware l Spring Cloud l 开放平台 l 企业微信 l 智能对话 l 微信支付 l 腾讯小微 谢 谢!

相关文章