|
|
|
|
挪动端

六团体怎样运维一万台效劳器?

明天给各人分享的主题是“去哪儿网使用运维主动化演进之路”。主动化构建进程中所遇到的妨碍以及我们是怎样样超过这些妨碍,我们遇到了哪些坑,以及怎样填平这些坑的进程。

作者:郑松宽泉源:高效运维|2017-12-06 09:17


明天给各人分享的主题是“去哪儿网使用运维主动化演进之路”。主动化构建进程中所遇到的妨碍以及我们是怎样样超过这些妨碍,我们遇到了哪些坑,以及怎样填平这些坑的进程。

我 2013 年参加去哪儿网,不断在从事运维开辟任务。去哪儿网运维开辟有一个特点,一切开辟既当 PM,又当 QA,也没有区分前端任务照旧后端任务,用如今比拟盛行的话说,我们都是全栈工程师。

参加去哪儿这几年,我做的任务也是比拟系统的,那边有需求就去那边。

归纳综合起来次要触及主机办理、使用办理、监控、报警平台等设计,开辟和运维这几方面的任务。

上面复杂引见一下我们的运维团队:

  • 我们的运维团队担任公司一切的效劳器、网络等硬件平台的运维任务。
  • 局部职员从事一样平常运维,包罗 QVS 的摆设,Nginx 的设置装备摆设,使用上线的支持,存储的摆设等,还包罗报警的见告、毛病的转达和跟踪。
  • 2013 年左右,我们开端研发本人的运维平台。
  • 担任公司内网的使用,这些内网包罗 OA 零碎、HR 零碎,另有 IT 资产办理平台等等。

去哪儿网使用运维平台引见

起首复杂引见一下去哪儿网使用运维平台。

我们晓得一个使用从开辟到线上运转,它的生命周期次要触及到四个局部:

  • 使用的资源办理,这些资源包罗使用摆设需求的主机、使用的图片、文件,工具存储所需求的存储资源,使用通讯和其他的网络带宽,另有使用所需求的盘算资源等等。
  • 为了进步使用开辟的服从,而且包管使用开辟的标准,我们公司会提供大众的两头件,这些两头件包罗日记搜集、使用设置装备摆设注册、监控报警目标的搜集,另有使用挪用途径。
  • 为了将我们的使用公布到线上,我们需求对使用停止代码办理和构建测试到公布到线上,这需求 CI/CD 继续公布和继续集成。
  • 当一个使用公布到线上之后,我们需求对这个使用的功能目标和业务目标停止监控、报警和剖析,如许就需求使用相干的监控、报警和日记剖析平台。

去哪儿网的业务也是一步步开展起来的,呆板从几十台到上万台,在开展的进程中我们遇到了许多题目,在差别的阶段我们也提出了差别的处理方案。

去哪儿网阅历的阶段分为四个局部:

运维呆板数目比拟少,大局部的任务都是应急运维。比方我们发明一个使用有题目了,我们登录到这个使用的相干呆板上,手动实行 通博8888官网 下令,去检查这个呆板的资源运用状况。

比方 CPU 是不是太高了,是不是磁盘占满了,这个阶段也没有效到太庞大的剧本,根本上都是手动操纵,几十台左右。

随着范围扩展,手动写了许多剧本,有了这些剧本之后我们就可以批量去实行义务,可以在多台呆板上批量摆设使用和监控。

这个阶段,我们称为剧本运维的阶段,即应用剧本而且联合开源的零碎,完成对数百台呆板的运维。

随着范围越来越大,剧本运维不敷用了,远远不克不及满意需求。剧本能够都是分类的剧本,并没有颠末公道的编排,如许剧本的实行次序就比拟紧张,没有公道编排能够会招致一些题目。

我们开辟一些相干的零碎,用零碎把相干的剧本串联起来,编排好构成一个一个别离的操纵。比方说一台呆板的新建和删除便是独自的操纵,把这些做成零碎,运维职员可以在界面上操纵。

这个阶段,我们称之为分立零碎,数据根本上在各个零碎之间没有完成一个比拟好的共享。这个阶段能运维的主机数目也比拟无限,数千台的主机是比拟好的。

紧接着去哪儿网的呆板范围打破了万台以上,这时分我们思索能不克不及从一个比拟高的角度去公道设计一下运维平台。

