之前用 PHP 和 Ruby on Rails 写过网站,最近在学习 Spring 框架,顺便写了一个博客网站替代原来我比较旧的网站。初学 Spring MVC ,这是我用它撸的第一个网站。主要用的到的技术有:
我的博客网站是 http://raysmond.com
网站所有源代码开源在 Github 上面, https://github.com/Raysmond/SpringBlog
初学 Spring ,很多写法可能不符合 best practice ,希望有人能给一些建议。
网站部署在阿里云 ECS 上,顺便说一下 Java 的网站挺耗内存啊。
这个开源项目其实我主要是想学习 Spring 以及 Java 后台开发的一些技术,练练手。也希望有兴趣的朋友和我一起来开发晚上这个项目。把你认为最牛逼的技术和架构在这样一个最小的博客系统里面体现出来。
花了两天踩各种 Java 写网站的坑,但是也学习到一些知识。这个项目的目的不是写这个网站,而是学习。如果只是写这样一个博客网站的话,用 RoR 几个小时就可以搞定了。
1
raysmond OP 我喜欢它是一个很小很轻量的项目,但是技术上五脏俱全,更多体现 Best Practice 。
|
2
broadliyn 2015-09-28 19:50:05 +08:00
markdown service 这个,其实 markdownToHtml 可以独立放在一个 Util 类中做静态方法的。
|
3
raysmond OP |
4
WildCat 2015-09-28 20:00:53 +08:00 via iPhone
内存占用多少
|
5
raysmond OP @WildCat 用 Jetty9 跑起来大概用了接近 1G ,加上 MySQL , Redis , Nginx 等要 1.5G 以上吧。
|
6
Kilerd 2015-09-28 20:11:39 +08:00
这样式看上去 好熟悉,不就是 GitHub 上开项目介绍网站的第一个模板吗?
|
7
Gonster 2015-09-28 20:12:13 +08:00 via iPhone
jvm 参数没改吗,应该用不了这么多_(:з」∠)_
|
9
raysmond OP @Kilerd 其实不是,我直接在 Bootstrap 自己写的,也就是 CSS 写了 100 多行,只不过头部的大背景和那个开源项目的差不多,所以错以为是同一个。
|
10
Gonster 2015-09-28 20:31:33 +08:00
|
15
zhicheng 2015-09-28 20:48:52 +08:00 via Android
TextArea.com 欢迎大家~
|
16
zonghua 2015-09-28 20:51:31 +08:00
我写了两年都没写出来, java 那套框架太烦啦
|
17
phptester 2015-09-28 20:55:05 +08:00
http://raysmond.com/about 页面中
Little about Mongodb, Redis, Python, Go, JavaScript, SASS, Angularjs 从语法上来说这个句子好像表达的是否定的意思 |
18
raysmond OP @zonghua JavaEE 那一套太烦了,我也不写 Servlet 。 Spring 框架和 Play 框架比较人性化一点,符合日常 MVC 开发的方式。 Spring 的 AOP 和 DI 解耦,写起来也很方便。不过还是没有我用 Rails 来得方便。
|
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 都有点勉强 |
22
raysmond OP @HentaiMew 首先谢谢。我的重点岂不是网站本身,加缓存什么的设计我只是想学习和应用缓存这一块。至于你说的一些问题我有考虑。
1. 本来也想分模块,向 Sagan 一样分几个小 project ,但是想到这是一个小的应用就懒得分了,不过你说的对,最好分模块设计。 2. 文章 ID 这类的我没有考虑那么多,不过我想还是用 UUID 好一点,直接用裸的数据库自增 ID 是不太好。 3. 缓存设计只是不是为了这个博客,而是为了学习和应用。 4. 内存确实消耗挺大,最初 VPS 只有 1G ,装好 Jetty9 把项目放上去部署启动应用都不够内存了。 |
24
itfanr 2015-09-28 21:11:53 +08:00
网站很漂亮
|
25
ToysMall 2015-09-28 21:47:30 +08:00
评估下,这套东西 php 写要多久?一天还是 2 天
|
26
raysmond OP @ToysMall PHP 好久不写了,如果数量掌握一个 mvc 的框架的话,写起来应该也很快的。比如 Yii 这个框架把很多网站中要用的功能都包装好了。
|
27
ajan 2015-09-28 21:54:24 +08:00
想到马上要离开 java web 团队了,心情就会变好了
|
28
br00k 2015-09-28 22:24:29 +08:00
最近在用 spring boot ,感觉好方便。
|
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 堆的大小,可能只是一时起作用的权宜之计,运行中无法避免出现应该有的错误,例如内存不足,或者就因为调整而产生的内存溢出。 |
30
evilic 2015-09-28 22:46:55 +08:00
502
|
31
sewyu 2015-09-28 22:47:57 +08:00
速度搜搜地,配色也不错 很诱人
|
32
raysmond OP @sewyu 速度还可以。现在只是做了文章缓存而已。并没有做其他优化,比如压缩合并 js , css ,使用 cdn 等。
|
34
88250 2015-09-28 22:57:27 +08:00
GitHub 上 Star 数最多的 Java 博客: https://github.com/b3log/solo
|
35
Gonster 2015-09-28 23:13:20 +08:00
@HentaiMew java8 这些改动我是知道的,主要是我也在小内存的机器上跑过 spring mvc 的 web 工程,初始内存我并不觉得会消耗这么大。你说的是没错,那也要监控查看过 gc 频率,堆实际消耗,如果实际总是小于堆初始大小设定那完全可以调小嘛-、-. 还有阿里云应该用的不是 java8
|
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 |
37
raysmond OP @hantsy 我也很想使用 Spring Boot ,目前一些 config 是直接从一些开源项目中拿来的,未来准备用 Spring Boot 替代一些。 angularjs-springmvc-sample-boot 分不同的 environment 的设计很不错。
|
38
varrily 2015-09-29 00:45:04 +08:00
不错,支持。。
|
39
twittercom 2015-09-29 08:48:56 +08:00
用到这么多高端的技术做了一个这么小型的博客,是表明你在用大炮打蚊子吗
|
41
initialdp 2015-09-29 09:12:24 +08:00
|
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 与后交互。 |
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 一些。 |
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 的理由。 |
45
raysmond OP @HentaiMew 你要理解写 PHP 的人,他们都认为 PHP 是世界上最好的语言,每次我碰到他们都这么跟我说。
|
47
qw7692336 2015-09-29 20:04:04 +08:00 via Android
|
48
hiroya 2015-09-30 13:09:50 +08:00 via iPad
看起来占用好高啊…已经 star 了,等有这个配置的机子再折腾吧 orz ,机子连 b3log 都带不动…
|
49
raysmond OP @qw7692336 play 也是不错的,但用 play 的我肯定用 Scala , play2.0 以后核心都是 scala 写的。
|
50
raysmond OP @hiroya 这个配置 VPS 也很便宜,我就买了阿里云 2G 内存单核 CPU 的配置,够用了。现在大概用到 1.5G 。
|
51
meipics 2015-10-04 12:27:36 +08:00 via iPad
几百兆内存的 VPS 照样可以跑 Java Web ,一方面优化,一方面选择较少的依赖。
|
52
raysmond OP @meipics 内存也不是特别贵,懒得折腾了,各种优化来优化去,只是节省了内存的感觉不太有意思,可能对应用本身并没有什么优化。现在内存这些都不贵了。
|
53
blackboom 2015-10-05 01:07:21 +08:00
SSH 动不动就几十个 jar 包,实在受不了,试试 JFINAL ?
|
55
shoaly 2015-10-05 22:05:07 +08:00
@HentaiMew 对于 java 的 web 始终一个过不去的结就是 这边修改完代码, 不能马上到浏览器那边刷新看效果, 始终有一个编译的时间差
|
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 我能不能直接用里面的配置? |
58
czc2008 2015-12-07 23:06:21 +08:00 via iPhone
这个不错。
|
59
jack80342 2017-10-19 21:32:51 +08:00
最近翻译了最新的 Spring boot 官方指南,欢迎 fork。https://www.gitbook.com/book/jack80342/spring-boot/details
|