2016年大约一半时间在深圳,一半时间在广州;而2015年大约一半时间在北京,一半时间在深圳。说来也是个对称的事情。兜兜转转,现在又回到深圳,感觉又回到了起点。这折折腾腾看起来挺好,但是很多失去了连续性,并不是太好的事情。

回顾

这一年的关键词也是跳槽,分割线也大概是在年中的时候,秉承着互联网改变各个行业的理念,到了非互联网公司。

上半年

先说说上半年的这家公司,其实去年的总结也有提到了,其实去年就不大想待下去了,不过不好频繁跳槽,好不容易熬到了过年,所以跳槽还是挺顺理成章,不过深圳这边可选的公司并不是太多,至少不像北京那么多,主要是有工程师文化的公司并不是很多。鹅厂有着深厚的产品文化,对工程师并不是太友好,具体我也就懒得说了,别人道出我的心声:腾讯一年感受。原本呢,我还是秉持比较谨慎的态度的,没有文字说出来,怕有失偏颇,不过看到同道中人也是这样的观点,那我也就放心了。当然,高层也有所觉察,去年圣诞晚会就有强调要警惕今日头条这类科技公司,将来可能要颠覆掉腾讯新闻,今年也更加强调科技,老板说,这是腾讯史上人数最多的股东大会,“第一次提出,腾讯未来要成为一家领先的互联网科技公司”。也许会渐渐改变吧,期望对工程师越来越好,比如27寸显示器+macbook。

下半年

上半年末到了非互联网公司,不过还是有些许工程师文化,mac air + 25寸显示器 + git。说实话,不是太喜欢不用mac、不用git的公司。今年所有的技术上的成长,都在这里了,毫无疑问,这就是跳槽的好处,很多新技术,没有氛围和实战的场景,光靠自己是很难搞起来的。主要是经历了从传统SOA到微服务的转变,另外由于之前在未经历过前后端分离,也一起经历了。微服务+docker+k8s,很浓重的devops的味道。当然也是有些磕磕碰碰,不过新技术就是要去尝试。另外职责上从以前的纯后端,到整个项目,基本上除了前端开发,其他的多多少少都有些涉及,算是开拓了视野,也算是打杂了一些。下面就一一说一下吧。

1、前后端分离

前后端分离之后,后端变得简单一些,基本上纯提供简单的api,前端的逻辑会重一些,这就对前端工程师的能力要求会高一点。其实逻辑移到前端,对于java工程的好处是,前端是天然异步的,可以很好地更细粒度地请求后端api,这样服务更轻量,大大降低了出现后端服务哪里有问题,导致整个页面出不来的情况,而且前端天然异步,可以很好地并发请求,这样可以很好地handle个别服务故障的情况。

前后端分离之后的第二点就是要处理跨域问题,前端有两类方式来处理这个问题,一个是使用nodejs,前端本身就可以代理后端服务,不过这也就增加了对前端工程师的能力要求。不过前端最近技术更新太快,2016年里做前端是怎样一种体验。原本自己有点想学前端的,不过后来自己折腾了一下,有点不知所措了,前端一部分越来越演变得像后端了,新技术太多,感觉有些复杂化。另一个处理跨域的方式就是用nginx转发,前端工程本地开发的时候,使用node的httpproxy,配置一个nginx的地址转发即可,这样所有后端接口的维护都由后端统一维护,前端只管基于相对路径的请求。原本自己走了点弯路,让前端自己本地搭建nginx去转发,结果发现前端对nginx实在是一窍不通,另外把api的转发配置也给暴露到前端了,不是太友好,而且前端的开发环境并不是太统一,有的用windows有的用mac,所以各种配置起来有些麻烦,期间虽然有尝试过用docker,但是也是增加了对前端人员的要求,最后还是回归到前端本地开发使用nodejs的本地代理,仅仅做本地开发用,生产环境还是用nginx。

说到nginx,也算是今年接触比较多的,以前仅仅做java后端,不涉及这么多,现在接触nginx也算开拓视野吧。之前公司还是用淘宝的tengine,没想到时隔几年openresty大势崛起。于是,也就是开启了nginx+lua的开发模式了。对于用惯java的来说,对于nginx的秒级重启,感到非常的爽歪歪。一开始还不是太习惯lua这种脚本,一来没有ide可以提示和debug,二来对lua不是太熟悉,有些排斥。不过后来渐渐喜欢上了,主要是秒级重启,非常之快速。另外就是使用nginx作为api-gateway,相当地成熟,不像spring cloud的zuul,坑还是比较多的(比如之前的一些版本不支持url中带冒号的),另外对于java启动慢,占用内存多,有些不放心,所以整体还是非常喜欢openresty,希望明年继续进阶,希望能够熟练掌握。相比于zuul,nginx唯一不大好的是不能够做到服务的自动发现,不过这个主要是看你怎么使用了,也有通过etcd去动态配置nginx的,当然我们没有搞这么复杂,整个都抛给k8s了,nginx转发到服务暴露的externalIP,由k8s去处理服务的扩容伸缩啥的。