为我们的运维任务提供一站式的效劳,在一站式效劳的根底上我们完成数据互通,如许就可以交互起来,做一些主动化的任务。这个时期也是明天我们次要要讲的内容,即运维平台的建立。

使用运维平台的三个要害点

运维平台的建立进程中,我们遭遇了许多困难也遇到了许多坑,在这些困难之中总结出来三个要害点:

  • 主机办理。
  • 监控报警。
  • 数据互通。

主机办理

去哪儿网的主机办理零碎因此 OpenStack 和 DNSDB 为中心的, OpenStack 担任调理创立假造机, DNSDB 是域名办理零碎。

经过 DNSDB 我们可以将一个呆板的称号、部分、用处和它地点的机房构成一个独一的域名,我们用这个独一的域名来标识这台主机。

在 OpenStack 、 DNSDB 之上,我们写了少量的剧本文档和东西,将这些剧本文档和东西编排起来,封装成一个一个的操纵,而且我们给这些操纵付与一些相干的权限。

我们把主机的信息、流畅的办理、权限的设置装备摆设另有操纵日记的盘问都市存在日记库里。最初我们会把一个主机办理零碎的界面表露给运维职员,运维职员经过这个界面来办理我们的主机。

有了主机办理平台之后,运维职员就可以十分方便的在这个平台上创立、烧毁主机,检查主机的相干信息,比方说它的设置装备摆设、过保信息等等。

我们在新加每台呆板的进程中都市默许给这个呆板加上监控报警,呆板有报警的时分也会告诉到相干的担任人。

如许做照旧会存在一个比拟大的题目,即我们这个零碎是怎样开辟给运维职员运用的,开辟职员并没有权限登录这个零碎。

假设说开辟职员提出来一个需求,我要创立一台主机,就需求给 OPS 发邮件,OPS 创立这台主机的时分,实在并没有十分精确的记载到这个担任人是谁,他能够会写在备注里,这个备注随着工夫的推移,有能够禁绝了。

由于事先的担任人能够离任了或许转岗,这种状况都是常常发作的。

这个呆板所担任的部分也没有去很好的记载,由于这个部分许多只是表现在主机这个称号上,但是有能够这台呆板在运用的进程中能够会转给其他业务线的部分运用,如许我们拿到的部分信息也是禁绝确的。

另有一个题目 DB 零碎只对运维职员开放,业务线到场很少,招致整个主机的相干信息实在是不敷精确的,由于 OPS 职员终究无限,不行能十分精确的维护这些信息。

如许我们就想到一个方案,经过使用树去处理。

去哪儿网把业务线依照功用区分别到各个 BU,使用树 BU 作为第一级,上面有部分,部分上面另有更小的部分,这个层级能够是多个的。

最初一级是部分上面所担任的使用,使用是作为最初一级的。我们把一切的级别都作为一个节点,在每个节点上都可以绑定主机,给节点添加担任人,给节点添加审批人,上面我会引见审批人的权限和脚色。

有了这个使用树之后,业务线开辟到场出去,到场办理主机,他们的担任人和部分信息愈加精确。

一台呆板呈现非常,我想十分敏捷找到这个呆板的担任人也十分容易。

假设说宿主机立刻要过保了,它下面的一切的虚机我都需求找到这个虚机的担任人,告诉这些人去实行相干的操纵,比方像虚机下线、使用下线,如许可以防止许多运维宿主机过保而招致的毛病。

由于呆板的担任人比拟准确了,我们的报警告诉会默许把呆板的监控报警都告诉给相干的担任人,由担任人来处置呆板相干的根底硬件报警。

每个季度都市统计资源的耗费,也会对下个季度呆板的推销做计划和预算。

拿到比拟下级的部分,比方拿到一个 BU 节点,可以经过使用树很容易拿到这个部分下都有哪些呆板,他这个月的增长量是几多,我们就可以很方便的预测下个季度我们需求推销几多量的呆板,从而订定愈加公道的预算。

有了用户之后,担任人、部分和呆板的干系都是比拟明白的。

但是存在一个题目,请求资源的时分,依然需求由 OPS 停止操纵,账号添加也是由 OPS 担任,一个开辟职员想要扩容一台呆板或许给一个呆板去添加账号,要怎样做?

他就需求给操纵 OPS 的 team 发邮件,说我要给使用扩容两台主机,或许给哪台主机添加一个账号。

