程序员人生 网站导航

[置顶] 2016年终总结

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

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