首页 > 代码库 > 架构师之路--谈架构师的基本素养和[干货]日志处理

架构师之路--谈架构师的基本素养和[干货]日志处理

  由于前两篇文章的关系,最近收到很多朋友的反馈和私信,谈如何成长为一个架构师的问题。在这之前我很少有时间去考虑这个问题,因为我总有做不完的事儿:看不完的书,解决不完的问题,干不完的活儿……  不是我干活儿慢,实际情况恰恰相反。但是我总是能给自己找很多的事情。我的桌面上有好几个txt,里面记录着各个方面要做的事情,看书过程中发现的问题等等。去年有一段时间很闲,我每天干着公司里的活儿,自己创着业,一天还要写一两篇专利,还是感觉很闲。其实就是想的少,做的不够细。而一个人能给自己找到多少要做的事情才是一个人真正的潜力。下面谈一谈对架构师基本素养的个人理解:

素养一:知识面

  知识面宽不一定是需要做的有多好,可以仅仅是爱好。医学,心理学,生物,画画,外语等等。看过我前面博文的朋友可能还会记得我文章里有自己随手的涂鸦,还有不着调的舞蹈和唱歌视频,歌词都是自己编的。博客页首的横幅是我本人的PS作品,里面那个女孩子是P的自己[擦汗]。网页三剑客我是用的很熟的。被大家吐槽的丑丑的博客页面也是自己的前端作品[再次擦汗]。知识面决定一名架构师的能力和灵感。一名成功的架构师对知识储备要广。特别是对自己专注领域的最新技术和成熟技术方案要了如指掌。需要对相关领域的最新技术保持敏感。

  发现很多名副其实的架构师都有我说的特质。<Thinking In java>里作者花了一页的篇幅说书友吐槽说此书篇幅太大,而作者很努力的在压缩篇幅了,还是有1k多页。然后紧接着下面有近一页介绍了自己的封面设计[汗]。感谢部分倒是每本书都有,但是这个作者连咖啡和猫都要感谢一下[汗]。

素养二:靠谱

  这半年来,经常有来这边挖人的。有之前的领导,之前帮过我的人,只要我说过有合适的我就推荐给他的人, 都真的收到了我给的推荐简历。虽然距离之前领导来挖人已经过去半年了。但是,只要我答应过的我都记得。所以值此乐视风口浪尖之际,我很少敢在圈子里说话,不然……,你懂的[汗]。 之前做私活儿,请朋友帮忙调过一个前端bug。这里我要由衷的感谢一下上帝,给了我一群靠谱的朋友。后来我拿到了项目款,先给朋友发了个百元大红包。朋友说感谢红包但是以后别再给了,又不是啥大事儿。但是我觉得做人要厚道,决不能肥了自己亏了别人。

素养三:广交朋友

  我的技术在朋友圈里是个小喽啰。几个月前给了两万块钱给一个朋友让他帮我炒股。签的半年合同,现在怎么样了我也没问。用人不疑,疑人不用。这个朋友我是怎么认识的呢?我之前就见过他一面,去58面试,他是面试官。我认识一个大牛是58的一个部门领导。之前是同事,我什么水平其实都清楚。所以面试的时候,面试官说咱们随便唠唠,然后真的是基本啥都没问,就是唠嗑,主要是听他讲技术和他的经历。然后他让我先等一下,找了另一个上级说我啥都会,然后回来继续唠嗑。然后我留了他的QQ,没事交流一下技术。多和技术牛人聊天能够拓展思维,还能了解技术前沿。还有,这些技术牛人基本不会叫我姐[汗],听到谁叫我姐,我基本上就不想再说话了[擦汗]。我家小鲜肉深譪其道,有次下幼儿园对奶奶说:“奶奶,麻麻是女神。”  奶奶没明白,就说:“啥,女神?你妈还女总统,女皇帝呢!”[狂汗],什么叫18个代沟!

素养四:不断学习

  我们大领导,大部门总架构师。我们大领导手下的领导都已经不编码了。但是我们领导自己手头还有一个自己开发维护的项目。有次有个同事有问题和那个项目有关,要找那个项目的开发。听说是我们大领导大吃一惊,另一个人回答说:“大领导对编码有特殊的情节。” 大领导精通php,python,perl,熟悉C。前段时间来找我让我给几个php同事讲java。我以为大领导只是个组织者。后来才发现,大领导自己有很强烈的学java的愿望,不服不行。