如许做有什么害处,一是 OPS 不行能及时在线也不行能盯着零碎,如许 OPS 呼应十分慢,邮件盘问起来十分不方便,并且邮件工夫长了能够丧失,定位题目也不容易。

怎样处理这个题目?接上去又做了两个零碎:第一个是主机请求零碎,第二是账号请求零碎。

这两个零碎以主机办理、使用树和审批中央为根底,挪用主机办理、使用树和审批中央为接口,经过挪用接口去编排一些公道的主机请求和账号请求的流程。

方才我们提到主机请求的时分,谁有权限请求,使用树上的每个节点的担任人都有权限去请求这个部分的主机或许这个使用的主机,节点上的审批人他就有权限去审批这个节点下的主机。

如许 OPS 就不必到场太多,他们可以主动请求主机和账号。

最初我们做了一个界面,把这个界面表露给开辟职员,开辟职员可以去请求主机、请求账号。

经过使用树、主机办理、主机请求、账号请求这四个平台做了闭环,中心是使用树节点,使用树节点把四个局部串联起来。

使用树节点有什么题目,我们会改动它,比方刚开端有个 portal 使用放在 OPS 开辟下,有一天发明这个放的地位不太对,需求间接放在 OPS 上面就可以了,如许就需求把 portal 从运维开辟挪动到 OPS 上面。

另有一个, portal 随着业务增长,使用越来越大,需求拆分红几个局部,比方需求拆分红 portal-web 和 portal-api ,这种树节点改动会招致什么?

我们每个零碎记载的都是使用树节点,每个使用树节点的改动各个零碎都需求去同步,这就相称于在一个散布式零碎里有一个有形态的模块,便是使用树节点这个模块。

它是有形态的,有形态就招致我们散布式比拟困难,我们想把使用树节点推行到更多的零碎中,那就会十分困难,就会不时面对同步的题目。

这个题目怎样处理,比方说关于一个平凡的住民来说,怎样在各个零碎之间共享数据,比方我一团体怎样在公安零碎、在户籍零碎、在银行零碎等等各个零碎之间,怎样样共享我的信息。

理想中就有一个十分好的理论,那便是运用身份证,身份证有独一的 ID,经过如许一个独一的 ID,就可以标识这个使用,而且这个 ID 永久不会改动。

我们怎样去找到如许一个 ID,第一个方案,用数据库里的自增 ID 或许 UUID 来标识使用。

如许可以包管使用 ID 独一且不改动,但是由于自增 ID 和 UUID 在笔墨上没有明白意义,我们开辟职员拿到这个 ID 方便于影象,也方便于相同。

假设要用自增 ID 或 UUID ,需求用别的一个零碎去专门看我有几多如许的 ID,先找到这个 ID,再和其他零碎停止交互、相同,十分不方便。

第二个方案,自创身份证,用数字,比方 110 代表北京,前面代表县区,代表本人的出生日期。

自创身份证 ID,我们运用了如许一个叫 Appcode 的方案来标识使用。Appcode 根本上以下滑线联系的,第一个是使用地点的部分,第二个是使用的描绘,这个层级也可以十分长。

用如许一个 Appcode 去替代使用数节点,既能包管独一且不行改动,便于各人影象,相同也比拟方便,我们最初选的是第二套方案。

监控报警

上面看一下我们是怎样在运维平台去做监控报警的。作为一个互联网公司,包管 7x24 小时提供效劳是一个最根本的要求,我们要怎样去包管 7x24 小时效劳?

假设说零碎有题目的时分,我们可以提早预警发明,等零碎真正呈现题目的时分,我们可以实时的发明。要包管这两点,我们就需求监控报警零碎。

去哪儿网的监控报警零碎也是阅历了很永劫间的挣扎,刚开端每个部分都市维护本人的一套零碎,刚开端是 Cacti 和 Nagios 这两个模块去搭建的,如许存在什么题目?

Cacti 摆设在单机上,不克不及横向拓展,招致功能比拟差。假设单机呈现非常乃至宕机,那我们的监控报警零碎就完全不行用,以是这是一个非高可用的方案。

每个部分都市维护一套本人的监控零碎,乃至比拟大的部分,像旅店机票这种大部分,他们能够会维护许多套,每一套都需求有专门的职员来运维,运维本钱也十分高。

由于之前的零碎没有很好的权限办理,这个零碎只能由专门的人来担任,由于放开给其别人权限是比拟风险的,能够有人不警惕操纵了什么,把报警删失或许修正报警设置装备摆设,以是只要把报警交给专人担任。

