建站小记


       说起来也是有点不知从何说起,尽管酝酿了很久,真正开始写的时候还是有点懵。想抒发的东西很多,不过想了下不应该写在这个主题之中,这一篇还是以说明本站用了什么东西为主。


       还是要先说一下原因。其一是我需要上手写项目,处在这种比较尴尬的境况之中,项目几乎是一个无解的难题,虽然对于我之前的CAD开发工作来说,JAVA的资料已经是随处可得,获取信息的难度是很低的,但是真实项目依然不好在个人工作下进行练习,尤其是现在微服务这种趋势下。相对来说前端会好一些,因为能show,但是没办法,没有选择前端。我不是没写过项目,我很清楚实战给技术人员带来的巨大提升是无可比拟的,而这其中有一点原因是实际工程这种真实需求带来的能动性。没什么想象力的我与其弄个什么模拟的XXX系统,真的不如一个博客来的实在,尽管作为项目来说low了一些,但是并不妨碍我去应用各种组件,只不过是小题大做罢了。其二是我也确实需要一个写东西的地方,作为技术人员,有自己的博客是一件很酷也很重要的事情,提炼知识和经验的过程也是对个人的极大提升。


       So,为什么不选择CSDN或者博客园,为什么不用wordpress、hexo、jekll这些博客引擎,应该就不需要解释了,下面就开始流水账,新司机上路,总会略显稚嫩,还请指正。


       首先,作为非前端人员需要拷贝一个静态网页模板。没想到的是这么多模板没几个让我觉得能看的,不知道是我品味太独特还是怎么的,我只是想要一个简洁优雅的罢了。最后还是觉得stanley这个主题不错,但是唯一的缺点是博客页面不符合我的要求,没办法最后打算把另外一个主题的博客页面组合进来,费了不少功夫,两边css文件要捏在一起对于我来说非常恶心。不过好在stanley这个主题是用bootstrap做的,相对来说比较熟悉一些,但是仍然修改了无数次。


       接下来是功能模块的划分和实体类的设计。所有了解过的组件,能用就用,不能用也想着办法用。首先能确定的大框架是springMVC以及多模块的微服务形式(SOA更准确一些吧,毕竟还是一个工程,数据库也就一个),项目依赖管理使用maven,服务治理选用dubbo+zookeeper。最终删删改改以后整个项目的模块结构如下图所示,不过其中少了后台web,这也是当时埋下的一个坑。


项目结构.JPG

     

      数据库选用mysql,ORM采用了mybatis。文章评论部分进行了额外处理,其他的内容基本上mybatis-generator已经够用。前端的内容硬着头皮上,一开始把博客那部分页面做成了纯js和ajax,采用JQuery方便一些,过不过时就不考虑了。但是大致完成后觉得不行,一是控制不好,所有的html元素都通过js构造,无法前进后退(当然办法肯定是有,但是不太想在前端上花太多时间),二是博客这种东西起码得对搜索引擎友好,有没有访问量另说,总得合理一些。


       但是ajax那套必须要用上,考虑直接生成并管理静态页面,不过当时觉得页面文件更新、重新部署等不太好管理,就打算先妥协一下。现在博客页面的边栏是静态的html文件(用freemarker包含这个静态文件),网站的其他界面主要还是用freemarker来渲染,而文章评论的加载采用ajax。静态的边栏文件需要随着文章的发布、更改而更新,更改在后台模块、显示在前台模块,那么顺带引入消息队列来处理更新html文件,选用了activemq。


       犯了个很愚蠢的错误,开始做的时候没有考虑后台,没有一个CMS是绝对不行的。不得不再去搜索一个页面模板,可惜CMS的模板一般都是一个完整的工程,但我只要页面。最后选用了一个比较简约的而且是用Bootstrap写的页面的CMS系统,更换了其中的大部分内容,改造成配合服务调用的形式,并且匹配已经设计好的数据表。


       有了后台以后很重要的一点就是图片的问题,最终选用FastDfs作为文件系统解决方案。为了配合FastDfs的使用,整改了后台采用的富文本编辑器UEditor以及其他需要上传文件的地方,为此还额外引入了Bootstrap-fileinput插件。


       在内容搜索上强行使用了solr,这应该是用的最生硬的一个组件,效果一般,但还是费了不少功夫。solr7自带的中文分词直接拿来用感觉有点麻瓜,应该是要调整或者增加配置。唯一的亮点是直接提供了搜索结果的高亮显示。除此之外还采用了消息队列来进行索引的更新。


       尽管博客并没有引入缓存系统的必要,不过依然引入了redis,本来采用了redis-cluster,但是考虑最后肯定是只有一台服务器,且出现了事务的问题但不知道cluster这边怎么处理事务,最终更改为单一的redis服务。当时并不清楚框架可以直接配置采用redis作为缓存实现,手写了所有的缓存逻辑。


       最后是工程的部署应用。在开发测试过程中用了两个虚拟机,一个Ubuntu(zookeeper、redis、nginx),一个CentOS(fastdfs、activemq、solr)。首先申请了一个阿里云的试用服务器(1核1G内存)进行试验,全部组件放入docker,但是遇到了内存问题。几个服务和组件还没启动一半,内存就已经告罄,一度让我以为是docker的问题,但实际上勉强算是个JVM内存调优吧。调整了各个 组件的JVM参数之后,成功将所有服务和组件启动。下图是整个工程的架构情况。


网站架构.jpg


       玩具博客存在的问题以及后续可能改进的点:

       1. 用了RPC但是没有考虑幂等性

       2. 页面静态化处理、管理

       3. 环境有限都是单机版、单例,高可用什么的无能为力

       4. 前台没有做登陆的内容,考虑引入成熟的评论模块

       5. 网站流量的统计分析,考虑自己简单处理或者用成熟的方案

       6. 考虑增加附件下载的功能

       7. 更改前台页面模板,目前毕竟是两个主题捏在一起,后面看看是不是换一换。

       8. Docker的高级应用,包括容器编排等

       9. 上道儿了之后也许还是回归博客本质吧,这样真的比较折腾内存,服务器容易挂…


       终于到了最后,流水账记得有点累,可能有遗漏的东西,每天利用空闲时间来做,中间断断续续因为各种事情还停了一段时间。这个玩具博客可以说是妄图获取项目经验的以卵击石吧,但是我诚意确实到了,虽然是大题小做但对我来说它很有意义,也是一举两得。有东西做的感觉很棒,东西做出来了的感觉很爽,这也是我希望做技术的原因。写下这篇东西的时候网站的域名还在审核之中,没想到域名需要审这么长时间。


       以上。十分感谢你的阅读,能看完这篇碎碎念并不容易,希望你能在本站看到有用或有趣的东西。