个人终于第一次完成了一个java web项目从策划到最终上线的全过程,虽然项目十分简单,但全流程跑通的感觉还是倍爽的,之后再做项目则只是各个环节上的细化了。
现在我将我的“第一次”分享给大家
项目名称:最美80周年,共同记录
开发文档:https://www.showdoc.cc/rucday?page_id=15376272
源码地址:https://github.com/sunym1993/dataU-RUCDay.git
项目简介:自己做着玩的一个项目,为某校80周年校庆准备的,页面模仿微信聊天界面,用户可在上面说话。
一、准备阶段
服务器:阿里云服务器ECS(2核4G ¥825/年)
买了一年的阿里云服务器,个人感觉还是很值的,内部装好了空的CentOS 6.9 64位 linux系统。首先第一步就是安装java环境,以便之后我在上面跑的程序能够运行起来。总结起来我需要jdk,mysql,redis。安装linux系统环境每次都要查找各种教程,索性总结成了一篇清单文章给自己看:linux的java环境搭建清单
当然后续,还在阿里云买了域名,域名需要备案才能用的事,留在后面吐槽。
文档管理:showdoc文档,poccessOn流程图
showdoc在线文档清晰明了,很适合个人或者小型团队用来共享开发文档。配合poccessOn流程图软件(我买了专业版 ¥115/年),已经可以很好完成开发文档方面的工作了。当然工具的选择只是个人喜好问题。
代码管理:github
开发工具:idea
应该是最智能的编辑器了,但我还是更佩服用notepad或者txt写代码的人。
开发环境:jdk1.8,mysql,redis,springboot
现在是springboot的时代咯,打成一个jar包直接就能跑web项目,也可以跑微服务,十分便于管理。
二、疯狂打码阶段
开发过程总结起来可以说很简单,1、写好开发文档; 2、建好数据库; 3、写好代码并打成jar包。描述起来真的特别简单,而且基本都是这样的流程。
困难之处就在于,开发文档写得糟糕,数据库设计得糟糕,代码总是出一堆bug。于是可能回过头再改开发文档,改数据库。于是再次遇到开发文档改得糟糕,数据库改得糟糕,如此往复。最终的结论就是代码越来越难以维护。所以如果不是在最初设计的时候就能预料到之后的各种坑,回过头改则会越改越糟,除非推倒重来。
1.写开发文档
由于自身比较追求代码的质量,实现所谓的高内聚、低耦合,所以在意识上还是很明白设计阶段的重要性的,虽然后面看来一开始的设计简直是糟糕透顶。
我给自己的原则就是文档写完之前一行代码都不要写,文档写好之后代码自然就出来。虽然花了近一周时间在写文档阶段(抛去上班时间其实就两天),但仍然不够,代码写到后面已经完全抛弃文档了。我后来总结自己代码时可以明显感觉到,文档中设计好的部分代码还是很清晰整洁的,但其余部分就有点混乱不堪的意思了。尤其是对cookie和session的忽略导致一些问题直到上线也没能很好地解决,只能采用临时的,不可拓展的垃圾代码顶替,看得我自己都想吐。
2.建数据库
其实如果开发文档设计好,数据库自然也不用再考虑。可是我写开发文档懒了,只考虑了表的字段,没有涉及到具体类型、索引等信息。这导致了我之后写代码的时候修改了几个表字段的数据类型。虽然造成的改动量不大,但修改底层往往是很心累的。我们都希望封好了一层之后就不在打开这个封条,站在新一层的高度考虑问题,显然这次的实践没有处理好。
3.写代码
写代码的过程真心可以总结为,从条理清晰到不管三七二十一。
初步搭建框架的时候思路还是很清晰的,代码写的也比较干净,因为毕竟之前练习时搭建过很多次。web层、业务层、持久层,再封装一层redis,整个过程一气呵成。
但到后面遇到实际业务时就慌乱了。首先,我遇到了以前没用过的redis数据结构list,我把用户的消息,群内的消息都存到了redis的list里,如何索引这个list里的数据成了困扰我的地方,虽然最后都通过记录其索引值解决,但感觉并不是长久之计。之后,session中存哪些信息又成为了一大乱点,最后发现很多地方都要用到,不得不不断往里面存数据。有时执行某个方法时会忘记同步更新session中的数据。导致了很多bug。还有数据的同步问题,数据库,redis,session中的数据如何保持同步,我目前只在逻辑上去保证,只能祈祷系统不出问题。消息的实时更新,我用了ajax长回调机制,据说是效果最好也最节约开销的方式。页面啊!页面真是救命了,对于一个后端开发人员,我对页面的美观简直毫无办法,只能找网上的模板,还好找到了一个仿微信页面的前端模板,拯救了我
这部分确实比较乱,没经验,赶着项目上线很多问题都没能很好解决,日后将一一总结。
三、上线前
上线前遇到的一些问题让我一度想要放弃,有些跟代码无关,给大家讲讲。
1、阿里云有安全组策略的
之前不知到,数据库、redis什么都配置好了,也允许外网访问,可是就是一直访问不了。一直找配置中的错误,不断重新安装,一度想要放弃。结果后来发现问题很简单,阿里云有自己的安全组策略,你必须配置以允许外放访问这个云的哪些端口才行,不配置默认就是拒绝访问。找到问题根源时我笑哭了。。。
2、大天朝的域名是需要备案的
直到最后我才把项目端口改成80,也用了自己的域名,结果发现无法访问,跳出来一个“友好页面”。后来知道,在中国域名是需要备案的,于是走阿里云备案流程,发现需要25天(北京),还要邮寄幕布让你来拍照什么的,上线时间紧迫,一度要放弃的时候,想到了“某宝”,于是。。。
3、微信需要域名加标准端口才能直接跳转
如果你用微信访问一个 http://185.10.10.195 这样的地址,它会先跳出
如果你用微信访问一个 http://www.datauuu.com:7001 这样的地址,它会先跳出
也就是说,只有域名配web标准80端口,微信才能直接打开自己的浏览器做跳转。这个也是我购买域名以及想到要备案的原因。哎真是经验不足啊,不然上线前不必为这些事操心
四、上线后
没有日志系统,没有监控系统,没有管理系统。只有一个自己做的超简单的管理页面,只能初始化数据库数据,同步数据库和redis,所有查询都是直接用sqlyog看数据库。
现在明白为什么一个项目要如此重视日志系统和监控系统了,真是太有用了。我这个项目好在比较简单,最重要的是我只是玩一玩,出问题那就出了也不用负责人。要是一个正规的系统,我现在的状态只能用听天由命来形容了。
总之在做一个项目之前,以下事情还是比较重要的。
一是各种“常识”,比如阿里云的一些事,还有域名备案这种事,不过自己经历过一遍就都明白了,这些坑也是必须自己踩过一遍才行的,不难,但很讨厌。
二是架构设计,真的非常非常重要!就不说三遍了。你代码中遇到的几乎大部分的坑,都源于设计阶段的不合理,也都是能通过重视设计来解决的。而且设计阶段可以弱化其实现过程,把精力用在模块与模块,接口与接口的交互之间,站在一个高度上看问题,就不会被细节影响了大方向。
三是多学知识,这个我便没有做好,很多功能都是想用我现有的知识去解决。其实优秀的解决方案有很多种,不妨多多参考别人优秀的设计,切记不能为了暂时解决问题用不合适的方式。
四是要做日志系统和管理系统,这在项目上线后是很重要的,即使是练习项目,也能通过它们发现项目的更多问题。虽然不会影响项目的使用效果,有些人会觉得多余,但这其实是必要的。
总的来说,我发现我用在实际写代码上的时间并不多,大多都在设计、修改代码、还有搞阿里云啊这些琐事上,大家一定要重视这些环节,码代码只是其中一小部分而已。一个优秀的设计会让你的代码写起来轻松高效,出错的概率也小很多。
下个项目酝酿中。。。嘿嘿