要定制一个报警监控相同本钱十分高,我们需求联络本人的相干担任人,然后再去报警设置装备摆设。

开辟职员以为太费事了,爽性不做了,或许做得十分少,招致我们监控的面不敷全,能够有一些非常乃至是毛病都没有实时发明,服从是比拟低下的。

怎样处理这个题目?我们做了一个公司级的一致监控报警平台 Watcher 。

报警平台有如许几个目的:

高可用,一台呆板或几台呆板挂了,对我们没有影响或许影响很小。

比拟容易的让各人去设置装备摆设这个报警,我们做了一个权限办理零碎,也是自创使用树做了一个树状的权限办理零碎,把整个 Watcher 界面开放给一切的开辟职员,如许各人就可以十分方便的配本人的报警和监控。

复杂引见一下 Watcher , Watcher 是基于 Graphite 深度开辟的, Watcher 平台既支持主机根底监控报警,同时也支持业务监控报警,都在一个一致的平台上,监控报警可以由开辟职员在一致的界面上检查和设置装备摆设。

Watcher 大约 2014 年开端做,如今有三年工夫,在公司也推行得很好。

如今 Watcher 曾经接入 1500 个以上的使用, 现在的目标数目曾经超越了 2000 万,报警数目曾经超越了 40 万,接入了根底监控的呆板数目也超越了 4 万台。

Watcher 这么大的范围,我们用了什么样一个架构呢?

这个架构图只是我们一个 Watcher 集群的架构图,我们在打数的时分会区分每个目标要打到哪个集群上,我们怎样区分?

以  Metrics 作为标识,比方一切的测试数据测试目标都以 t 扫尾,一切的主机数据都以 h 扫尾。

我们用 s.flat 就代表机票这个部分,机票这个部分一切目标打数的时分就要设置装备摆设好一个效劳器,这个效劳器也是用域名来表现的,它本人自身就代表一个机票的监控报警集群。

在下面的集群架构图里,最下边绿色的是 Graphite 原有的组件,在原有组件上我们本人开辟了几个相干的组件。

第一个是 Relay ,每个目标打过去之后,我们经过 Relay 把目标散布在多台呆板上,这个是经过分歧性哈希来完成的。

等我们取数的时分, Graphite-api 这局部也是我们本人开辟的, Graphite-api 里也有异样的分歧性哈希算法,经过这个算法找到这个目标在这个集群的哪一个呆板上,挪用这个呆板上的 Graphite-web 下的 api,然后拿相干的数据。

这是一个集群的架构,我们有多个集群。Watcher 要做一个一致的界面,在这个界面上设置装备摆设本人的监控的时分,选择数据源,关于打数的人他清晰这个目标在什么中央。

能不克不及做一个一致的数据源,让用户来运用,如许我们就在组件里加上了一个纯目标的数据库,每次流量过去之后,我们就会把这个目标的称号写到我们数据库里一份,同时记载它在哪个集群。

如许我们就可以对外报一个一致的 Graphite-api ,假设说一个目标我们要起 s.flat-xx 的目标,起首是挪用api,去找 s.flat-xx 这个目标在什么集群里,发明在机票的集群里,再经过分歧性哈希就可以把这个目标取出来了。

Graphite-api 上第一局部是借这个 Dashboard 来报警。讲完好个的 Watcher 架构,上面看一下主机监控是怎样做的?

起首有一个硬件办理平台,维护着主机监控的相干信息。

最次要的是会编排署理,去维护署理的版本设置装备摆设,会不绝的去扫描这个主机,往主机上摆设,也会定时反省目标能否搜集了。

假设这个主机目标呈现断点了或许有题目了,会报警去反省,究竟是  Collectd 出题目了照旧零碎出题目了照旧网络出题目了。

每个主机上摆设 Collectd 之后会依据差别的设置装备摆设打差别的目标,比方 CPU 的运用状况,内存的运用状况,网络带宽的运用状况,这些都将目标打成了 Watcher。

每个主机的目标能够都是相反的,怎样区分差别主机的目标,我们就以主机的称号作为区分。接入到 Watcher 之后,我们就可以挪用 api,在 Dashboard 上挪用。