素养五:坚持

  来乐视之后遇到很多之前人人网的同事,跟他们打招呼,好久他们才反应过来。因为在人人网的时候,我家宝宝还小,为了宝宝的营养,我把自己喂到170多斤。一顿饭,吃几个菜,饭后再来一只烤鸭。好几年都很胖,坐地铁不用排队,公共交通都有好心人给让座[捂脸][崩溃]。楼下大妈看到我家娃都那么大了,我还那么胖,就喳喳嘴说:回不来喽。所以我可以理解原同事们认不出现在90多斤的我。两年多基本没吃过晚饭。记得那时候有次下班车回家,路上是各种小吃,闻到那香味都想哭,还是坚持下来了。在我减肥成功后,身边的女孩子都变得很瘦了。就像之前在东软,我用一年过了日语一级之后,和我走的近的女孩子们都在之后很短的时间过了二级。坚持是很容易感染人的。

  坚持对工作的作用,一件小事可以体现:我每个工作日晚上9点多回家。不管是周五,还是放假前最后一天,天天这个点。刚开始的时候,小鲜肉不习惯,我就跟她说妈妈回来的晚,但是每天会给你带一个玩具,第二天早晨你起床就看到了。第一个星期每天他都有玩具很开心,我11点多到家,他睡得很香。到第二个星期,我跟他说:妈妈刚在网上买的,明天能到。于是第二个星期,隔一天他得到一个玩具,我11点多到家,他睡得很香。过了几个星期,放三天假,他发现了我藏起来的很多新买的玩具。我说那你现在都拆了这些玩具,下星期就不能管我要玩具了。结果,他真的没要,而且以后都忘记了玩具这回事儿。而我每天固定的点下班,工作日天天如此。

素养六:专业

  咱们常用的中文分词器有:IK分词器,中科院分词器,庖丁分词器。我觉得这个庖丁分词器名字起得特别好,庖丁分词器全名叫“庖丁解牛”,形象的说明了此分词器的作用。而庖丁是个名词,一看作者就是很懂面向对象的。统一建模语言画图的时候,类用一个方框表示,体现的是其封装性,类型在最上面,中间是数据成员,下面是方法,很好的展现了类的结构和本质。之前有个同事,他学物理出身。当时也是刚转程序员哈,写代码的类名和方法名都起得很长。类是一个对象,这个对象的分类,显然是一个事物,怎么可能有那么长的名字。方法名里面包含了那么多and,很明显的违背了面向对象的单一职责原则。他写的类基本不用接口,显然是还不知道隐藏实现是干什么用的,也更没想到里氏替换了。活儿,好像是人人都能干,素养,细节处还是可能看出来的。

  

下面是一如既往的干货时间,今天来聊聊日志处理。

  JAVA的日志大家基本都在用slf4j。SLF4j(Simple Logging Facade for Java)是一个通用的日志框架。里面只定义了接口,是门面模式的典型代表。提起门面模式又想起来一个典型代表:spring mvc里的上下文,不管用的具体实现是哪一个,都走统一的接口:ApplicationContext。实现门面模式的技术叫动态绑定,是Java多态的一个体现。

  slf4j刚开始使用的时候遇到了很多问题,因为大家都在使用自己的日志系统和通用接口。比如:common-logging(jakarta common logging 简称jcl)是apache提供的一个通用的日志接口。用户可以自由选择第三方日志组件作为具体实现。具体实现比较常用的有java.util.logging,log4j,logback。由于logback在性能上的改进。所以实现上大家普遍选用logback。但是像java基本类库和apache一些类库里本来已经使用了其他的,这时候就需要用到桥接模式。slf4j用于桥接的jar包邮log4j-over-slf4j.jar(桥接log4j),jcl-over-slf4j.jar(桥接common-logging),jul-to-slf4j.jar(桥接java.util.logging)。工作原理就是包含了大部分使用的类的代替类,重新把所有的工作指向相关的slf4j类。其实每一种桥接都对应了一种驱动,将slf4j强制交给某个实现来执行的,对应一种实现的桥接和驱动不能同时存在,否则,想想都知道,根本启动不了。logback的驱动类是logback-classic.jar。下面借用之前给组内人员做技术分享时的一页PPT:

技术分享

 

  一般做业务,开发的时候sql错误是大家很关心的。使用经典的springmvc+servlet容器+ibatis架构,SQL的输出需要额外的包装。比如号称是最好用的数据库连接池的druid或者直接将数据库驱动改用log4jdbc。用法自行百度,本姑娘只讲原理。

  SLF4j的优势在于上面介绍的与客户端解耦和采用占位符减少字符串拼接节省内存。原理就是slf4j中提供了ILogger和ILoggerFactory接口。其实现Logger类用来打印日志,LoggerFactory类用来获取Logger。而类实例是通过StaticLoggerBinder类来定义。这个类是实现slf4j的驱动自行定义的统一入口。SLF4j没有实现StaticLoggerBinder,只是负责使用类加载机制加载它。

技术分享

  虽然主流的日志实现都是采用这种方式实现的。但是slf4j还提供了SPI的接口支持。因为没有主流对应的实现,介绍SPI还是用我所擅长的搜索引擎来讲。先介绍概念:

  SPI(Service Provider Interface):这是jdk1.5的一个内置标准,允许不同的开发者去实现某个特定的服务,是一种服务提供发现机制。实现时需要声明一个service provider,它在jar包的META-INF目录下创建一个service子目录,并且为每一个service provider提供一个以service全名命名的文件。下面是lucene源码中的截图。大家要是对SPI感兴趣,可以研究一下java.util.ServiceLoader的源码。类加载机制的原因,service provider的声明和实现类必须要在一个jar包里,来保证安全。lucene的自己的测试框架中必须要声明其编解码器,就是用的SPI。

技术分享

  我们现在用的Dubbo框架也是基于SPI机制提供扩展功能。可以支持不同的传输协议。

 

   下面来谈谈我们业务中对日志处理的运用。每个项目都有自己的业务日志。那么我们部门总架构师,我家微微一笑很倾城的男神老大想要查看自己下面的子业务的健康状况怎么办呢?

  一般来说每个公司都会基本的监控,最常用的三大开源运维监控工具zabbix,nagios和open-falcon。在之前的公司,运维用的是nagios。来乐视之后,刚开始用的是zabbix,后来换成了falcon。但是这些都是基于脚本的,只能进行一些基础监控。这类监控属于故障快速发现类。美团点评研发了一款分布式实时监控系统叫CAT(Central Application Tracking), 是基于纯Java开发的分布式实时监控系统。可以基于日志埋点做更细粒度的监控。它属于系统问题分析类。

  大公司的架构除了平时的业务架构,技术架构,软件架构之外,还有一块是团队能力建设。打造团队核心竞争力。考虑这方面,设计构建自己的中间件就极为重要。这一块,在我们部门,除了我在做的搜索引擎中间件,还有阿里来的阳哥设计了一款异常统一处理平台。这个就是用spring mvc创建一个java bean。这个bean拦截了所有error级别的日志,将它异步发送的统一的redis集群。有统一的日志服务端再进行更详细的处理:包含给相关人员发报警邮件,有统一的日志分析平台,便于对各个模块的性能,代码质量做量化。logback本身也是可以发送报警邮件的。但是这个有性能问题,报警邮件过于频繁会影响正常服务的。

  下面说一下CAT。我们目前线上也在用这个东西。CAT的一个重点是埋点,它决定了实际上能做的事情。

  • Transaction埋点,主要记录一些跨项目,跨模块一些调用。最主要有远程服务,数据库以及缓存。
  • Event埋点,主要记录事件以及异常。最常见的场景就是当埋Transaction时候,需要event作为补充,比如记录当时访问参数,特殊诡异路径的分析,还有异常信息记录。
  • Metric埋点,主要用于记录一些实际的业务指标,用于运维监控。Metric本身就是一个针对周期性时间序列的实时的Metric监控系统。
  • Heartbeat埋点,表示程序内定期产生的统计信息,如CPU百分比,内存百分比,连接池状态,系统负载等。
  • Trace埋点用于记录基本的trace信息,类似于log4j的info信息,这些信息仅用于查看一些相关信息。

  CAT监控系统将每次URL,Service的请求内部执行情况都封装为一个完整的消息树,消息树可能包括Transaction,Event,Heartbeat,Metric和Trace信息。

  昨晚跟一个美团点评的哥哥聊天,了解到美团喜欢用数据说话,这个CAT的数据是这样的:号称单台机器QPS 15w。然后:我们没有那么大并发,所以没试过是不是真的[擦汗]

=============================== 华丽的终止符 ================================

架构师之路--谈架构师的基本素养和[干货]日志处理