[置顶] 2016年终总结

1、技术总结
(1)App/JavaWeb后台系统
1.一、采用RestFul架构的SSM(Spring SpringMVC MyBatis)框架集成开发的App后台系统,将用户鉴权分离出来单独的模块,将用户鉴权登陆状态Token保存到Redis内存数据库中,从而便于上层业务后台系统弹性部署,提升系统的可用性和伸缩性,也为API高并发访问提供安全基础。
1.二、后台系统尤为是Web或App后台一般由后台处理业务相关数据展现到前端页面或返回Json字符串数据到客户端。项目随着业务发展和用户数的增多一般会不断重构,采用Maven进行项目构建和做为项目管理工具,将项目制做成Maven多模块,core模块、service模块、web模块、common模块、controller模块等。
1.三、MVC模式分modle层、dao层、service层,controller层。model层用于将业务实体封装成数据模型,dao层用于操做数据库的接口层,service层用于调用dao层和外部系统的接口层,比较复杂的业务逻辑通常都按原子性操做封装在service层,controller层主要用于控制分发,将业务处理结果的Json数据或前端页面分发到客户端访问层。
1.四、工做到如今用过不少API,JSON格式和XML格式都有。总结使用经验以为JSON格式的更好用。JSON格式一般是更为简洁的(以致于传输的数据量更小),也更容易展示复杂的对象(精确)并且能运行得像其余格式同样好。
1.五、用设备号/设备mac地址做为Token:服务端接收到该参数后,便用一个变量来接收同时将其做为Token保存在数据库,并将该Token设置到session中,客户端每次请求的时候都要统一拦截,并将客户端传递的token和服务器端session中的token进行对比,若是相同则放行,不一样则拒绝。
1.六、对于一些须要异步处理的,不要直接new一个thread,应当使用线程池。使用线程池的时候应当对线程数量大小合理设置,通常最大不超过50个,固然还须要考虑你的IO和CPU。容器类变量,若是变化比较大且频繁,尽可能定义的时候设置初始容量大小,减小扩容带来的消耗。分支判断if…else的时候,最常符合的条件处理放在前面。对象比较的时候常量放前面,养成好习惯,减小空指针的出现。减小synchronized中等待处理的代码,能放在外面就尽可能放在外面。
1.七、关于数据,通常查询比较慢,颇有多是没有建索引或者索引没用到,多去检查一下。两个大表的关联查询,可使用二次访问数据库替代,先查出A表的数据,利用关联字段再查B表的。不要一味想着一条sql搞定最好。坚定避免,查全表数据或者数量大的数据,返回list加载到内存中,一不当心查了100w数据,又查得比较频繁,内存的爆了。有这种风险的改为分页查询。不要select *,按需取列。多考虑避免事务里面有长链接或者长事务,若是大量这种状况出现占用数据链接,会影响性能。一些无必要的逻辑能够放到事务外执行。对字段的加减乘除处理放到sql,严格避免先get处理,而后运算在set到数据库里面,并发状况很是容易致使失真。
1.八、方法里面代码不要太长,注意封装,命名语义化,代码整洁。
(2)、基于Netty底层通讯的消息推送系统的研发
2.一、NIO类库的异步通讯框架架构特色是:异步非阻塞、基于事件驱动、高性能、高可靠性和高可定制性。
2.二、提供对多种编解码框架的集成,包括谷歌的Protobuf、Jboss marshalling、Java序列化、压缩编解码、XML解码、字符串编解码等,这些编解码框架能够被用户直接使用。
2.三、提供形式多样的编解码基础类库,能够很是方便的实现私有协议栈编解码框架的二次定制和开发。
2.四、基于职责链模式的Pipeline-Handler机制,用户能够很是方便的对网络事件进行拦截和定制。
2.五、全部的IO操做都是异步的,用户能够经过Future-Listener机制主动Get结果或者由IO线程操做完成以后主动Notify结果,用户的业务线程不须要同步等待。
2.六、随着网站规模的不断扩大,系统并发访问量也愈来愈高,传统基于Tomcat等Web容器的垂直架构已经没法知足需求,须要拆分应用进行服务化,以提升开发和维护效率。从组网状况看,垂直的架构拆分以后,系统采用分布式部署,各个节点之间须要远程服务调用,高性能的RPC框架必不可少,Netty做为异步高性能的通讯框架,每每做为基础通讯组件被这些RPC框架使用。
2.七、阿里分布式服务框架Dubbo的RPC框架使用Dubbo协议进行节点间通讯,Dubbo协议默认使用Netty做为基础通讯组件,用于实现各进程节点之间的内部通讯。其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用Netty进行异步/同步通讯。除了Dubbo以外,淘宝的消息中间件RocketMQ的消息生产者和消息消费者之间,也采用Netty进行高性能、异步通讯。
(3)、Jenkins持续集成
3.一、对Git、JIRA、Jenkins、GitLab、Maven等自动化的基于主干分支开发方式的持续集成,Jenkins Maven自动测试、持续构建,Jenkins持续部署,持续交付等集成工具的安装使用,及基于此基础上的项目管理和项目交付。
3.二、Git主干开发开发方式,每一个人在项目经理安排的任务下,基于需求开发,此时都基于develop建立一个特勤分支,如,develop-zhanghaiyang分支下开发本身的需求,本地开发完成经测试无误合并到develop主干分支,下面能够通知测试人员测试刚开发的需求。
3.三、GitLab或开源中国Git托管或GitHub托管平台均可以设置钩子和Jenkins集成,Jenkins一旦检测到设置好的分支有推送或合并响应会从新利用Maven进行构建和自动化测试,测试经过后进行从新部署,即实现需求到开发的持续集成,开发到测试的持续测试,测试到应用交付的持续交付。
3.四、JIRA是很优秀的开源的项目Bug跟踪管理工具,从项目需求到开发测试交付的整个流程的bug跟踪,便于各个层面的人员进行协调,减小项目开发过程当中开发人员与测试人员,产品经理与测试人员等沟通成本。
3.五、GitLab是相似于GitHub的代码托管软件,即Git服务器,著名的开源中国码云就是基于GitLab二次开发的优秀的Git代码托管平台。
(4)、Docker容器使用
4.一、简化配置:这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各类配置不同的平台(软件、系统),Docker在下降额外开销的状况下提供了一样的功能。它能让你将运行环境和配置放在代码中而后部署,同一个Docker的配置能够在不一样的环境中使用,这样就下降了硬件要求和应用环境之间耦合度。
4.二、代码流水线(Code Pipeline)管理:前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,须要通过不少的中间环境。而每个中间环境都有本身微小的差异,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单很多。
4.三、提升开发效率:不一样的开发环境中,咱们都想把两件事作好。一是咱们想让开发环境尽可能贴近生产环境,二是咱们想快速搭建开发环境。理想状态中,要达到第一个目标,咱们须要将每个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,咱们却不想每次都须要网络链接,每次从新编译的时候远程链接上去特别麻烦。这就是Docker作的特别好的地方,开发环境的机器一般内存比较小,以前使用虚拟的时候,咱们常常须要为开发环境的机器加内存,而如今Docker能够轻易的让几十个服务在Docker中跑起来。
4.四、隔离应用:有不少种缘由会让你选择在一个机器上运行不一样的应用,好比以前提到的提升开发效率的场景等。咱们常常须要考虑两点,一是由于要下降成本而进行服务器整合,二是将一个总体式的应用拆分红松耦合的单个服务。
4.五、整合服务器:正如经过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker能够整合多个服务器以下降成本。因为没有多个操做系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker能够比虚拟机提供更好的服务器整合解决方案。
4.六、调试能力:Docker提供了不少的工具,这些工具不必定只是针对容器,可是却适用于容器。它们提供了不少的功能,包括能够为容器设置检查点、设置版本和查看两个容器之间的差异,这些特性能够帮助调试Bug。
4.七、多租户环境:使用Docker,能够为每个租户的应用层的多个实例建立隔离的环境,这不只简单并且成本低廉,固然这一切得益于Docker环境的启动速度和其高效的diff命令。
4.八、快速部署:在虚拟机以前,引入新的硬件资源须要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker经过为进程仅仅建立一个容器而无需启动一个操做系统,再次将这个过程缩短到了秒级。这正是Google和Facebook都看重的特性。
(5)、网站架构设计
5.一、性能:性能是网站架构设计的一个重要方面,任何软件架构设计方案都必须考虑可能带来的性能问题。也正由于性能问题几乎无处不在,因此优化网站性能的手段也很是多:浏览器端:能够经过浏览器缓存、页面压缩传输、合理布局页面、减小Cookie传输等手段,甚至可使用CDN加速功能。应用服务器端:可使用服务器本地缓存和分布式缓存,也能够经过异步操做方式来加快响应,在高并发请求的状况下,能够将多台应用服务器组成一个集群共同对外服务,提升总体处理能力,改善性能。 数据库服务器端:可用使用索引、缓存、SQL性能优化等手段,还可使用NoSQL数据库来优化数据模型、存储结构等。衡量网站性能有一系列指标,重要的有响应时间、TPS、系统性能计数器等,经过这些指标以肯定系统设计是否达到目标。
5.二、可用性:可用性即可以不间断提供服务的时间。几乎全部网站都承诺7×24小时可用,但事实上任何网站都不可能达到彻底的7×24,总会有一些故障时间,扣除这些故障时间,就是网站的可用时间。一些大型网站能够作到4个9以上的可用性,也就是99.99%。网站高可用的主要手段就是冗余,应用部署在多台服务器上同时提供服务,数据存储在多台服务器上相互备份,任何一台服务器都不会影响应用的总体能够,一般的实现手段即把多台服务器经过负载均衡设备组成一个集群。 衡量一个系统架构设计是否知足高可用的目标,就是假设系统中任何一台或者多台服务器宕机时,以及出现各类不可预期的问题时,系统总体是否依然可用。
5.三、伸缩性:大型网站须要面对大量用户的高并发访问和存储海量数据,网站经过集群的方式将多台服务器组成一个总体共同提供服务。所谓伸缩性是指经过不断向集群中加入服务器的手段来缓解不断总体上市用户并发访问压力和不断增加的数据存储需求。衡量架构伸缩性的主要标准就是是否可用多台服务器构建集群,是否容易向集群中添加新的服务器。加入新的服务器后是否能够提供和原来的服务器无差异的服务。集群中可容纳的总服务器数量是否有限制。
5.四、扩展性:不一样于其余架构要素主要关注非功能性需求,网站的扩展性架构直接关注网站的功能需求。网站快速发展,功能不断扩展,如何设计网站的架构使其可以快速响应需求变化,是网站可扩展架构的主要目标。衡量网站架构扩展性好坏的主要标准就是在网站增长新的业务产品时,是否能够实现对现有产品透明无影响,不一样产品之间是否不多耦合等。网站可扩展架构的主要手段是事件驱动架构和分布式服务。 事件驱动一般利用消息队列实现,经过这种方式将消息生产和处理逻辑分隔开。 服务器服务则是将业务和可复用服务分离开来,经过分布式服务框架调用。新增长产品可用经过调用可复用的服务来实现自身的业务逻辑,而对现有产品没有任何影响。
5.五、安全性:互联网是开放的,任何人在任何地方均可以访问网站。网站的安全架构就是保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。衡量网站安全架构的标准就是针对现存和潜在的各类攻击和窃密手段,是否有可靠的应对策略。
(6)、SQL规范与性能优化--主要针对Mysql
6.一、什么是执行计划:a.决定如何访问表数据,是否经过索引,是否排序等。b.多表关联是先访问哪一个表。c.多表关联时,使用哪一种链接方式,不过如今MySQL只有嵌套链接(嵌套循环,顾名思义就是将一个表为出发点,将该表所有记录逐条去遍历另一张表的记录)。
6.二、SQL执行顺序:a.检查语法是否正确。b.检查表是否存在、权限是否知足等。c.根据统计信息(如data length,rows,index length、索引惟一度),生成较优的执行计划。d.根据执行计划,进行数据检索、过滤、合并、排序等操做。访问数据时,内存中如存在表数据,则直接进行操做;不然,从磁带读取表数据,放入内存,再进行操做;如内存不足,则内存中较冷数据涮出内存,再从内存中读取数据。
6.三、索引:查询的时候若是使用上了索引,能够提升效率,由于创建了索引后,能够理解为数据字典的结构存储,所以根据条件查询的时候更加高效。下面看一下MySQL经常使用的索引类型的概念。普通索引:在建立普通索引时,不附加任何限制条件。这类索引能够建立在任何数据类型中,其值是否惟一和非空由字段自己的完整性约束条件决定。创建索引之后,查询时能够经过索引进行查询。例如,在student表的stu_id字段上创建一个普通索引。查询记录时,就能够根据该索引进行查询。惟一性索引:使用UNIQUE参数能够设置索引为惟一性索引。在建立惟一性索引时,限制该索引的值必须是惟一的。例如,在student表的stu_name字段中建立惟一性索引,那么stu_name字段的值就必需是惟一的。经过惟一性索引,能够更快速地肯定某条记录。主键就是一种特殊惟一性索引。单列索引:在表中的单个字段上建立索引。单列索引只根据该字段进行索引。单列索引能够是普通索引,也能够是惟一性索引,还能够是全文索引。只要保证该索引只对应一个字段 便可。多列索引:多列索引是在表的多个字段上建立一个索引。该索引指向建立时对应的多个字段,能够经过这几个字段进行查询。可是,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。例如,在表中的id、name和sex字段上创建一个多列索引,那么,只有查询条件使用了id字段时该索引才会被使用。
6.四、通常一张表索引不要超过5个,并且避免重复索引,并且也不是建了索引,根据索引字段条件查询,索引就会起做用。
6.五、通常哪些场景会致使索引失效:a.使用like关键字匹配字符串第一个为”%”的场景。b.条件中包含or、in、not in、<>关键字,默认不走索引的。c.访问表上的数据行超出表总记录数30%,变成全表扫描。d.查询条件使用函数在索引列上,或者对索引列进行运算。e.多列索引中,第一个索引列使用范围查询,只能用到部份或没法使用索引。f.多列索引中,第一个查询条件不是最左索引列,上面多列索引概念中也有提到。
6.六、不能同时使用两个索引,一个过滤数据,一个用于排序(主键除外)。DML语句若是使用索引,会致使lock全表;若是使用了非惟一索引,可能只是锁住必定范围。对此,建议更新/删除数据尽可能用上索引,若是能够最好用上主键或惟一索引,另外事务要及时提交。
6.七、关于事务:a.日志记录尽可能放在独立事务里面,避免后面的异常发生致使日志丢失。b.上面已经几回提到,尽早提交事务,避免事务过长,所以写代码的时候,一些能够不放到事务的逻辑能够移到外面,长事务看可否拆成两个事务。
2、工做心得
(1)、和同事多维度沟通;学会使用笔记本如云笔记本记录平常工做过程和会议重点;常常总结思考理解思路;着重学习和工做效率,效率第一,质量第一。
(2)、多听其余同事和老板上司的意见。
(3)、用发展的眼光和变化的眼光看待公司的业务和本身的掌握的技术及手头上的工做。
(4)、心态决定一切,工做的价值在于本身的心态的控制和调节。
3、职业发展及2017规划
(1)、先博然后渊:感受本身的技术点仍是理解的蛮多的,但感受不少都不够深刻,将来是互联网+时代,社会变迁很快,尤为是信息爆炸的今天,东西太多,不愿能都学的很通。因此将来应该偏向实用驱动,即若是在实际实用场景须要某个技术再去深刻学习,边学边用更能体现学以至用!
(2)、重视业务,积累业务和管理经验:技术再牛不能解决实际业务问题都是啥流氓。另外对业务更理解有利于本身对项目管理工做更加顺利的开展。做为项目管理人员,项目的人员协调与时间安排规划,责任越大,思考的问题就越多,遇到的问题处理经验就越丰富。把控能力也比较强。
(3)、学会和更多的同窗同事交朋友:业余时间多和同事大学同窗等交流共享,更有利于本身的多元化发展,及适当的拓展本身的朋友圈。
(4)、对不懂的东西保持学习心态:学习最能集中注意力的状况是有着比较强的好奇心和求知欲。因此通常一些技术分享或者老员工讨论的问题,可能不少概念知识你都不懂,这时候你就能够去学习了解这些知识。或者你工做中遇到的问题,尽可能刨根问底的去弄清楚是什么缘由致使的,不要一些老司机帮忙解决了就一了了之。或者是其余同事遇到的问题,你均可以去了解一下。
(5)、2017注重技术的运用:技术和业务的结合,向项目资深管理方向迈进!在项目管理和技术方向上“五五分帐”,尤为是多关注大公司资深管理方面的书籍和经验。
(6)、2017技术类书单:
《重构》
《代码整洁之道》
《Java并发编程的艺术》
《高性能Linux服务器构建实践及性能调优与集群应用》
《Java多线程编程核心技术》
《SOA与Rest》--用Rest构建企业级SOA解决方案
《Spring实践》
《CentOS Linux系统运维》
《科技之巅》
《硅谷百年史》--共3册
《VMWare虚拟化与云计算应用案例详解》
《Java经常使用算法手册》
《Docker生产环境实践指南》
《Docker技术入门与实践》
《DevOps实践》
《Java EE开发的颠覆者Spring Boot实战》
《算法导论》
《分布式服务框架原理与实践》
《大话数据结构》
《神经网络与机器学习》
《Redis设计与实现》
《用户体验要素》--以用户为中心的产品设计
《白话大数据与机器学习》
《高性能MySQL》
《Hadoop权威指南》
《数据挖掘与数据化运营实战 思路、方法、技巧与应用》
《深刻理解计算机系统》
《数据结构与算法分析:Java语言描述》
《Spring技术内幕:深刻解析Spring架构与设计原理》
《机器学习》
相关文章
相关标签/搜索