全栈项目实战 - SpringBoot服务端

Posted by boredream on June 10, 2022

以下是一个安卓开发者角度,首次尝试SpringBoot服务端开发,从开始学习到部署上线的经验分享。

前端想独立做项目,常会被卡在没接口的问题上。个人之前用过LeanCloud、BMob、Firebase等BaaS服务,都算是Serverless方案。但限制较多,所以想学习SpringBoot尝试自己完整搭建一套的服务端接口。

Android也是Java语言所以上手很快,日常业务功能的CRUD使用mybatis-plus甚至不怎么用亲自写。所以基础部分的学习经历就不分享了,直接跳过。先介绍下非业务的一些通用功能。

模块功能

登录

业务流程

  1. 用户使用账号+密码,或手机号+验证码,提交服务端。
  2. 服务端进行匹配,校验正确后,生成个用户对应的token返回给用户。
  3. 之后用户使用该token作为凭证访问其他接口,服务端校验ok的话就放行,不ok的话提示客户重新登录。

实现方案

可以使用 SpringBoot 提供的 spring-boot-starter-security,或者其他第三方库,进行权限控制功能的实现。

这里用户认证用了App主流的token方案,token的生成和校验可以用第三方库,或者直接自己写个工具类实现,只要包含用户信息、过期信息等,且服务端可以自己加密解密即可。

验证码

业务流程

  1. 客户端发起发送验证码请求,告知服务端手机号。
  2. 服务端收到请求后,生成随机验证码,然后通过第三方短信平台发给服务端。
  3. 客户端收到验证码后,再次发起校验请求。
  4. 服务端收到客户端发来的验证码,跟自己之前生成的对比,正确的话视为通过。

实现方案

服务端验证码生成很简单,随机几个数字。但保存在哪呢?尤其又要有个有效期,咋实现呢?

使用redis。redis可以简单理解为一个在内存里的键值对数据库。用户请求验证码阶段,可以在redis里保存请求用户的手机号+随机生成的验证码,再设个过期时间。等客户端再次发来校验请求,就可以用手机号去redis找到对应数据,再查看是否匹配即可。

短信平台可以用阿里云或其他便宜的服务商。


部署流程

开发阶段,本地SpringBoot直接启动调试即可,功能都差不多后就要准备部署到真正的服务器上了。这部分对客户端开发人员来说尤其陌生,下面重点介绍下。

1.购买阿里云服务器

花钱就完事了,按需购买,环境安装centOS。

服务器购买完成后要注意「安全组」,它用于控制服务端的端口是否可以公网请求。比如SpringBoot项目一般都会用8080端口,部署上去后还要打开阿里云的8080端口才能访问到。

为了后续更好的管理服务器,建议服务器申请好后先安装个宝塔面板。

2.购买域名

其实购买服务器后就可以公网用IP访问了,但如果要上线项目啥的话还是要有个域名。

购买完后需要先ICP域名实名认证(国家认证,时间较长),认证完成后在域名中心将域名和你的服务器IP绑定。之后就可以通过域名访问你的服务器了。

3.申请SSL证书,配置部署

域名搞定后,暂时只能http访问。如果要https的话,还需要有SSL证书。

可以直接网上找免费的,阿里云、七牛云都有免费证书下载,下载后按教程配置部署。

方式一:SpringBoot 配置 ssl

证书jks文件拷贝到resources目录下

然后修改 application.yml

1
2
3
4
5
6
server:
  port: 443
  ssl:
    key-store: classpath:证书文件.jks
    key-store-password: 证书密码
    key-store-type: JKS

方式二:Nginx 配置 ssl

将证书上传到服务器

然后配置文件 nginx.conf 中设置

1
2
3
4
5
6
7
8
9
10
11
12
13
http {
    server {
        listen                  443 ssl;
        server_name             www.yourhost.cn;
        ssl_certificate         cert/server.pem;
        ssl_certificate_key     cert/server.key;
        ssl_session_timeout     5m;
        ssl_ciphers             ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1     TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
    }
}

4.接入七牛云

按需接入,我的应用需要用到图片,所以申请了个,免费的额度够用了。

注意测试域名只有30天,ICP域名备案是要时间的,所以备案下来之前可以先测试域名开发。

拿到自己的域名后,在七牛云后台按提示配置,之后就可以一直正常使用了。

ssl证书配置

如果你的图片也希望通过https访问,还需要额外再申请一个证书(因为证书是和域名绑定的,而非ip)?

cname配置

作用是可以用到七牛云的CDN加速

复制七牛云的cname,到阿里云域名管理处添加域名解析 cname


以上阿里云服务器环境准备ok了,但SpringBoot项目的运行环境还需要在阿里云上安装配置好。

如果你之前安装好宝塔面板,下面步骤就比较简单了。直接在面板里按需依次安装环境。

5.安装 Nginx

宝塔面板里直接搜索安装nginx。然后按需修改配置。
我的https是nginx实现的,可以先宝塔面板把证书文件上传到 /www/server/nginx/cert 文件夹下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
    listen                  443 ssl;
    server_name             www.papikoala.cn;
    ssl_certificate         /www/server/nginx/cert/xxxx.cn.crt;
    ssl_certificate_key     /www/server/nginx/cert/xxxx.cn.key;
    ssl_session_timeout     5m;
    ssl_ciphers             ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1     TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location /api/ {
        proxy_pass  http://localhost:8080;
    }

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

6.安装 Mysql

同样,宝塔面板里搜索安装。配置基本不用修改,默认就好。

安全

客户端日常使用sql时大部分只关注CRUD啥的语句,但mysql还需要注意下user权限等问题。比如默认安装完成后,mysql的root账号是只能localhost访问的,这意味着如果你想用datagrip等工具远程访问时不行~ 因此你还要修改下root账号的权限。一定注意放开后,密码要复杂一些,不能root / 123456 这种,很容易被别人暴力破解,然后你就会突然某天发现数据库空了,然后收到一封”你的数据在我手里,请用比特币来购买…“的勒索信。

还可以在面板里安装 phpMyAdmin 用于在线可视化管理 mysql。这样就不必打开root的公网访问权限,每次管理就登录宝塔后以localhost身份进入phpMyAdmin,更安全。

备份

宝塔还提供数据备份功能,可以在「计划任务」里按需新建。

我创建了俩,一个是每日备份数据库存在服务器本地。另一个是每周备份数据库保存在七牛云(可以先在宝塔软件商店下载七牛云插件然后配置key接入你的账号)。

7.安装 Redis

安装同上,默认配置。

8.部署SpringBoot 项目

以上SpringBoot项目的运行依赖环境都安装好了,注意还要在阿里云安全组里打开相应接口,如MySql 3306等。

最后,就是部署你的SpringBoot项目了,这里推荐使用使用Alibaba Cloud的IDEA插件自动部署。

至此就可以线上环境使用你的服务端接口了。