业务监控也是比拟相似的,使用接入之后会表露出 api,外面便是近来 1 分钟之内使用的监控数据,每分钟 Qmonitor server 从一切的呆板上去拉这个文件,拿了文件之后做会合的剖析,剖析完之后做相应的处置。

比方说对使用停止计数,算完之后以 Appcode 作为标识来区分差别的目标,将目标推送到 Watcher。推送到 Watcher 之后,异样可以盘问监控,反省使用目标的安康形态。

数据互通

上面讲一下我们怎样在整个运维平台完成数据互通的。我们在监控报警和主机办理里都提到了一个 Appcode ,在去哪儿网 Appcode 究竟是什么?

实在它便是独一的一个标识使用,我们将一个使用停止了笼统化,意思愈加狭义了。

在去哪儿网一个使用可以是一个 Web 效劳,也可以是一个 GPU 云实例,也可以是 MySQL 实例,乃至可以是一组交流机,还可以是其他的。

为什么要对使用做如许的笼统化,做笼统化的益处便是我们不必去思索效劳和资源的详细细节,就用一个 App 代表一个效劳或许代表一个资源,在这个笼统化的进程中可以不思索这个效劳究竟做什么,这个资源究竟什么样。

给狭义的使用界说配合的属性,包罗这个使用的担任人、使用的权限、使用的账单等等。

有了这些配合的属性,我们就可以将 Appcode 在多个零碎中停止扩展,散布在各个零碎中去共享数据。如许做的作用是什么?

有了 Appcode 之后,我们就可以在我们的各个零碎中构成一种配合的言语,这个配合言语便是 Appcode 。

有了这个配合言语之后,我们就可以把各个零碎之间的数据衔接起来,最初完成一个数据的互通。完成数据互通之后有什么益处?

  • 我们把 Appcode 放在各个零碎之中监控,比方说主机、存储、盘算,这是使用的资源局部。

Appcode 散布在多个零碎之中,多个零碎中互相作用,一个数据只要散布的节点越多,对这个数据的精确性要求越高,由于这个数据能够在多个零碎间运用,它的担任人就会愈加注重这份数据,以是他们更情愿让这个数据变得愈加精确。

  • 数据更精确之后,它就变得愈加有效,各个零碎之间由于数据精确了,都情愿运用这份数据,构成比拟良性的生态循环。

由于数据互通了,我们就可以做一个 Portal 平台,对外表露一个一致的界面,可以对我们使用所触及的一切局部停止一站式办理。

Portal 平台简介

复杂引见一下 Portal 平台,如今也是正在开辟中的平台。

Portal 便是以 Appcode 为根底,在 Appcode 的根底上衔接了各个运维零碎。

比方说主机、账号、GPU 云、ES 云,使用注册、使用设置装备摆设、使用两头件,情况设置装备摆设、代码堆栈、测试、公布、监控、报警、日记搜集,毛病办理。

我们把这些零碎都汇总到一个 Portal 界面上表露给开辟职员,开辟职员进入这个零碎之后就可以一站式的把使用相干的想做的事变都做完。

数据互通别的一个益处,方才讲主机办理,主机能够会有差别维度来表明这个主机是不太一样的。

比方使用公布,有公布主机列表,算账单的时分有个账单主机列表,搜集日记的时分也有主机列表,搜集监控报警也有主机列表。

只需数据互通之后,我们就可以将这些数据串联起来。比方我们使用,它的主机需求扩容了,扩容两台主机,扩容之后我们就可以主动依据这个使用上的担任人去为主机添加对应的账号。

如许它的担任人就可以应用这个账号登录相应的零碎,停止相应的操纵。

数据库另有其他的比方 IP 白名单限定,有了数据互通之后,一个使用它的白名单设置装备摆设就没须要记载在每一个主机上了,就记载在 Appcode 就可以了。

CI/CD局部,使用公布的主机也是和 Appcode 相干联的,使用扩容之后公布的主机也是异样同步过去,公布选择这些主机间接公布就可以了,不需求手动再去填写这些主机列表。

监控分为两个方面,一个是根底监控,一个是业务监控。根底监控也是经过 Appcode 维度可以检查相干的主机的根底监控。

关于业务监控在使用监控目标的搜集,也可以经过 Appcode 来拿到它的主机列表,主动去给业务监控目标搜集添加这些呆板列表,添加完之后搜集下去这些使用相干主机的监控目标和日记。

