SpringBlog是一个基于Java的轻量级博客系统,使用Spring Boot、MySQL、JPA/Hibernate和Bootstrap4等技术开发。2015年刚开始接触Spring Boot时,一时兴起,发起了这个开源博客项目。技术选型算是基础,没想到在Github这一年多时间里收获1k+的stars,惊讶之余也有点小开心。SpringBlog的出发点是学习,学习技术,学习Spring Blog开发。如果对有需要之人带来一点帮助,也算是一件开心的事情。

技术选型

一句话总结:后端Spring Boot,前端Bootstrap4,数据库用MySQL。深究下去,有如下细节:

  • 后端框架:Spring Boot 1.5.10
    • 基于Java8
    • 使用Spring MVC后端渲染,模板引擎是thymeleaf(之前用jade)
    • 使用JPA/Hibernate操作数据库
    • Spring Security权限验证
  • 前端框架:Bootstrap4+jQuery
    • webpack打包(todo)
    • thymeleaf模板
    • 使用markdown写作(ACE编辑器)
  • 数据存储
    • 数据库:MySQL
    • 缓存:Redis(考虑切换到Ehcache,使用Hibernate二级缓存)

部署

这里提供两种部署方式以供参考,笔者均在Ubuntu 16.04服务器上测试过。

使用Java8原生部署

服务器上安装Java8,MySQL,和Redis,然后本地打包上传jar包

安装Java8

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

java -version

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

安装MySQL

# 安装过程中设置好root用户密码
sudo apt-get install mysql-server

# 安装好后创建数据库
mysql -u root -p

CREATE DATABASE spring_blog_prod CHARACTER SET utf8 COLLATE utf8_unicode_ci;

# 重启
sudo service mysql restart

安装Redis

这里需要下载redis源码后编译安装。

apt-get update
apt-get install build-essential tcl

cd /opt
curl -O http://download.redis.io/redis-stable.tar.gz
tar zxvf redis-stable.tar.gz
cd redis-stable
make
make install 

# 配置和安装启动/暂停脚本
cd utils
sh install_server.sh 
# 安装完后,就可以使用如下命令进行启用/暂停redis服务了
service redis_6379 start
service redis_6379 stop

为安全起见,请设置密码和限制本地登录

$ vim /etc/redis/6379.conf

# 确保以下两句:
bind 127.0.0.1
requirepass xxx # 这里修改密码

使用docker部署

安装docker

国内服务器访问docker服务器可能会很慢,如果是阿里云ECS,可以用采用阿里云的脚本安装。

# 如果是ECS服务器
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/intranet | sh -

# 其他服务器,比如不是阿里云的
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

# 验证docker是否安装成功
docker -v
docker run hello-world

国外服务器,如linode,可以按照docker官方安装教程进行。

docker-compose部署

这里我们采用docker-compose管理和部署网站应用。docker-compose是一个定义和管理多个容器的工具,较为方便。

sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

docker-compose容器定义文件docker-compose.yml

version: '3'
services:
    mysql:
      image: mysql:5.7
      volumes:
        - db_data:/var/lib/mysql
      environment:
        - MYSQL_USER=root
        - MYSQL_DATABASE=spring_blog_prod
        - MYSQL_ROOT_PASSWORD=123456
      ports:
        - "3306:3306"
    webapp:
      image: java:8
      depends_on:
        - mysql
        - redis
      volumes:
        - ./SpringBlog/build/libs/SpringBlog-0.0.1-SNAPSHOT.jar:/app/app.jar
      ports:
        - "80:8080"
      command: "java -jar /app/app.jar --spring.profiles.active=prod"

    redis:
      image: redis

volumes:
    db_data:

注意:

  1. 上面mysql指定了ports: 3306:3306,即暴露端口,允许远程访问。为安装可以见可去掉。
  2. mysql指定一个容器卷db_data挂载到/var/lib/mysql,这样即使删掉正在运行的mysql容器,再重新部署,数据也会保持(不指定volumes,删掉容器后数据将丢失!)。

打包进行docker部署

首先需要修改配置文件application-prod.yml。其中jdbc:mysql://mysql/spring_blog_prod中第二个mysql为上面的容器名称。密码自己随意改,保持一致即可。

spring:
    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        url: jdbc:mysql://mysql/spring_blog_prod?useUnicode=true&characterEncoding=utf8&useSSL=false
        username: root
        password: 123456
    redis:
      host: redis
      port: 6379

打包:

# 确保安装好java8和node(>6)环境
bower install 
./gradlew clean -Pprod build 

ls build/libs
SpringBlog-0.0.1-SNAPSHOT.jar  SpringBlog-0.0.1-SNAPSHOT.jar.original

启动和暂停应用

目录结构

|-/opt/spring_blog/
|----|-docker-compose.yml
|----|-SpringBlog
|----|----|-build
|----|----|---|-libs
|----|----|---|--|-SpringBlog-0.0.1-SNAPSHOT.jar
cd /opt/spring_blog
# 启动所有容器
docker-compose up -d

# 单独启动和暂停web应用
docker-compose stop webapp
docker-compose start webapp

# 删除webapp容器
docker-compose rm webapp

# 查看日志
docker-compose logs -f

docker ps 查看所有容器运行无误后,打开浏览器查看你的博客吧!(理论上到这里就ok了)

本地开发

构建开发环境

需要安装:

  • Java8,官网下载jdk8安装吧
  • MySQL
  • Redis

建议使用Intellij IDEA进行开发,直接导入项目,会自动下载依赖包。在IDEA中可以直接运行SpringBlogApplication.java。

git clone https://github.com/Raysmond/SpringBlog.git 
cd SpringBlog

bower install 
./gradlew bootRun

打包部署

$ ./gradlew clean -Pprod build

$ ls build/libs/
SpringBlog-0.0.1-SNAPSHOT.jar  SpringBlog-0.0.1-SNAPSHOT.jar.original

结语

市面上的博客程序很多,SpringBlog只是其中之一。如果你也喜欢Java,喜欢Spring Boot,喜欢DIY,会是一个不错的选择。希望这篇文档能对你有所帮助。