V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
raysmond
V2EX  ›  分享创造

花了两天时间用 Spring MVC 写了个博客网站

  •  1
     
  •   raysmond ·
    Raysmond · 2015-09-28 18:44:09 +08:00 · 21225 次点击
    这是一个创建于 3378 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前用 PHP 和 Ruby on Rails 写过网站,最近在学习 Spring 框架,顺便写了一个博客网站替代原来我比较旧的网站。初学 Spring MVC ,这是我用它撸的第一个网站。主要用的到的技术有:

    • Spring MVC + Spring Data JPA
    • Hibernate + MySQL
    • Spring Data Redis 用于缓存文章
    • Jade 作为视图模板,我极度不喜欢写 HTML 标签
    • Bootstrap 没有它我就不会写前端了
    • 这是一个基于 Gradle 的项目,要想跑起来,网速要给力
    • Pygments 用于高亮代码
    • Pegdown Markdown 文章的后台处理
    • ACE Editor 用于写文章,主要是喜欢用 markdown , ACE 编辑器有高亮功能,写代码也方便

    我的博客网站是 http://raysmond.com
    网站所有源代码开源在 Github 上面, https://github.com/Raysmond/SpringBlog
    初学 Spring ,很多写法可能不符合 best practice ,希望有人能给一些建议。

    网站部署在阿里云 ECS 上,顺便说一下 Java 的网站挺耗内存啊。
    这个开源项目其实我主要是想学习 Spring 以及 Java 后台开发的一些技术,练练手。也希望有兴趣的朋友和我一起来开发晚上这个项目。把你认为最牛逼的技术和架构在这样一个最小的博客系统里面体现出来。

    花了两天踩各种 Java 写网站的坑,但是也学习到一些知识。这个项目的目的不是写这个网站,而是学习。如果只是写这样一个博客网站的话,用 RoR 几个小时就可以搞定了。

    59 条回复    2017-10-19 21:32:51 +08:00
    raysmond
        1
    raysmond  
    OP
       2015-09-28 18:46:43 +08:00
    我喜欢它是一个很小很轻量的项目,但是技术上五脏俱全,更多体现 Best Practice 。
    broadliyn
        2
    broadliyn  
       2015-09-28 19:50:05 +08:00
    markdown service 这个,其实 markdownToHtml 可以独立放在一个 Util 类中做静态方法的。
    raysmond
        3
    raysmond  
    OP
       2015-09-28 19:58:05 +08:00
    @broadliyn 这是一种常见的方法。我做成 service 主要是想用 service/interface 这种 Spring 里面常用的方法。我看了 Spring 的 Sagan 源码,很多类似于工具类的都做成了 service 。不过这个 service 和常用与操作 model 的 service 有点混淆。也许用一个 @util 或 @helper 这种命名好一点。
    WildCat
        4
    WildCat  
       2015-09-28 20:00:53 +08:00 via iPhone
    内存占用多少
    raysmond
        5
    raysmond  
    OP
       2015-09-28 20:05:26 +08:00   ❤️ 1
    @WildCat 用 Jetty9 跑起来大概用了接近 1G ,加上 MySQL , Redis , Nginx 等要 1.5G 以上吧。
    Kilerd
        6
    Kilerd  
       2015-09-28 20:11:39 +08:00
    这样式看上去 好熟悉,不就是 GitHub 上开项目介绍网站的第一个模板吗?
    Gonster
        7
    Gonster  
       2015-09-28 20:12:13 +08:00 via iPhone
    jvm 参数没改吗,应该用不了这么多_(:з」∠)_
    raysmond
        8
    raysmond  
    OP
       2015-09-28 20:13:40 +08:00
    @Gonster 什么都用默认的,刚好有一台阿里云够用。对于修改参数,节省内存有什么好的文章可以推荐看看么?
    raysmond
        9
    raysmond  
    OP
       2015-09-28 20:14:53 +08:00
    @Kilerd 其实不是,我直接在 Bootstrap 自己写的,也就是 CSS 写了 100 多行,只不过头部的大背景和那个开源项目的差不多,所以错以为是同一个。
    Gonster
        10
    Gonster  
       2015-09-28 20:31:33 +08:00
    Gonster
        11
    Gonster  
       2015-09-28 20:32:10 +08:00
    @raysmond 忘了点回复..
    raysmond
        12
    raysmond  
    OP
       2015-09-28 20:35:37 +08:00
    @Gonster 谢谢,我看看。
    WildCat
        13
    WildCat  
       2015-09-28 20:46:44 +08:00
    @raysmond OMG ,比 Rails 还吃内存
    raysmond
        14
    raysmond  
    OP
       2015-09-28 20:47:47 +08:00
    @WildCat 是啊,没怎么调。要跑 Jvm , Jetty , MySQL , redis 一堆东西。
    zhicheng
        15
    zhicheng  
       2015-09-28 20:48:52 +08:00 via Android
    TextArea.com 欢迎大家~
    zonghua
        16
    zonghua  
       2015-09-28 20:51:31 +08:00
    我写了两年都没写出来, java 那套框架太烦啦
    phptester
        17
    phptester  
       2015-09-28 20:55:05 +08:00
    http://raysmond.com/about 页面中
    Little about Mongodb, Redis, Python, Go, JavaScript, SASS, Angularjs
    从语法上来说这个句子好像表达的是否定的意思
    raysmond
        18
    raysmond  
    OP
       2015-09-28 20:55:49 +08:00
    @zonghua JavaEE 那一套太烦了,我也不写 Servlet 。 Spring 框架和 Play 框架比较人性化一点,符合日常 MVC 开发的方式。 Spring 的 AOP 和 DI 解耦,写起来也很方便。不过还是没有我用 Rails 来得方便。
    raysmond
        19
    raysmond  
    OP
       2015-09-28 20:57:17 +08:00
    @phptester 我只是想表达我会一点这些玩意,不熟练。你觉得应该怎么写?
    HentaiMew
        20
    HentaiMew  
       2015-09-28 20:58:38 +08:00   ❤️ 2
    原本打了一大堆又不想发了。。。
    说得简洁点:
    1.你并没有模块化项目结构,构建工具只是用来拉取依赖。那么 gradle 意义何在,还不如 maven 方便
    2.访问文章的参数居然是一个 ID ,估计还是自增的主键....这样是非常不好的,一是如果以后有分表需求,
    二是数据迁移产生变动可能会产生一大堆死链,三是 URL 不够语义化,
    什么样是语义化的 URL 参数,
    例如: https://www.quora.com/How-do-I-fix-srt-log-file-error-Windows-10
    3.一个原本就很小访问量的博客,为什么要缓存文章,更应该缓存的是博客首页的文章”列表“,以及类似热门文章热门评论的那些数据。

    然后就是 1GB 内存半点不夸张...毕竟你用了 spring ,凡是用了 spring 再稍稍多一点的注入项,启动不上 G 我都觉得有点奇怪
    (当然我说的是 java8 ,在 jvm 上加参数优化其实已经不提倡了,并且一部分已经被废弃)
    然后就是 jetty 的确比 tomcat 占用内存小,但是相比项目导致的内存占用根本不值一提, jetty 更大的优势的整个 servlet 运行环境的封装。

    话说..我的一些项目如果完整的在一台机跑起来 8GB 都有点勉强
    zonghua
        21
    zonghua  
       2015-09-28 21:00:27 +08:00
    @raysmond ASP.NET MVC 都好看,只是只能在 Windows 系统
    raysmond
        22
    raysmond  
    OP
       2015-09-28 21:10:51 +08:00
    @HentaiMew 首先谢谢。我的重点岂不是网站本身,加缓存什么的设计我只是想学习和应用缓存这一块。至于你说的一些问题我有考虑。

    1. 本来也想分模块,向 Sagan 一样分几个小 project ,但是想到这是一个小的应用就懒得分了,不过你说的对,最好分模块设计。

    2. 文章 ID 这类的我没有考虑那么多,不过我想还是用 UUID 好一点,直接用裸的数据库自增 ID 是不太好。

    3. 缓存设计只是不是为了这个博客,而是为了学习和应用。

    4. 内存确实消耗挺大,最初 VPS 只有 1G ,装好 Jetty9 把项目放上去部署启动应用都不够内存了。
    Gonster
        23
    Gonster  
       2015-09-28 21:11:51 +08:00
    @HentaiMew 第一次听说加参数不提倡了,能讲一下在哪里看到的吗,我想学习一下
    itfanr
        24
    itfanr  
       2015-09-28 21:11:53 +08:00
    网站很漂亮
    ToysMall
        25
    ToysMall  
       2015-09-28 21:47:30 +08:00
    评估下,这套东西 php 写要多久?一天还是 2 天
    raysmond
        26
    raysmond  
    OP
       2015-09-28 21:49:37 +08:00
    @ToysMall PHP 好久不写了,如果数量掌握一个 mvc 的框架的话,写起来应该也很快的。比如 Yii 这个框架把很多网站中要用的功能都包装好了。
    ajan
        27
    ajan  
       2015-09-28 21:54:24 +08:00
    想到马上要离开 java web 团队了,心情就会变好了
    br00k
        28
    br00k  
       2015-09-28 22:24:29 +08:00
    最近在用 spring boot ,感觉好方便。
    HentaiMew
        29
    HentaiMew  
       2015-09-28 22:40:44 +08:00
    @Gonster 我并没有在哪里看到谁说不提倡手动优化 JVM... 即使看到了也不可能随便拿出来说的。。

    上面其实注意看我说的是 java8 ,也想表示以后的 java.我给你举几个例子:
    例如, java8 的 jvm 对 MaxPermSize 、 PermSize 等参数的移除。然而 JVM 上百个参数很多都是关于内存或者是垃圾回收器的,很多人习惯于调整例如年轻代、永久代以及老年代不同内存空间的 GC 参数。
    然而 java8 直接移除了永久代取而代之的是具有 metaspace dynamic re-size 能力并且默认无限的”元空间“,杜绝了手动参数才能避免的内存溢出
    java7 以来就对新的垃圾回收器 G1 的优化和 java8 新特性支持,其实就是一定程度上再尽可能的自动实现手动调整垃圾回收器的优化方式。
    java8 还弃用了一些手动实现的 GC 组合方式,具体我不记得,而且我也不懂那些

    然后就是,对于 无法预测 OR 不规律 /活动 的应用场景,无论怎么样手动设置参数都不可能完全”适合“,”过度优化“倒有可能, jvm 原本就是不断的再提升不同场景应用下的自动调整能力。
    不断的手动 JVM ”调优“只是限制 java 应用的伸缩性。
    就好像程序语言的不同不应该是高性能 WEB 应用的瓶颈,而主要瓶颈是 IO 和并发。然而解决瓶颈的方式是更具实际作用的系统架构优化,而不是花时间测试 AND 调整参数或者换一门程序语言。。

    说实际的,就是,即使楼主手动调整了 JVM 堆的大小,可能只是一时起作用的权宜之计,运行中无法避免出现应该有的错误,例如内存不足,或者就因为调整而产生的内存溢出。
    evilic
        30
    evilic  
       2015-09-28 22:46:55 +08:00
    502
    sewyu
        31
    sewyu  
       2015-09-28 22:47:57 +08:00
    速度搜搜地,配色也不错 很诱人
    raysmond
        32
    raysmond  
    OP
       2015-09-28 22:54:27 +08:00
    @sewyu 速度还可以。现在只是做了文章缓存而已。并没有做其他优化,比如压缩合并 js , css ,使用 cdn 等。
    raysmond
        33
    raysmond  
    OP
       2015-09-28 22:54:53 +08:00
    @evilic 我刚才在部署新的版本。
    88250
        34
    88250  
       2015-09-28 22:57:27 +08:00
    GitHub 上 Star 数最多的 Java 博客: https://github.com/b3log/solo
    Gonster
        35
    Gonster  
       2015-09-28 23:13:20 +08:00
    @HentaiMew java8 这些改动我是知道的,主要是我也在小内存的机器上跑过 spring mvc 的 web 工程,初始内存我并不觉得会消耗这么大。你说的是没错,那也要监控查看过 gc 频率,堆实际消耗,如果实际总是小于堆初始大小设定那完全可以调小嘛-、-. 还有阿里云应该用的不是 java8
    hantsy
        36
    hantsy  
       2015-09-28 23:20:43 +08:00   ❤️ 1
    @raysmond 既然用了 Spring Boot ,为什么不用 application.yml 来配置呢,很多 Config 下的 类可以删除了。

    对比一下我的两个 samples, 使用 Boot 的版本删除大部分配置,转而用 application.yml 直接配置了。

    https://github.com/hantsy/angularjs-springmvc-sample
    https://github.com/hantsy/angularjs-springmvc-sample-boot
    raysmond
        37
    raysmond  
    OP
       2015-09-28 23:27:43 +08:00
    @hantsy 我也很想使用 Spring Boot ,目前一些 config 是直接从一些开源项目中拿来的,未来准备用 Spring Boot 替代一些。 angularjs-springmvc-sample-boot 分不同的 environment 的设计很不错。
    varrily
        38
    varrily  
       2015-09-29 00:45:04 +08:00
    不错,支持。。
    twittercom
        39
    twittercom  
       2015-09-29 08:48:56 +08:00
    用到这么多高端的技术做了一个这么小型的博客,是表明你在用大炮打蚊子吗
    NCE
        40
    NCE  
       2015-09-29 08:58:11 +08:00
    @HentaiMew 这么费内存,开发那么麻烦,还用它干嘛, PHP 果然是世界上最好的语言,没有之一。

    执行速度,占用内存,妥妥的
    initialdp
        41
    initialdp  
       2015-09-29 09:12:24 +08:00
    @twittercom lz 是出于学习的目的,顺路撸了个网站。这挺好的。

    从 lz 提供的各项数据看,我感觉 java 这东西还是呆在企业业务领域比较好,做其他领域的开发还是有点勉为其难了。
    hantsy
        42
    hantsy  
       2015-09-29 10:51:24 +08:00
    @raysmond 不同 profile 为了适合 CI 和 production 配置,之前在 CI 上都是自动部署的。

    我的两个 Sample 是从我以前的项目中的抽出来的(第一个非 Boot 例子配置 ~.config 包下的代码基本上是完全抽出来的),只是最基础的 REST 架构。之前一个大项目后台大概有 8 个独立运行的 war ,当时都是用 Tomcat ,前端(移动 APP ,桌面网站)都是 HTML5 静态的( AngularJS , Ionic 等。我这个主要是演示 REST API ,另外包括了 Swagger UI ,和生成 API 文档(主要用 spring-restdocs, springfox 等项目)。

    传统的 MVC ,大约从前年开始,基本没再用过了, REST 现在都是项目的起点。

    如果你熟悉 Jade , 应该对 CoffeeScript 之类有偏好,可以尝试将前端做成 NodeJS 程序,通过 REST API 与后交互。
    hantsy
        43
    hantsy  
       2015-09-29 11:08:34 +08:00
    @raysmond 所有 Spring 技术都是基于 Java EE 的,这两都并不矛盾。最基本的一个 Spring Web 应用, Spring DispatcherSerlvet 是标准的 Servlet 。 Spring 内置支持 Bean Validation , JSR330(@Inject), JMS , Java Mail , JDNI 等标准,对最新的 Java EE 7 也跟很快,比如支持 Java EE7 的 @Trasactional, Concurrency Utilits , Batch ( Spring Batch 3 添加标准 Batch 的支持)等。

    其实从复杂度差不多, Spring 越来越庞大。 Java EE 标准越来越简单,搭上 JBoss 的一些 Glue 项目,易用性应该比 Spring 好。目前最基本的 DI , 个人从使用了 Spring , CDI ( Seam2 是最初原型, Seam3 是 CDI 扩展) 几年后,比较喜欢 CDI 一些。
    HentaiMew
        44
    HentaiMew  
       2015-09-29 11:54:52 +08:00
    @NCE java 确实越来越消耗内存了,但是这并不影响 java 的发展, java 的众多著名框架也越来越重,最著名 spring 甚至发展为一个可以跟 ejb 抗衡的平台。然而内存上对于企业而言成本不值一提,例如淘宝庞大的系统架构集群,跑了上万个服务。谷歌无时无刻都在进行着数千台的数量的服务器损坏和维修的过程。
    java 麻烦,是因为想开发一个企业级应用,需要遵守许多准则,搭建一个庞大的系统架构,所以复杂度一般会越来越大。
    但是,你同样可以像 php 那样玩,甚至可以不写控制层,直接把代码写在 jsp(等同于.php)的 view 层,如果觉得还是比不上动态语言的灵活性,没关系还有优秀的网页模板引擎等着你。当然没人会如此简单的开发 java ,因为庞大的架构性和众多框架技术超前的思想可是 java 的魅力所在。
    学 java 的人很多,有的人学到头都不知道 java 为什么要复杂,这样的人一辈子都没入门。真正懂 java 的少之又少。
    在众多领悟,例如搜索,大数据,异构通信,消息服务等大型系统架构涉及到的技术, java 几乎是万能而强大的。
    php 由于语言的动态性,在大型架构系统中经常当做最上层的 View 用来最后做网页的生成,但是后台以及其他方面几乎是不会用 php 的,当然,敏捷开发小型基本不重架构的 WEB 网站 php 还是非常适合的。
    不过我个人经常以 java+nodejs 作为组合实验异构形式的 WEB 系统,因为相比动态性, php 又比 js 差了一大截。如果开发小型站,也是直接上 node ,找不到用 php 的理由。
    raysmond
        45
    raysmond  
    OP
       2015-09-29 16:21:25 +08:00
    @HentaiMew 你要理解写 PHP 的人,他们都认为 PHP 是世界上最好的语言,每次我碰到他们都这么跟我说。
    Charming6
        46
    Charming6  
       2015-09-29 18:00:53 +08:00
    @raysmond 你不觉得这是写 PHP 的人的自嘲么?
    qw7692336
        47
    qw7692336  
       2015-09-29 20:04:04 +08:00 via Android
    喜欢用哪个?

    下面推荐几个 Java Web 的东西
    jhipster.github.io
    playframework.com
    sparkjava.com
    hiroya
        48
    hiroya  
       2015-09-30 13:09:50 +08:00 via iPad
    看起来占用好高啊…已经 star 了,等有这个配置的机子再折腾吧 orz ,机子连 b3log 都带不动…
    raysmond
        49
    raysmond  
    OP
       2015-09-30 17:21:56 +08:00
    @qw7692336 play 也是不错的,但用 play 的我肯定用 Scala , play2.0 以后核心都是 scala 写的。
    raysmond
        50
    raysmond  
    OP
       2015-09-30 17:23:12 +08:00
    @hiroya 这个配置 VPS 也很便宜,我就买了阿里云 2G 内存单核 CPU 的配置,够用了。现在大概用到 1.5G 。
    meipics
        51
    meipics  
       2015-10-04 12:27:36 +08:00 via iPad
    几百兆内存的 VPS 照样可以跑 Java Web ,一方面优化,一方面选择较少的依赖。
    raysmond
        52
    raysmond  
    OP
       2015-10-04 13:19:34 +08:00
    @meipics 内存也不是特别贵,懒得折腾了,各种优化来优化去,只是节省了内存的感觉不太有意思,可能对应用本身并没有什么优化。现在内存这些都不贵了。
    blackboom
        53
    blackboom  
       2015-10-05 01:07:21 +08:00
    SSH 动不动就几十个 jar 包,实在受不了,试试 JFINAL ?
    raysmond
        54
    raysmond  
    OP
       2015-10-05 02:36:45 +08:00
    @blackboom Spring 开源社区比这好多了,下载 jar 包多一点有关系吗?
    shoaly
        55
    shoaly  
       2015-10-05 22:05:07 +08:00
    @HentaiMew 对于 java 的 web 始终一个过不去的结就是 这边修改完代码, 不能马上到浏览器那边刷新看效果, 始终有一个编译的时间差
    zonghua
        56
    zonghua  
       2015-10-08 17:04:15 +08:00
    @NCE GitHub 上 Star 数最多的 Java 博客: https://github.com/b3log/solo
    @blackboom maven , node 也是动不动就下载几十上百的包。
    @hiroya 实测 solo 只要一百多兆
    @hantsy https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples 我能不能直接用里面的配置?

    hiroya
        57
    hiroya  
       2015-10-09 00:23:01 +08:00 via iPad
    @zonghua 可能是 openvz 的问题吧,部署好后两天就崩了
    czc2008
        58
    czc2008  
       2015-12-07 23:06:21 +08:00 via iPhone
    这个不错。
    jack80342
        59
    jack80342  
       2017-10-19 21:32:51 +08:00
    最近翻译了最新的 Spring boot 官方指南,欢迎 fork。https://www.gitbook.com/book/jack80342/spring-boot/details
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2967 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:12 · PVG 19:12 · LAX 03:12 · JFK 06:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.