报警零碎,由于有了 Appcode 之后,它会对应着一些配合的监控报警项,比方像 Java 里的 GC 报警。

我们有了 Appcode 之后,就可以给每个 Appcode 上的一切呆板都默许添加 GC 报警。这个 GC 报警联络人便是 Appcode 一个担任人,每台呆板扩容之后它的 GC 报警也就主动添加了。

日记搜集也是一样的,之前我们能够照旧需求在这个平台手动维护,有了 Appcode 就可以同步这个列表。

数据互通另有别的一个益处,有 Appcode 之后我们就可以十分方便的去盘算这个使用所消耗的账单。为什么要盘算一个使用的账单?

一方面,让我们进步了本钱认识,本钱认识在选型进程中也是需求思索的。

比方一个业务线它有一些数据需求记载上去,它可以选择任何零碎,也可以选择数据库,也可以选择  Watcher 。

假设说这个业务拜访的频率十分低,比方一天就频频、十频频,把这个数据记载到 Watcher 实在本钱十分昂扬,由于 Watcher 数据收缩十分凶猛,选择数据库或许日记更划算。

第二可以优化完成,假设你由于算法招致呆板资源少量运用,有了账单之后,他们会无意识去浪费本钱。

有了本钱认识之后,我们可以愈加公道的分派资源。比方有的使用自身不是很紧张,还请求了特殊多的呆板,呆板运用率也不高,拿到账单一看,这么一个不紧张的使用居然消耗这么大的账单,然后他们就会接纳一局部资源。

现在我们也在不时的去接入林林总总的使用账单,比方说主机账单、网络带宽账单、监控报警、日记搜集、少量的存储,另有盘算资源账单,另有其他的一系列的账单,都市渐渐接入出去。

总结

最初做一下总结,在去哪儿网运维主动化进程中,我们阅历了差别的阶段。

我们发明等使用扩展到肯定范围的时分,需求运维平台化,主动的或许半主动的方法黑白常消耗人力资源的,而且它也会大抵发明一些错误乃至是毛病。去哪儿网运维主动化也是做得十分不错的,怎样来表现?

我 2013 年入职,我入职的时分一样平常运维的职员大约有五六个,如今我们一样平常运维的职员依然是六个,我们又推出了一个运维呆板人,运维第七人。

我们照旧坚持在六人的形态,我们范围扩展了许多倍,从百台到万台,扩展了上百倍的范围,但是我们一样平常运维职员并没有添加,这是运维平台主动化带来的益处。

使用的可用性需求监控报警零碎的包管,根本上在一个使用上线之前就会去把它一切要害的报警和监控架好,如许使用有题目的话就会敏捷回滚或许去 debug 。

由于我们有美满的监控报警零碎,以是去哪儿网的毛病还算比拟少的,均匀来说一天也就两三个毛病。

但是去哪儿网的毛病和其他的毛病能够不太一样,去哪儿网的毛病要求比拟苛刻,一次网络毛病我们就会记载批次的毛病。

比方 Watcher 的监控零碎不出图了,超越 5 分钟了,我们能够会穷究 P1 和 P2 的毛病。

在如许的严厉要求下,我们的毛病也不会太高,我入职四年来,如今累计的毛病数也就 3000 个左右。

要包管我们整个运维生态的开展,我们需求将数据买通,买通需求给使用一个 ID,有了这个 ID 之后,我们就可以在各个运维零碎战争台上共享数据,构成一个良性的生态循环。

郑松宽,去哪儿网初级运维工程师。2013年参加去哪儿网平台奇迹部,从事运维开辟任务。任务中次要担任公司监控零碎的开辟,使用办理平台 Portal 的设计、开辟和运维。

【编辑引荐】

  1. 京东大范围数据中央网络运维监控之眼
  2. IT运维条记:操卖白粉的心,赚卖白菜的钱!
  3. 通博8888官网效劳器平安简明指南
  4. 通博8888官网运维之ntpdate同步网络工夫
  5. 美团外卖:日订单量超越1600万的主动化业务运维之路
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
各人都在看
猜你喜好

读 书 +更多

通晓ASP+XML+CSS网络开辟混淆编程

《通晓ASP+XML+CSS网络开辟混淆编程》引见以后网络开辟的主流平台与技能之一的ASP+CSS+XML的知识与使用,全书各知识点均配以实例,依照根底...

订阅51CTO邮刊

点击这里检查样刊

订阅51CTO邮刊