App项目实战之路(五):服务端篇

2016 年 10 月 6 日 Keegan小钢 Keegan小钢

近一个月因为忙于其他事情,一直没能抽出时间来更新项目进度。现在,只能趁着国庆期间,赶紧抽空更新下进度。这次,我想简单谈谈服务端的一些东西。

之前,我是没打算将服务端也列入开源名单的。但现在的想法已经改变了,我打算将整个项目都开源,不只是Android端和iOS端,也包括服务端,为一些有志于成为全栈工程师(甚至是全栈架构师)的程序猿提供一个不断进化的完整的学习项目。

技术选型

如果从成本考虑的话,使用像Bmob、APICloud、LeanCloud之类的第三方平台可以节省很多成本。不用自己购买、搭建和维护服务器,也省下了很多的服务端开发成本。然而,因为本项目已定位为全栈的学习项目,所以,服务端还是自己搭建的好。

那么,自己搭建的话,另一个问题就是:选择Node还是选择Java呢?我的答案是Java,原因有二:

  1. 我本是做Java出身的,自然对Java比较熟;
  2. Java有更成熟完善的生态体系,更适合做大型系统,你不会只满足于做小系统吧。

选择了Java,接下来则是IDE的选型了。应该选择哪个,看一张图就知道了:

我们应该要顺势而行,所以,无疑IDEA就是首选了。

接着,就要选择Web框架了,同样,我们来看下一张趋势图:

Spring依然主宰着Web框架市场,而且,Spring Boot剧增,不用它还用谁呢。

再看看构建工具:

Maven依然还是主流,但我更喜欢Gradle。Gradle结合了Ant和Maven的优点,相比Maven繁冗的XML,Gradle显得很简洁,而且也更灵活。

数据库方面,我选择了广泛使用的MySQL。原因有二:一是据闻Facebook、Twitter等社交平台核心数据库也是MySQL;二是MySQL 5.7版本加入了对JSON格式的原生支持,这点特性使得MySQL也具备了NoSQL的功能。但本项目初期考虑先只用关系型的数据结构。

最后,应用服务器自然就是选择Tomcat了,请看下图:

环境搭建

技术选型完成了,那么,接下来,就要搭建环境了。当然,这里是指本地的开发环境,如果要搭建外网服务器,那还得购买阿里云或AWS的云服务。

搭建环境至少需要安装JDK、IDEA、MySQL,因为IDEA内嵌了Tomcat,所以可以不用安装。三款工具都直接从官网下载即可,以下我列出了下载页面的地址:

JDK根据自己的系统选择相应的安装包即可。IDEA要下载Ultimate版本,而不是Community版本。虽然Ultimate只有30天试用期,但找个有效的激活服务器即可。MySQL的版本则是5.7.15,如果你是Mac,那记得是要下载DMG Archive的安装包。另外,需要注意,MySQL安装成功之后会弹出提示框,给出了root用户的临时密码,这个密码一定要记住。

因为我是Mac环境,再补充下Mac环境下如何启动MySQL,以及MySQL安装后所存放的位置。MySQL安装完之后,在系统偏好设置里,就会多出一项MySQL的设置,打开后就会出现如下界面:

点击“Start MySQL Server”按钮即可启动MySQL了。

而MySQL的安装位置在 /usr/local/ 下,一个类似于“mysql-5.7.15-osx10.11-x86_64”这样的目录就是安装后的目录,另外还存在一个名为“mysql”的快捷方式:

进入mysql/bin目录,再运行”./mysqladmin -u root -p password”命令可修改root的密码,当然,运行该命令后,会先要求输入当前的密码,也就是安装完成时提示的那个临时密码,之后就会要求你输入新密码。

虽然可以直接用命令行操作数据库,但始终不太方便,因此,一般都会装个客户端。这里我只介绍两款客户端工具,一款是MySQL官方出品的 Workbench,免费的;另一款则是 Navicat,但需要找破解版。不过,我安装的Navicat 11.2.3版本没看到有对JSON格式的支持,Workbench就有。

项目构建

一切准备工作都已就绪,接下来就可以开始构建项目了。

打开IDEA,新建一个项目,左侧菜单选择 Spring Initializr,如下图:

一开始的时候,Project SDK的位置是空的,需要点击右侧的New按钮,然后弹出如下图的下拉菜单,选择JDK,然后选择你所安装的JDK的位置:

选好了JDK,就可以进入下一步了。这时需要设置Project的一些基本信息,如下图:

其中,Type有4种选择:

  • Maven Project (Generate a Maven based project archive)
  • Maven POM (Generate a Maven pom.xml)
  • Gradle Project (Generate a Gradle base project archive)
  • Gradle Config (Generate a Gradle build file)

本项目选用了Gradle Project。下一步则可以选择Spring的一些依赖库,我只选择了两项:Web、MySQL。

接着就是给Project选择一个存放路径了:

Finish之后,开始Import之前还会再设置一些选项,把所有选项都勾选上即可:

Project构建完成之后,还需要设置数据源。设置是在 application.properties 文件里进行设置,该文件的路径如下:

application.properties 中添加如下内容:

spring.datasource.url=jdbc:mysql://localhost:3306/coderx
spring.datasource.username=root
spring.datasource.password=password4root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

其中,coderx 是我已在本地建立的本项目的数据库。username 设置为 root 用户,而 password 就是 root 用户的密码了。

设置好数据源之后,为了操作方便,还需要再引入持久层框架。Spring也有提供了JDBC,需要引入jdbc的依赖包,主要就是通过JdbcTemplate建立与数据库的连接。不过,更主流的方案是引入MyBatis,我也倾向于使用MyBatis。

引入MyBatis也很简单,打开项目的 build.gradle 文件,在 dependencies 添加 mybatis-spring-boot-starter 依赖,加完依赖之后的 dependencies 如下:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('mysql:mysql-connector-java')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.1.1")
}

代码实现

最后,需要写一些代码把所有东西串起来了。在这之前,我已经在 coderx 数据库里新建了一张 user 表。这是建表的SQL语句:

CREATE TABLE `coderx`.`user` (    `userid` INT NOT NULL AUTO_INCREMENT,    `gender` TINYINT(1) NULL DEFAULT 0 COMMENT '0:未知;1:男;2:女',    `mobile` VARCHAR(45) NOT NULL COMMENT '手机号',    `email` VARCHAR(45) NULL COMMENT '邮箱',    `realname` VARCHAR(45) NULL COMMENT '真实姓名',    `nickname` VARCHAR(45) NULL COMMENT '昵称',    `avatar` VARCHAR(128) NULL COMMENT '头像',    `job` VARCHAR(128) NULL COMMENT '职位',    `company` VARCHAR(128) NULL COMMENT '公司',    `bio` VARCHAR(128) NULL COMMENT '个人简介',    `blog` VARCHAR(128) NULL COMMENT '博客',    `github` VARCHAR(128) NULL COMMENT 'github',    `createTime` TIMESTAMP(3) NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',    `updateTime` TIMESTAMP(3) NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '更新时间',    PRIMARY KEY (`userid`),    UNIQUE INDEX `mobile_UNIQUE` (`mobile` ASC),    UNIQUE INDEX `uuid_UNIQUE` (`uuid` ASC))ENGINE = InnoDBDEFAULT CHARACTER SET = utf8COLLATE = utf8_bin COMMENT = '用户表';

然后,我在 me.keeganlee.coderx 包下新建了 beanmappercontroller 三个包,分别用于存放实体、实体映射和控制器。在 bean 包中新建了一个 User 类,对应数据库的User表结构;在 mapper 包中新建了 UserMapper 接口,方法映射为对User表的操作;在 controller 包中新建了 UserController 类,实现对外的Request API。

User.java 代码如下,其属性名称和User表的字段名称是一致的:

public class User {    private int userid;    private int gender;    private String mobile;    private String email;    private String realname;    private String nickname;    private String avatar;    private String job;    private String company;    private String bio;    private String blog;    private String github;    private Date createTime;    private Date updateTime;    //省略Getter和Setter}

UserMapper.java 代码如下,添加了新增用户和查询用户的两个接口:

@Mapperpublic interface UserMapper {    @Insert("INSERT INTO USER(gender, mobile, email, realname, nickname, " +            "avatar, job, company, bio, blog, github) " +            "VALUE(#{gender}, #{mobile}, #{email}, #{realname}, #{nickname}, " +            "#{avatar}, #{job}, #{company}, #{bio}, #{blog}, #{github})")    int createUser(User user);    @Select("SELECT * FROM USER WHERE userid = #{userid}")    User queryUserById(@Param("userid") int userid);
}

UserController.java 代码如下,实现创建用户和获取用户的两个API:

@RestController@RequestMapping("/users")public class UserController {    @Autowired    private UserMapper userMapper;    @RequestMapping(value = "", method = RequestMethod.GET)    public Object createUser(@ModelAttribute User user) {
        Map<String, String> result = new HashMap<>();        int createResult = this.userMapper.createUser(user);        if (createResult > 0) {
            result.put("msg", "success");
        } else {
            result.put("msg", "failed");
        }        return result;
    }    @RequestMapping(value = "/{userid}", method = RequestMethod.GET)    public User getUser(@PathVariable("userid") int userid) {        return this.userMapper.queryUserById(userid);
    }
}

验证结果

最后一步就是要验证结果了。运行 CoderXApplication 类的 main 方法启动服务。启动成功的话,会打印出如下消息:

启动完成后,在浏览器输入分别输入验证的URL,以下是我验证的结果:

Request: http://localhost:8080/users?mobile=13800138000&nickname=Keegan小钢
Response: {"msg": "success"}

Request: http://localhost:8080/users/1
Response: {"userid":1,"gender":0,"mobile":"13800138000","email":null,"realname":null,"nickname":"Keegan小钢","avatar":null,"job":null,"company":null,"bio":null,"blog":null,"github":null,"createTime":1475722472884,"updateTime":1475722472884}

写在最后

至此,服务端开发的准备工作就算完成了,剩下的就是业务上的实现了。这篇文章的内容都很简单,只讲了一些入门的东西。下一篇,我想聊聊数据库的设计。


扫描以下二维码即可关注订阅号。

登录查看更多
0

相关内容

一个开源的关系型数据库,开发者为瑞典 MySQL AB 公司。在2008年1月16号被 Sun 公司收购。而2009年,SUN 又被 Oracle 收购.目前 MySQL 被很多互联网企业所使用。有体积小、速度快、总体拥有成本低,开放源码等优点
【2020新书】实战R语言4,323页pdf
专知会员服务
101+阅读 · 2020年7月1日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
118+阅读 · 2020年5月10日
【资源】100+本免费数据科学书
专知会员服务
108+阅读 · 2020年3月17日
【2020新书】数据科学:十大Python项目,247页pdf
专知会员服务
214+阅读 · 2020年2月21日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
96+阅读 · 2019年12月4日
资源|Blockchain区块链中文资源阅读列表
专知会员服务
44+阅读 · 2019年11月20日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
23+阅读 · 2019年11月7日
【实战分享】电影推荐系统项目实战应用
七月在线实验室
34+阅读 · 2019年3月7日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
基于TensorFlow的深度学习实战
七月在线实验室
9+阅读 · 2018年4月25日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
Google 开源机器学习算法;2018 年 SO 数据库调查
技术最前线
4+阅读 · 2018年3月14日
项目实战:如何构建知识图谱
PaperWeekly
30+阅读 · 2017年9月14日
开源巨献:阿里巴巴最热门29款开源项目
算法与数据结构
5+阅读 · 2017年7月14日
Arxiv
5+阅读 · 2019年11月22日
Arxiv
6+阅读 · 2018年2月7日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
101+阅读 · 2020年7月1日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
118+阅读 · 2020年5月10日
【资源】100+本免费数据科学书
专知会员服务
108+阅读 · 2020年3月17日
【2020新书】数据科学:十大Python项目,247页pdf
专知会员服务
214+阅读 · 2020年2月21日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
96+阅读 · 2019年12月4日
资源|Blockchain区块链中文资源阅读列表
专知会员服务
44+阅读 · 2019年11月20日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
23+阅读 · 2019年11月7日
相关资讯
【实战分享】电影推荐系统项目实战应用
七月在线实验室
34+阅读 · 2019年3月7日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
基于TensorFlow的深度学习实战
七月在线实验室
9+阅读 · 2018年4月25日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
Google 开源机器学习算法;2018 年 SO 数据库调查
技术最前线
4+阅读 · 2018年3月14日
项目实战:如何构建知识图谱
PaperWeekly
30+阅读 · 2017年9月14日
开源巨献:阿里巴巴最热门29款开源项目
算法与数据结构
5+阅读 · 2017年7月14日
Top
微信扫码咨询专知VIP会员