首页 文章 精选 留言 我的

精选列表

搜索[AI技能],共10000篇文章
优秀的个人博客,低调大师

Jackson用树模型处理JSON是必备技能,不信你看

点击上方“ BAT的乌托邦 ”,选择“ 设为星标 ” 后台回复“ 专栏 ”,开启专栏模式学习 ✍前言 你好,我是YourBatman。 上篇文章 体验了一把ObjectMapper在「数据绑定」方面的应用,用起来还是蛮方便的有木有,为啥不少人说它难用呢,着实费解。我群里问了问,主要原因是它不是静态方法调用,并且方法名取得不那么见名之意...... 虽然ObjectMapper在数据绑定上既可以处理简单类型(如Integer、List、Map等),也能处理完全类型(如POJO),看似无所不能。但是,若有如下场景它依旧「不太好实现」: 硕大的JSON串中我只想要 「某一个」(某几个)属性的值而已 临时使用,我并不想创建一个POJO与之对应,只想直接使用 「值」即可(类型转换什么的我自己来就好) 数据结构高度 「动态化」 为了解决这些问题,Jackson提供了强大的「树模型」 API供以使用,这也就是本文的主要的内容。 ❝ 小贴士:树模型虽然是jackson-core模块里定义的,但是是由jackson-databind高级模块提供的实现 ❞ 版本约定 Jackson版本: 2.11.0 Spring Framework版本: 5.2.6.RELEASE Spring Boot版本: 2.3.0.RELEASE ✍正文 树模型可能比数据绑定「更方便,更灵活」。特别是在结构高度「动态」或者不能很好地映射到Java类的情况下,它就显得更有价值了。 树模型 树模型是JSON数据内存树的表示形式,这是最灵活的方法,它就类似于XML的DOM解析器。Jackson提供了树模型API来「生成和解析」 JSON串,主要用到如下三个核心类: JsonNodeFactory:顾名思义,用来构造各种JsonNode节点的工厂。例如对象节点ObjectNode、数组节点ArrayNode等等 JsonNode:表示json节点。可以往里面塞值,从而最终构造出一颗json树 ObjectMapper:实现JsonNode和JSON字符串的互转 这里有个萌新的概念:JsonNode。它贯穿于整个树模型中,所以有必要先来认识它。 JsonNode JSON节点,可类比XML的DOM树节点结构来辅助理解。JsonNode是所有JSON节点的基类,它是一个抽象类,它有一个较大的特点:绝大多数的get方法均放在了此抽象类里(即使它没有实现),目的是:「在不进行类型强制转换的情况下遍历结构」。但是,大多数的「修改方法」都必须通过特定的子类类型去调用,这其实是合理的。因为在构建/修改某个Node节点时,类型类型信息一般是明确的,而在读取Node节点时大多数时候并不太关心节点类型。 多个JsonNode节点构成Jackson实现的JSON树模型的基础,它是流式API中com.fasterxml.jackson.core.TreeNode接口的实现,同时它还实现了Iterable迭代器接口。 publicabstractclassJsonNodeextendsJsonSerializable.BaseimplementsTreeNode,Iterable<JsonNode>{...} JsonNode的继承图谱如下(部分):一目了然了吧,基本上每个数据类型都会有一个JsonNode的实现类型对应。譬如数组节点ArrayNode、数字节点NumericNode等等。 一般情况下,我们并不需要通过new关键字去构建一个JsonNode实例,而是借助JsonNodeFactory工厂来做。 JsonNodeFactory 构建JsonNode工厂类。话不多说,用几个例子跑一跑。 值类型节点(ValueNode) 此类节点均为ValueNode的子类,特点是:一个节点表示一个值。 @Testpublicvoidtest1(){JsonNodeFactoryfactory=JsonNodeFactory.instance;System.out.println("------ValueNode值节点示例------");//数字节点JsonNodenode=factory.numberNode(1);System.out.println(node.isNumber()+":"+node.intValue());//null节点node=factory.nullNode();System.out.println(node.isNull()+":"+node.asText());//missing节点node=factory.missingNode();System.out.println(node.isMissingNode()+"_"+node.asText());//POJONode节点node=factory.pojoNode(newPerson("YourBatman",18));System.out.println(node.isPojo()+":"+node.asText());System.out.println("---"+node.isValueNode()+"---");} 运行程序,输出: ------ValueNode值节点示例------true:1true:nulltrue_true:Person(name=YourBatman,age=18)---true--- 容器类型节点(ContainerNode) 此类节点均为ContainerNode的子类,特点是:本节点代表一个容器,里面可以装任何其它节点。 Java中容器有两种:Map和Collection。对应的Jackson也提供了两种容器节点用于表述此类数据结构: ObjectNode:类比Map,采用K-V结构存储。比如一个JSON结构, 「根节点」 就是一个ObjectNode ArrayNode:类比Collection、数组。里面可以放置任何节点 下面用示例感受一下它们的使用: @Testpublicvoidtest2(){JsonNodeFactoryfactory=JsonNodeFactory.instance;System.out.println("------构建一个JSON结构数据------");ObjectNoderootNode=factory.objectNode();//添加普通值节点rootNode.put("zhName","A哥");//效果完全同:rootNode.set("zhName", factory.textNode("A哥"))rootNode.put("enName","YourBatman");rootNode.put("age",18);//添加数组容器节点ArrayNodearrayNode=factory.arrayNode();arrayNode.add("java").add("javascript").add("python");rootNode.set("languages",arrayNode);//添加对象节点ObjectNodedogNode=factory.objectNode();dogNode.put("name","大黄").put("age",3);rootNode.set("dog",dogNode);System.out.println(rootNode);System.out.println(rootNode.get("dog").get("name"));} 运行程序,输出: ------构建一个JSON结构数据------{"zhName":"A哥","enName":"YourBatman","age":18,"languages":["java","javascript","python"],"dog":{"name":"大黄","age":3}}"大黄" ObjectMapper中的树模型 树模型其实是底层「流式API」所提出和支持的,典型API便是com.fasterxml.jackson.core.TreeNode。但通过前面文章的示例讲解可以知道:底层流式API仅定义了接口而并未提供任何实现,甚至半成品都算不上。所以说要使用Jackson的树模型还得看ObjectMapper,它提供了TreeNode等API的完整实现。 不乏很多小伙伴对ObjectMapper的树模型是一知半解的,甚至从来都没有用过,其实它是「非常灵活」和强大的。有了上面的基础示例做支撑,再来了解它的实现就得心应手多了。 ObjectMapper中提供了树模型(tree model) API 来生成和解析 json 字符串。如果你不想为你的 json 结构单独建类与之对应的话,则可以选择该 API,如下图所示:ObjectMapper在读取JSON后提供指向树的根节点的指针, 根节点可用于「遍历」完整的树。同样的,我们可从读(反序列化)、写(序列化)两个方面来展开。 写(序列化) 将Object写为JsonNode,ObjectMapper给我们提供了三个实用API俩操作它: 1、valueToTree(Object) 该方法属相对较为常用:将任意对象(包括null)写为一个JsonNode树模型。功能上类似于先将Object序列化为JSON串,再读为JsonNode,但很明显这样一步到位更加高效。 ❝ 小贴士:高效不代表性能高,因为其内部实现好还是调用了readTree()方法的 ❞ @Testpublicvoidtest1(){ObjectMappermapper=newObjectMapper();Personperson=newPerson();person.setName("YourBatman");person.setAge(18);person.setDog(newPerson.Dog("旺财",3));JsonNodenode=mapper.valueToTree(person);System.out.println(person);//遍历打印所有属性Iterator<JsonNode>it=node.iterator();while(it.hasNext()){JsonNodenextNode=it.next();if(nextNode.isContainerNode()){if(nextNode.isObject()){System.out.println("狗的属性:::");System.out.println(nextNode.get("name"));System.out.println(nextNode.get("age"));}}else{System.out.println(nextNode.asText());}}//直接获取System.out.println("---------------------------------------");System.out.println(node.get("dog").get("name"));System.out.println(node.get("dog").get("age"));} 运行程序,控制台输出: Person(name=YourBatman,age=18,dog=Person.Dog(name=旺财,age=3))YourBatman18狗的属性:::"旺财"3---------------------------------------"旺财"3 对于JsonNode在这里补充一个要点:读取其属性,你既可以用迭代器遍历,也可以根据key(属性)直接获取,是不是和Map的使用几乎一毛一样? 2、writeTree(JsonGenerator, JsonNode) 顾名思义:将一个JsonNode使用JsonGenerator写到输出流里,此方法直接使用到了JsonGenerator这个API,灵活度杠杠的,但相对偏底层,本处仍旧给个示例玩玩吧(底层API更多详解,请参见本系列前面几篇文章): @Testpublicvoidtest2()throwsIOException{ObjectMappermapper=newObjectMapper();JsonFactoryfactory=newJsonFactory();try(JsonGeneratorjsonGenerator=factory.createGenerator(System.err,JsonEncoding.UTF8)){//1、得到一个jsonNode(为了方便我直接用上面API生成了哈)Personperson=newPerson();person.setName("YourBatman");person.setAge(18);JsonNodejsonNode=mapper.valueToTree(person);//使用JsonGenerator写到输出流mapper.writeTree(jsonGenerator,jsonNode);}} 运行程序,控制台输出: {"name":"YourBatman","age":18,"dog":null} 3、writeTree(JsonGenerator,TreeNode) JsonNode是TreeNode的实现类,上面方法已经给出了使用示例,所以本方法不在赘述你应该不会有意见了吧。 读(反序列化) 将一个资源(如字符串)读取为一个JsonNode树模型。这是典型的方法重载设计,API更加友好,所有方法底层均为_readTreeAndClose()这个protected方法,可谓“万剑归宗”。 下面以最为常见的:读取JSON字符串为例,其它的举一反三即可。 @Testpublicvoidtest3()throwsIOException{ObjectMappermapper=newObjectMapper();StringjsonStr="{\"name\":\"YourBatman\",\"age\":18,\"dog\":null}";//直接映射为一个实体对象//mapper.readValue(jsonStr,Person.class);//读取为一个树模型JsonNodenode=mapper.readTree(jsonStr);//...略} 至于底层_readTreeAndClose(JsonParser)方法的具体实现,就有得捞了。不过鉴于它过于枯燥和稍有些烧脑,后面撰有专文详解,有兴趣可持续关注。 场景演练 理论和示例讲完了,「光说不练假把式」,下面A哥根据经验,举两个树模型的实际使用示例供你参考。 1、偌大JSON串中仅需1个值 这种场景其实还蛮常见的,比如有个很经典的场景便是在MQ消费中:生产者一般会恨不得把它能吐出来的属性尽可能都扔出来,但对于不同的消费者而言它们的所需往往是不一样的: 需要较多的属性值,这时候用 「完全数据绑定」转换成POJO来操作更为方便和合理 需要1个(较少)的属性值,这时候“杀鸡岂能用牛刀”呢,这种case使用树模型来做就显得更为优雅和高效了 譬如,生产者生产的消息JSON串如下(模拟数据,总之你就当做它属性很多、嵌套很深就对了): {"name":"YourBatman","age":18,"dog":{"name":"旺财","color":"WHITE"},"hobbies":["篮球","football"]} 这时候,我仅关心狗的颜色,肿么办呢?相信你已经想到了:树模型 @Testpublicvoidtest4()throwsIOException{ObjectMappermapper=newObjectMapper();StringjsonStr="{\"name\":\"YourBatman\",\"age\":18,\"dog\":{\"name\":\"旺财\",\"color\":\"WHITE\"},\"hobbies\":[\"篮球\",\"football\"]}";JsonNodenode=mapper.readTree(jsonStr);System.out.println(node.get("dog").get("color").asText());} 运行程序,控制台输出:WHITE,目标达成。值得注意的是:如果node.get("dog")没有这个节点(或者值为null),是会抛出NPE异常的,因此请你自己保证代码的健壮性。 当你不想创建一个Java Bean与JSON属性相对应时,树模型的「所见即所得」特性就很好解决了这个问题。 2、数据结构高度动态化 当数据结构高度动态化(随时可能新增、删除节点)时,使用树模型去处理是一个较好的方案(稳定之后再转为Java Bean即可)。这主要是利用了树模型它具有动态可扩展的特性,满足我们日益变化的结构: @Testpublicvoidtest5()throwsJsonProcessingException{StringjsonStr="{\"name\":\"YourBatman\",\"age\":18}";JsonNodenode=newObjectMapper().readTree(jsonStr);System.out.println("-------------向结构里动态添加节点------------");//动态添加一个myDiy节点,并且该节点还是ObjectNode节点((ObjectNode)node).with("myDiy").put("contry","China");System.out.println(node);} 运行程序,控制台输出: -------------向结构里动态添加节点------------{"name":"YourBatman","age":18,"myDiy":{"contry":"China"}} 说白了,也没啥特殊的。拿到一个JsonNode后你可以任意的造它,就像Map<Object,Object>一样~ ✍总结 树模型(tree model) API比Jackson 流式(Streaming) API 简单了很多,不管是生成 json字符串还是解析json字符串。但是相对于「自动化」的数据绑定而言还是比较复杂的。 树模型(tree model) API在只需要取出一个大json串中的几个值时比较方便。如果json中每个(大部分)值都需要获得,那么这种方式便显得比较繁琐了。因此在实际应用中具体问题具体分析,「但是,Jackson的树模型你必须得掌握」。 ✔推荐阅读: Fastjson到了说再见的时候了 1. 初识Jackson -- 世界上最好的JSON库 2. 妈呀,Jackson原来是这样写JSON的 3. 懂了这些,方敢在简历上说会用Jackson写JSON 4. JSON字符串是如何被解析的?JsonParser了解一下 5. JsonFactory工厂而已,还蛮有料,这是我没想到的 6. 二十不惑,ObjectMapper使用也不再迷惑 关注A哥,开启专栏式学习 扫码关注后,回复“专栏”进入更多Spring专栏学习 右侧为私人微信(加好友备注:Java入群) 个人站点(本文已收录):https://www.yourbatman.cn 本文分享自微信公众号 - BAT的乌托邦(BAT-utopia)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

需要掌握哪些核心技能?

首先先看图: 下面是运维工程师至少要能做以下的工作: 1,网络工程师的工作 你至少要能配置CISCO 6509以下的设备,熟悉各种网络协议,否则网络出问题的时候你会傻掉。 2,系统工程师的工作 你至少要理解各种系统服务,在出问题的情况下要迅速解决问题,而不是等系统工程师来解决。 3,安全工程师的工作 我不要求你一定要会各种网络编程,但是在服务器收攻击的情况下,没有防火墙的情况下,做一些简单的处理工作。 4,存储工程师的工作 至少要熟悉各个厂商的设备,各种备份和还原的办法 5,测试工程师的工作 在新版本上线之前,你至少要协同测试工程师做测试工作,因为你是运维人员,不了解程序架构导致无法解决故障,你也有一份责任。 6,研发人员的工作 运维工具都需要自已开发,熟悉开发语言,需要有过实际开发经验,否则工作会非常痛苦,我深有体会。 7,英语 不想说了,我的最大痛苦就在这里 8,好的沟通者 不出问题时候你可以打游戏睡觉,出问题的时候要能和项目人员沟通,快速解决问题,而不是推;我知道有很多人能推责任,你可以做替死鬼,但是离开这个工作你还能找到更好的;把责任推到别人身上的人,下次出问题的时候,绝对没人帮你。你要能和各个兄弟部门关系非常的密切,出了问题有兄弟帮你担责任;也要能非常扯皮,没事在会议上把别人都搞定。 9,库房管理员 数万台服务器让你来管理,任何丢失或者损坏都是不负责任和失职的表现。 10,运动员 不要回家就睡觉,有空还是运动下吧;在服务器down机的时候,机房恰巧就你一个人,机柜没有空间,你需要更换一台HP 585 4U的服务器,满配约80公斤的服务器,你怎么做? 11,责任心 这个我不想说什么,这是你的职业精神。 12,组织者 给你2个啥都不会的民工,再给你2000台服务器,要求你2天把服务器装完,你咋办? 13,1-7条中,你必须有一条非常精通,是这个行业的专家。否则过了32岁,没有公司要你。 大家看了肯定觉得这个人是神仙,但是这必须是你慢慢能做到的,至少是我6年来运维经验的一点总结。 因为现在的公司都在用招聘民工的钱招聘神仙,其次我也是想让各位看看,运维工程师要担负多少责任。 我去面试过的一些公司都说,你什么都会,什么都不精。我说对,正是需要我们这些什么都会的人领导什么都精的人。 我这句话没有贬低大牛的任何意思,只是当时一个临场的发挥。虽然说完就知道这个面试白来了,但是我还是想为广大的运维工程师出口气。 不怕千招会,就怕一招精。这仍旧是我给大家的建议。 最后给大家最后最大最重要的建议,做什么工作都可以,千万别做SA。 我把SA的定义成:speediness answer而不是system admin。为什么?你可以想象一下哪些工作需要快速响应。网络工程师需要,机房网络骨干交换机故障,整个机房所有服务器无法连接,需要快速响应不?系统工程师需要,系统出问题了,要快速响应不?安全工程师需要,服务器被攻击了,要快速响应不?存储工程师需要,公司核心存储有问题了,要快速响应不? 你可以做研发,出了问题可以测试,可以想办法慢慢解决;你可以做DBA,出了问题可以推到网络工程师或者系统工程师身上,说不是DB连接问题;你可以做测试工程师,你说有问题这个东西就可以不上线……在出问题的时候,倒霉的就是SA,所以不要再争论SA包含哪些工作,SA就是一个倒霉的快速响应者,你想,哪个SA 24小时不开手机?哪个SA 晚上可以舒服的睡觉或者安心的出去度假?走在路上一听到和自己手机短信铃声一样的,利马下意识的抓出自己的手机看看是不是服务器报警;晚上和老婆 XXOO00,一个电话过来,立马停下,抓出手机看流量图;包里放着笔记本,但是因为还要开机,太慢,拿着手机上putty ping或者telnet机器…… 这就是大家羡慕的SA ,你也不要抱怨自己做了SA,生活就是这样。所以不要再争论哪些xxx员应该归属于SA,系统管理员或是运维工程师,如果想做这行,就安生的当一个“快速响应者”,这是你的职业,也是你需要做到的。作为一个SA,你肯定经历过通宵好几天加班做事,你肯定经历过饭买来已经忘记了吃,你肯定经历过几天加班没睡觉,着个沙发坐下就失去知觉睡倒……没有经历过不能说你不好,只能说你管理的机器太少。 一,架构设计 现在你要做的,就是设计你的服务器架构和网络架构。这要先看你的网站是做什么的,每日有多少的人数访问, 例如,我打算站点初期每日有20000左右的访问量,和1000人左右的并发量。我可以用我的人数并发量1000×站点中每个页面的平均大小200k×每个访问用户可能要打开4个网页=800 000k=800M的网络流量(当然这个数字肯定是非常的过分,至于为啥,自己可以想下) 然后可以用测试环境用软件检测在你的真实环境下的服务器压力,比如在2000人在线的情况下,服务器的cpu占用多少,内存占用多少。 那么你可以得到你大致配置,其实市面上的标准服务器配置都足够你用了,比如现在的DELL 1950,HP DL360G5,IBM X???(忘记了) 等服务器,足够我跑一个这样简单的网站。其实说白了,双奔3都够,真的。当然你网站的流量比我要大的多,那你可以买的更好一点的服务器。或者负载均衡器。 网络架构 站点现在是一台独立服务器,未来采用的是分布式架构,比如bbs.hilinux.com是一台服务器,man.hilinux.com是一台服务器…… mysql是一台服务器。这样你要算服务器要多少台,交换机要多少口,防火墙要买什么级别的。 哪些服务器可以放在一个防火墙下,哪些服务器不用防火墙保护,哪些服务器是内网服务器, 需要什么样的网络连接,最好是画出大致拓扑,方便你预算设备花费。 服务器交换机等设备选型和购买 说的简单点就是买什么机器,你可以和google一样开始,买几台pc作为你的网站服务器,也可以自己组装一台服务器 或者也可以和我一样,去挑选品牌服务器当然,现在你要看你服务器做什么的, 你可以亲自去电脑城看组装服务器,也可以打电话到IBM,HP,DELL的各地销售商让他们送服务器来测试, 当然你不要告诉他们你只买一台,那你就别指望测试了。我告诉供货商hilinux.com需要200台服务器,一个F5,10台CISCO 2960交换机,3个NETSREEN206防火墙,一个EMCCX500+满硬盘 那么不到3天,hilinux.com所需要的4台测试服务器,就送来了……当然,不要牛了这么多最后只买1台,那么你晚上走夜路会被人打的。 最后就是价钱问题了,这个你自己看着办吧。让你公司的财务或者采购出马砍价付钱就是了。当然,除了服务器的服务,你最好还是想想有利于自己的服务,比如人家公司可以帮你拆箱子了什么的。我做的最弱智的一件事情就是,来了400台服务器,50个交换机,8台EMC,我一个人花了一星期把箱子才全部拆完…… 机器选型的时候你也要为自己考虑,比如HP的ILO功能,可以让你远程BIOS级操作服务器,比如浪潮的自动资产管理等等,为自己管理服务器提供便利,否则机器10来台还好,100台还一般,我这里3万来台,我不死几百遍了。丢失一台服务器,几个月工钱就没了…… 二,IDC选择 首先要看你服务的地区是哪里,然后再去找当地的电信机房。毕竟,虽说全国已经互联了,但是各地的网速还是有差异的。 或者说有的IDC机房利用率高,虽然出口带宽大,但是利用率高的结果是导致你网速慢的原因之一。 我的做法是在全国各个机房的服务器用pingplus这个软件进行一周的的流量测试。可以看到平均丢包,最大延时等等。 当然,你也可以到你目标服务的地方,找个可以上网的地方进行网络测试,比如说网吧包个机器…… 好了,网络测试完了。那么你已经决定去哪个IDC了吧。 然后你就可以电话或者自己提着礼品登门拜访一下IDC服务商的老大了 当然,你也可以找代理服务商,因为他们拿到的价钱有时候比电信或者网通给你的价钱低,但是,关键还是一个服务,因为你毕竟服务器放在那,晚上关键着急没人给你重启,机器出了问题其实按个F1就可以解决的问题,服务商的值班人员不懂。你就只能打晚上的打飞机去机房维护吧。 提着东西拜访一下服务商老大是礼节性的东西,东西不在多而在精,这样你未来谈事情人家也给你绿色通道,做事情要好做很多。当然,我也不反对你空手去,你一次租个100个机柜+10G带宽,人家还是很优惠的。哈哈。大家都是混口饭吃,也不至于难为你什么。 最后你要知道现在的中国还是卖方市场,你给人家牛,那你买的产品只能是……蒙牛 然后是开始去参观机房 细心的检查一下空调数量,空调出厂和最后维护日期,网络布线类型和架构,是否可扩展,主备从电力等。 基本都是非常关键的东西,出问题了,人家可以给你更换一个新的,服务很好,但是你服务器挂一天的损失是多少,你可以自己掂量。 还有机柜电力,现在的机柜放置16台1U的服务器是正好,多了过于热,少了资源浪费;但是你发现人家只让你用10安培电力,过了要交钱买电; 或者不限制你用电,但是插线板只有10个,你还真买个托线板去转接?你要想想你一个托线板挂了,你服务器要挂几个? 最后,我的一个机房包间里140个机柜,2个空调,结果某天挂了一个空调,虽然6小时人家IDC商就给更换了一个空调机(这速度已经非常快了), 结果我机器至少被热死了100台以上,机器是HP的,机器过热,HP会自动关机,而且会不让你启动。你崩溃不?注:不是给hp做广告哈。 三,服务器上架 好了,要是你买的服务器到了,你会发现你接到电话后,楼下一个N大的“擎天柱”集装箱车给你送服务器来……(某次我收2000台服务器就是这样的阵势);在这里有个重大的提示,你们财务给厂商下单的时候,收货地址一定要写对。比如XX路XX号XX大厦XX楼XX室,你写到xx号,送快递的会给你堆到院子里,你写到xx楼,送快递的会给你送到电梯口,你写到xx室,他们才会给你搬到室内。因为送货的都是服务器厂商找的,你因为这个事情去联系厂商修改送货地址,至少要多等N小时。而且他们视你的单子的数量和楼层,判断来多少搬运人员。而且,一定要把服务器搬到你指定的地方再签字收货,否则……嘿嘿…… 我最霉气的是:来了20台机器(还好不多),下着大雨人家给我往院子里一丢,让我自己搬上19楼,我没推车没啥的…… 你可以说,找电信的帮忙撒,废话,这个我还不知道。那我告诉你,我在某电信大楼工作时,从CCIE到机房主管到机房工作人员,全部是美女…… 虽然我在这个地方只干了5天活,我的同事们口水都有3尺长……你还叫人家给你搬机器不? 你可以说,雇民工撒,我又不是没雇过,钱得你自己支付,公司不给你报销的话,爽不? 下面是拆箱子,面对着堆积如山的2000台服务器,我是连抬手的力气都拿不出来……当时机房只有我们公司3个人+电信值班2个人…… 这时候,我的办法是……我打电话找来了2队收废品的: 这么多箱子,除了机器和电源线留下,里头的导轨光盘等等你全部拿走,谁拆的多谁拿的多…… 最后按照我的要求帮忙搬到机柜上……于是我们5个人是监工……看人家拆箱子搬机器。 于是人家2队人找来了30多号人,一早上把2000台机器全部拆箱子完毕放到机柜上。 要是我们几个人拆,估计………… 最后再说个行价,服务器箱子一个价值5块钱甚至更多。你服务器到了,卖卖箱子请大家吃饭吧。别让扫地的阿姨拿走,几个无所谓,10来个箱子,够大伙儿吃顿烤肉了……还有EMC的木箱子……拿去养个小鸡小鸭的…… 42U机柜1U的服务器最好是16台。你就看着上吧。呵呵 四,安装系统和布线 好了,面对几千台服务器开始装系统,我不知道你会怎么想…… 全部是1U服务器有什么办法安装系统?(我们公司穷,买不起刀片;而且电信不配合,要是上刀片,电路你们自己拉线,价钱还是原来的价钱;最重要的……我们公司以人为本,宁愿多养个人也不愿意买个好服务器让人失业),而且不允许GHOST,因为你这是服务器,不是网吧……GHOST出来的系统,我不知道谁用过,爽不。我自己是郁闷郁闷到了,莫名问题的时候,你就知道GHOST还是靠不住的。 其次,我们公司安全部要求:必须得一台一台安装,先安装光板的系统(比如没有SP的WIn2000),然后手工打SP4补丁,不能网络打补丁。于是我们就光盘堆成山。最扯淡的,为了快,我做了一个补丁共享的服务器,所有的补丁CP的本地来打。结果忘记拔网线,导致人家说我们是插了网线打补丁,有中毒的危险,需要重装。我直接崩溃…… 办法1,你可以1台1台慢慢装,反正这么多机器,你可以管公司要更多的时间。但是我们公司一般是机器到了,最多2-3天就要要,一向是那种计划不如变化快的没有计划没有进度管理的“小”公司,项目组拿着鸡毛当令箭,牛x哄哄的公司。郁闷! 这个时候前期的准备就比较重要了(我公司多用windows2003),因为首先我要装一个光系统,再打驱动,再打补丁,再安装远程控制软件。一台机器装完大约要1小时多点。那么机器多了怎么办?光盘不够怎么办?等等问题就来了。 我的办法是,我一看TMD全部是DVD,IBM的机器直接佩combo,公司给我们发的全部是CD,娘的,典型的没有最慢只有更慢,出了问题闲你慢的领导班子。于是只好自己出钱买了DVD,用软件把RAID,网卡,显卡其他驱动做到光盘里,需要安装的软件也直接做成自动安装的方式,补丁也刻录到光盘里(我们要求补丁必须单打,不能安装集成补丁的ISO,shit),这样弄,你只用把光盘往光驱里一丢,分区一分,就可以下一台机器了。然后等你在去关注这个机器的时候,已经可以设置IP插网线了。灵感来自番茄花园。吼吼。 当然这时候你最好是买个KVM,16口的KVM,一次准备16张光盘就可以用一套键盘鼠标操作16台机器。当然啦,KVM是可以级联的,我最牛一次一次一套键盘安装166台机器。郁闷的是,塞光盘塞死,插KVM线插死,配置IP配死,有时候还会弄错…… 办法2,你可以用NETKVM去远程安装,但是你插那些NETKVM的线路,2000个插下来,爽不?然后你继续扎KVM和网线的时候,看着和瀑布一样的网线和KVM线交错在一起。估计直接崩溃。远程KVM有的牛x的是可以分发ISO的,就是传说中的远程分发安装。可以自己买一个研究研究了,我们公司以人为本,从来不买这类高科技。 办法3,我犯贱时候发明的:我们的机器全部是RAID1,于是我安装一台raid1的机器,系统全部安装好,然后拔掉一个硬盘,插上一个新硬盘自动恢复镜像,基本10来分钟恢复好一个硬盘,插到机器上去。这样,还是比装系统来的快。当然啦,型号是一模一样的…… 办法4,HP的ILO2功能,实现远程分发。前提你得一台一台配置好BIOS里的ILO2。也是蛮痛苦的。IBM和DELL现在也都有这个功能,但是你在分发以前,还是得一台一台机器插上网线,配置好BIOS的IP,痛苦。然后把操作系统和机器的驱动程序和后续的软件全部做到一张DVD里,让他自动运行。然后所有的服务器远程运营这一个ISO,最好多弄几台,否则一台机器弄的慢死。 办法5,绝对最简单的办法!!!就是买机器前,让厂家给你在硬盘里灌好系统,和你买笔记本一样,打开是个安装完成需要你输入序列号的系统。但是弱点是后续的软件需要自己装。因为服务器厂商是不会帮你安装别的软件的。 还有更多的办法,只是暂时没想到,大家也可以谈论自己的办法。互相交流嘛。(51CTO编辑注:其实现在已经有很多无人值守安装系统的管理软件,比如KickStart和现在流行的Cobbler,都是不错的批量安装工具,而且都是开源的。现在都追求自动化,希望越来越多的运维们将不必面对一台一台装机的困扰) 所以我喜欢linux,可以用N种办法安装系统。 windows就是个让IT人当装机男,挨踢人当民工。 好了系统装好了,电源线和网线连接完,和瀑布一样的。这时候还是尽量把他扎一下吧。 否则机器通风不畅,会导致热死。 简单办法就是电源线扎一边,网线扎一边。有钱的公司可以买个网线序号标,没钱就自己拿胶布标。 你可以随便扎,或者和给你老婆梳头一样,好好扎。哈哈 插交换机的时候,从上往下,从1-24往后,这样网络异常,数一下就知道了。 想来想去这里也没啥值得关注的地方。所以就几行带过。 五,资产统计 假如你的机器只有2000台反而好容易管理了,但是现在我要管理的全国IDC有31个,平均每个机房有不同品牌服务器1500台。 一共大约有45000台的样子(我的资产管理系统里的数字,不包含交换机,防火墙等) 这时候怎么办? 每季度和财务小MM一起出去旅游盘点IDC资产,幸福啊……(我们财务小mm很PL的哦) 到了机房就是我一个人干活点资产,小mm带着大口罩,披着双层的放辐射服…… 可怜我们这些干活的,短裤背心,IDC里一呆就是好几个月(IDC办公室就在机房边上……),不知道精子被辐射杀死多少…… 1,必须有资产管理系统,虽然这个其实是个很简单的数据库,但是你可以把每一台机器的品牌,硬件信息,操作系统信息,购买年限,质保年限等,你非常关注的东西做一个详细记录,并配发同一的资产编号。 比如我们的资产号,FWQ-123456 服务器-123456,这是一个总的资产号,这个服务器哪怕搬到美国,也是这1个资产,直到丢失,或者抛弃,都是这一个资产,永远不会变。 比如我现在的板凳就是一个资产号是:服务器-000010的一个4U服务器,配置是P2300*2 256M内存 16G硬盘×4 购买时间是1999年10月,从中维修过1次,升级过1次,在哈尔滨机房-广州机房-河南机房-北京网通机房-上海公司内部测试机房-上海库房服役过。 有历史吧……. 2,送到机房 看过我这个服务器去过的地方,羡慕不?见证我们公司的发展史。9年过去了,终于成了我的板凳…… 服务器在购买合同确定以后,就应该按照配置记录资产,并且在财务备案,资产编号一定和财务记录相同。这样这个服务器走到哪里,都有备案和记录。现在要把这个服务器送到某个机房去,搬着走吧……汗 送到机房,我们要给服务器按照财务给的表格粘贴资产编号,选个顺眼的地方,不会磨损的地方。 一般是机器正面某个地方,然后是机器屁股后面某个地方,然后机器侧面把手的地方,粘贴3个,以防掉了就烦了。 然后在粘贴这个机器的应用资产号和IP标签: 应用资产号举例:FWQ-SH-XX-B31-WEBSERVER 意思是:服务器-上海-xx机房-B列31号机柜-web服务器 IP标签举例:外123.234.123.234内10.0.0.1。这2个标签你可以分开也可以在一张标签上写清楚。 并且在安装服务器的时候。把FWQ-SH-XX-B31-WEBSERVER-123-234 把这个作为你的HOSTS信息,windows里叫做计算机名 这样远程上来都非常清晰自己在哪个服务器上,出问题时候也非常容易找到这个机器,不要闲麻烦,一切的麻烦都是为了以后快速的解决down机问题而做的。 当然啦,甚至在密码管理上你也可以用这个规则来设置密码,但是最好规则别让别人知道了…… 3,把这些信息全部录入你的资产管理系统 系统无非服务器名,IP信息,用途,机架位置,或者是否在使用一类的,我就不多讲了 4,资产系统软件交互,也可以说是监控系统。 企业可以开发一个软件,在装机的时候安装到服务器上。然后资产管理系统定时去取服务器上的信息,比如网络流量,CPU内存硬盘负载一类的东西,这样你的资产管理系统又变成了一个监控系统; 当然啦,你也可以在资产系统里集成一个远程桌面管理系统,自动载入用户名和密码,还有随机码,就可以登录系统。省的还得管理服务器密码。 然后用户的访问权限不同,看到的节面权限就不同。 比如说,监控人员没有登录权限,或者IDC人员没有登录权限一类。权限分配你自己研究好了。 5,还是IDC的工作。 话题继续回到我和财务小mm去盘点(你公司比较大的话,你可以多派几个人分开去各个地方……) 小mm一看我们机房服务器黑压压的一片,铺天盖地的,直接无语。为啥,因为要拿着资产表一个一个核对,面对几千个机器,直接晕倒。 虽然按照资产管理系统里导出的信息,机柜号,IP号,机器从上到下的顺序都非常精确,但是你一个一个核对,还是慢。 怎么办? 库房管理的工作用上了,哈哈。你买服务器或者买笔记本电脑的时候有没有注意到箱子上的条码? 那个条码非常清楚的记录了这个机器的详细信息。所以黑莓手机或者NOKIA手机(别的我没用过)都有扫描条码的功能……好像与主题无关…… 那么剩下的就简单了。 去买个这种条码标签的打印机,编辑成自己需要的条码,一个一个贴好,上面有你所有需要盘点的信息…… 比如我们是从资产到机柜号到服务器名字到内外网IP都要盘点……小崩溃 打印出来贴上去。然后买个扫描枪,和超市那种一样,不过你要买有存储功能的,否则你要端着笔记本去扫描,SB了。 然后我和财务mm本来需要一个人念号码一个人核对(你要直到在机房里大喊资产号,喊一天的结果是啥,自己想),现在一个人拿一个扫描枪,按照规则一个一个扫描。完成后把数据导出后重新整理分析。直接和数据库核对(当然这个也需要你自己开发),核对完成生成一张表。 表上写的非常清楚你哪个机架没有哪个机器,哪个机器不在特定的位置上,哪个机器缺少……等等 这样比如说,机器位置不对扣5块钱工资,机器IP不对扣2块钱工资,或者……反正扣到最后……这月不给发工资了,还得倒贴点……哈哈哈 六,监控架构 监控架构其实每个地方都有自己的做法,我也知道我的办法不是很先进,但是仍然拿出来和大家一起讨论 首先谈谈监控软件,一说起这个常用的东西MRTG,cacti一类的就都可以用了。只要稍微归类一下,流量展示看的还是很清楚的。 要是要监控服务一类的,那就只好启用大名鼎鼎的nagios,和一些牛x人基于这个做的一些别的商业软件。 或者就是自己做个脚本去定时探一下,不通了给你发邮件了啥的,你vim一下nagios的chack_xxx,学习一下里头人家探测的办法,自己也能搞出来个啥东西,都还是很不错的了。 作为IDC工程师,我们所要关注的东西就是个流量了,我们要很清楚某台65下的某台35上每个口的应用,当遭受攻击或者流量异常的时候,一眼就能知道是怎么回事。我不相信你天天看着10M的流量,某天突然一下给你来个80M,你说这是正常事件吧。哪怕正常,你也找相关的人确认一下吧,一个100m口跑 80M,估计电信的人都来找你了。 每天看着这些流量图是很枯燥的事情,那么我们没事只能想办法让他自动报警给我们了,于是EMAIL报警,然后把他发送到一个有手机提示新邮件的邮箱,你手机就有了。MSN报警,还是不错的吧,手机报警一类的办法都是不错的。这样你你可以和我一样放心的去打网游了。 这里只谈经验,不谈详细的技术,因为我一说我的系统架构地球人都知道我是哪个公司的了,虽然已经离职,但是咱也有个职业道德,谢谢。 当然了,有些公司是有网络监控部门的。但是我就一直在想这个问题,所有的数值都可以用短信报警,你随时都可以收到信息。用这个部门干啥,让一群可怜的家伙 8小时一动不动盯着屏幕,公司又在他们电脑上安装了抓屏软件,上班事件聊天上网就扣钱……我估计他们每天最期望的事情也莫过于服务器挂了,可以给我们打个电话重启个服务器或者连到服务器上检查一下啥问题,重启个服务了啥的。当然了,这些兄弟最后的职业方向也只能是进入运维部门了,至少公司服务器宕机维护的流程性东西掌握的非常熟练了。但是这是用好几年时间换来的经验,太……所以我是奉劝兄弟们有发现监控部门招聘人,就别去了吧。面前8台显示器,猛一看还以为是黑客帝国呐,结果仔细一看全tmd是流量图。常年对着8个显示器,那个辐射…… 我就不清楚设置个节点,出现问题告诉人,人去操作会死啊,非要让人和机器一样一动不动的盯着显示器,TMD,官僚。虽然我没经历过,但是想也能想到。做SA,最大的要点是懒,把一些需要人做的事情都自动化……但是话说回来,我公司以人为本,人海战术嘛,可以理解。 上面的帖子位子已经满了,下来的帖子在这里写。 企业实际面对的一些问题 我大概通读了veyron 大侠的文章,认为系统架构方面的我绝对不如他。我就不在这里卖艺了,那么我卖企业都会实际面对的一些问题。 1,自动化,流程化你的信息管理 为什么要自动化,这年头流行办公自动化,你丫没事还拿着工单四处签字,老土了吧。 为什么要流程化,这念头流行流程管理,假如你公司没有一个固定的流程管理,出了事情,大家都不知道怎么做,各个部门的电话乱打,大家都一锅粥没有效率。所以,未雨绸缪,在没有出问题的时候,模拟出问题,多多准备,建立规范的流程,公司的每个人都要遵守,这样,流程化的管理+办公自动化,大家只用在电脑上翘翘键盘,点击确定,流程就发出去,一路审批,OK,流程发送到做事的人地方,也许这个做事的人在美国,也一样方便。 上面说的是一个原理和意思,用这样的理念去管理你的服务器应该如何去做?当然了,你假如只有10来台服务器,就不用考虑这个了……. 首先服务器采购录入资产管理系统(详细见上面有写),服务器的去向和调度都在管理系统里有提现。 这里说的是:如何去上架,维修,下架等流程控制 先说上架下架:服务器到机房以后,别人要用服务器怎么办?先可以到你的资产管理系统里,看你机房还有什么配置的机器多少台,然后让他们选择自己项目服务器的配置,数量。在流程管理系统中,把这些机器选中,生成一个表单,表单名字为xx项目上架需求,写清楚谁用,做什么,数量,哪个机房等。然后提交给他们部门领导,他们部门领导同意后,转给需要审批的领导,一层层下来,流转到我们部门领导,我们部门领导流转给部门机房员工,员工收到流程,检查上架下架服务器;如要上架,安装完系统后填写IP,机器名,机架等相关信息。如要下架,删除相关信息,提交给流程控制的人员,流程控制人员确认后,这个流程完成。届时,所有的人审批过的数据,经手人,数据库里都有,出现什么问题找相关责任人,一下就找到了,省的和某些XX部门JJYY。 维修也一样了,机器坏了,或者需要重装系统,按照上面的流程,一步步走一遍,就可以了。年底统计机房一天要干多少活,省的某些领导认为机房人TMD都在闲着。机房的人呢?没有流程不干活,否则白干。 在流程系统里重启服务器,重启服务器要是要流程,就太慢了,那么你可以做一个绿色通道,写清楚原因,重启哪个机器,直接提交给相关机房人员,在你的流程系统里绑定一个短信网关,机房人员可以收到需要重启服务器的短信。准确无误。 这样代替了无纸化办公,既有自己做的事情的每一个记录,又有相关人员管理,可以量化自己的工作,免得年终奖的时候xx人有说你干的少,发的少。你把记录拉出来对比对比就知道谁多谁少了。 2,如何升级你的服务器 服务器老了,或者需要加内存加硬盘,怎么升级。 虽然说是很简单换个CPU,加个内存,加个硬盘很简单。 但是,如何控制你的配件不丢失,确定的安装到机器上利用了呢? 简单,在服务器上做一个探测服务器配置的客户端,每天探测一次硬件配置发送到资产管理服务器上。 与资产管理系统的硬件配置做对比,出了问题就报错发一封邮件到机房工作人员,抄送流程控制人员一封就可以了。 至于的加内存的时候注意型号啥的问题就不说了,大家应该都没问题了 要说的是,假如你一个机柜上放的机器比较多,比如4个6个机器一摞,恰巧坏了,恰巧一个人在机房,非得解决,怎么办? 简单,一个办法,但是还是需要你有力气,虽然有力学原理 比如有4台服务器,最下面的坏了, 你可以拽住最下面的把4台一起往出拉,拉出来一点,把上面3台往后推,这样一点一点的拉出来, 下面最关键: 拉到最后,前面要留出来一点,轻轻的把上面3台的尾巴着地,然后一只手抬住上面3台机器,一只手拉出下面一台机器。 上面3台一定要留出来一点,否则放下的时候,机器和机柜托板会压住你的手,你一松手,机器震一下,硬盘就挂了…… 所以在推进去的最后仍旧要留一点在外面,最后放下来了再推进去这最后一点。 然后就可以换或者加内存了。相对比较省劲,不危险,不会压倒自己,不会砸坏服务器的办法就是这样了。

优秀的个人博客,低调大师

Java架构师必备技能:Redis+SpringMVC+RPC框架+MySql+JVM

本课程主要是分享当前互联网行业热门和新兴的技术,目的在于培养互联网架构师,课程内容包括Java互联网技术/高并发/高可用/高扩展/性能优化/源码分析/项目实战架构实战等知识点。讲师团队均来自于一线互联网公司,有多年技术研发和教育培训的从业经验,通俗易懂、幽默诙谐的授课风格,让知识不再干涩,让学习成为一种享受。 适合人群 1.在职Java程序员 具备Java基础,热爱互联网技术 2.技术进入瓶颈区 工作几年,技术平平没有核心竞争力,不知道学什么,不知道怎么快速成长 3.拒绝平庸 期待蜕变 拒绝成为一个简单的搬砖coder,期待思维和能力的蜕变 4.有进入一线互联网公司梦想 梦想还是要有的,万一实现了呢 来这里学习,去BAT工作 课程目录 每节课程课后都有视频课提供复习,都是免费的为什么不来学习提升一下自己呢 课程大纲 架构筑基篇 性能优化如何理解 常用工具调优 linux基础与进阶 开源框架篇 Sprng5框架 AOP源码解析 Mybatis IOC源码解析 Spring MVC 高性能架构篇 分布式架构思维 分布式协调和分流 高可靠数据储存 缓存和NoSQL 异步与消息中间件 分布式解决方案实战 微服务架构篇 SpringBoot SpringCloud Docker虚拟技术 Dubbo应用及源码解读 团队协作开发篇 Git Maven Sonar Jenkins B2C商城项目实战篇 系统设计 用户管理子系统 搜索子系统 订单子系统 商品管理子系统 支付系统 后台系统 分布式调度系统 学无止境,每天进步一点点,让自己的技术栈得到一个全面的提升,需要学习地址以及往期视频学习资料加入Java填坑之路:860113481

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册