2、微服务架构

以前还是soa(单体架构),没想到今年微服务这么火,感觉自己如果不是跳槽,估计没这么快接触到微服务,所以,这个也是跳槽的好处。微服务与SOA的关系呢,层次不一样,不是很好比较,不过大致认为,SOA是偏架构层面的,而微服务是SOA的一种特定方法,就类似XP/SCRUM之于敏捷开发。
简单列一下微服务的好处吧:

主要的还是化繁为简,去中心化,解构,把以前的单体架构,重量级的服务都微服务化之后,各个服务之间耦合不那么多,就可以自由更新。不用担心系统升级之后,哪个以前的旧功能受到影响,还得小心翼翼地回归。服务更加内聚,影响范围在可控的范围内。当然并不是所有的服务都能这样,比如一些公共基础设施的服务,比如登录服务。

我们主要是用spring cloud全家桶来进行微服务,得益于netflix oss的技术栈,中小公司可以不用自己重复造个轮子,spring cloud拿来即用。当然这也得益于springboot的兴起,想想以前在公司里头,还得研究不同环境的不同配置文件怎么处理,然后配置文件里头的数据库密码啥的怎么加密之类的,springboot的profile很轻松地可以解决环境配置问题,spring cloud的configer server的encrpt功能则可很轻松地解决加密问题,一起都是那么easy,突然间你会发现,以前自己苦苦研究的东东,在大浪潮前面被轻松超越。spring的很多东东都比较好用,比如spring session,轻松解决分布式session问题,简单添加几个依赖和注解就ok了,还有spring data系列,类似的repository,通过约定的findByXXX等屏蔽底层的数据库细节,当然里头有些坑,比如mongo的findOne,就是会自动取一条,而jpa的findOne,如果有多条会报错,不过整体而言还是挺好的,比如分页功能就很好用,通用的方法,从pg切到oracle,改下驱动基本就ok了,根本就不用去处理oracle麻烦的分页方式。另外,关于服务之间的熔断,hystrix就提供了很好的支持,非常好用,大大提升服务的高可用。

忍不住说几句Spring Cloud系列,就是eureka的设计是AP的,强调高可用,但是这个需要看场景的,有的可能喜欢CP的设计,那么eureka就不那么适合了。自己使用的过程中特别想吐槽的有点就是eureka这个每次通过eureka去做服务发现,都需要等一段时间,有点费劲,另外,如果是搭配k8s一起使用的话,那么Spring Cloud全家桶的功能有些会跟k8s重叠的,比如服务路由发现。因此相对而言,如果不存在后端服务间的交叉调用,那么其实用Spring Cloud的ribbon、eureka其实可能不是太合适,当然有hystrix还是很好用的,不过也存在误判。

3、万物docker化

docker也是今年主要的收获之一,特别是大部分生产的服务都是跑在docker上面的,包括pg、redis、kafka等等,感觉非常爽。docker来了,更简化开发,更devops。

怎么说呢,用了docker之后,个人就可以研究很多集群的东东,这是以往使用visualbox或者vmware无法比拟的,非常是便捷,新技术就是好。

当然使用docker之后,还需要一个掌舵的,我们使用的是k8s,G家的东东。

盘点及展望

总的来说,今年主要是延伸技术视野,跟上了docker、k8s以及spring boot和cloud的新技术,外带个openresty。技术深度的话,都不是太够,明年需要重点关注下。

去年的愿望,实现了一点,那就是“在sg的声望破1000”,其他的还有待继续努力。展望下明年:

  • 深入系统设计,这个才是抵抗技术更迭太快的秘密武器

  • 夯实基础,比如计算机网络、算法等

  • 深入一些常用的东东:Spring Cloud、Redis、Mongo、PG

具体的指标呢:

  • 继续每天sg博客,继续提升sg声望

  • 多回答stackoverflow的问题

  • 每周末技术复盘

  • 夏天还是需要继续跑步,期望能学会游泳

  • 少加班、多提升时间以及项目管理能力

嗯,就先这样吧,咖啡馆写了一下午,准备去吃晚饭了。

doc

03-05 19:07