一.系统设计
十次方名称的由来:2的10次方为1024
1.系统架构
springboot+springcloud+springmvc+springdata 这是称为全家桶
2.模块划分
3.数据库表的采用分库分表,每个业务采用一个数据库
4.API文档
我们采用前后端完全分离的开发模式,文档采用Sawagger语言进行编写,并与nginx进行整合了,通过localhost:801就可以查看
5.restful风格请求
restful:是一种软件设计风格,不是标准也不是规范,设计理念,通过统一的url地址实现对状态的变更
它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用
7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
- DELETE(DELETE):从服务器删除资源。
二.项目前期准备
JDK1.8
数据库mysql 5.7
开发工具 idea 2017.1.2
maven版本3.3.9
docker 最新版本
centos7
VMware Workstation Pro 12
1.docker命令复习
1.安装docker
2.镜像相关的操作
- 互联网查询镜像 docker search 镜像名称(关键字)
- 下载镜像 docker pull 镜像名称
- 本地镜像 : (查询) docker images (删除)docker rmi 镜像名称/镜像id
3.容器相关的操作
运行:
- 交互式运行方式 : docker run -ti --name=容器名称[-e -p -v] 镜像名称/id (本地如果没有尝试互联网下载)/bin/bash
- 守护式运行方式: docker run -id --name=容器名称[-e -p -v] 镜像名称/id (本地没有就尝试从互联网下载)
容器状态查询:
- 查询运行中的容器 docker ps
- 查询所有的容器 docker ps -a
启动容器:
- docker start 容器id/容器名称
停止容器 : docker stop 容器id/容器名称
重启容器: docker restart 容器id/容器名称
删除容器: docker rm 容器id/容器名称
mysql容器创建
docker run -di --name=mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 centos/mysql-57-centos7docker run -di --name=mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 centos/mysql-57-centos7
三.搭建工程
画图分析我们的搭建的工程:
具体的步骤分析:
1.创建父工程,tensquare_parent映入通用的依赖信息,插件信息,导入工程所需要的数据库表
2.创建工程子模块项目:提供通用类和工具类tensquare_common
- 前端调用后端微服务执行CURD返回结果java类,将java类转化json返回
- 在后端进行分页查询,得到结果提供通用类
- 其他的模块新增记录,使用id生成器
3.我们创建基础微服务:实现标签数据CRUD将标签数据存放,mysql数据库tensquare_base
- 创建项目,映入相关依赖,mysql spring-data-jpa springboot ,公共子模块common
- 提供配置文件 编写启动类
- 常见对应的实体类 创建标签的三级类,通过注解创建三层对象,完成注入
- 根据API的文档进行,进行提供方法处理前端请求
- 使用postman进行测试
四.基础微服务-标签的crud
controller
package com.tensquare.base.controller;
import com.tensquare.base.entity.Result;
import com.tensquare.base.entity.StaticCode;
import com.tensquare.base.pojo.Label;
import com.tensquare.base.service.LabelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@CrossOrigin //允许跨域
@RequestMapping("/label")
public class LabelController {
@Autowired
private LabelService labelService;
//添加方法
@PostMapping
public Result add(@RequestBody Label label){
labelService.add(label);
return new Result(true,StaticCode.OK,"添加成功");
}
//删除方法
@DeleteMapping("/{id}")
public Result delete(@PathVariable String id){
labelService.deleteById(id);
return new Result(true,StaticCode.OK,"删除成功");
}
//修改
@PutMapping("/{labelId}")
public Result update(@PathVariable String labelId,@RequestBody Label label){
label.setId(labelId);
labelService.update(label);
return new Result(true,StaticCode.OK,"修改成功");
}
//查询所有
@GetMapping
public Result findAll(){
// int i = 1/0; 模拟异常
return new Result(true,StaticCode.OK,"查询成功",labelService.findAll());
}
//通过id查询
@GetMapping("/{labelId}")
public Result findById(@PathVariable String labelId){
return new Result(true, StaticCode.OK,"查询成功",labelService.findById(labelId));
}
}
service
package com.tensquare.base.service.impl;
import com.tensquare.base.dao.LabelDao;
import com.tensquare.base.pojo.Label;
import com.tensquare.base.service.LabelService;
import com.tensquare.util.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 基本label的方法
*/
@Service
public class LabelServiceImpl implements LabelService {
@Autowired
private LabelDao labelDao;
@Autowired
private IdWorker idWorker;
@Override
public void add(Label label) {
//注意id的转换
label.setId(idWorker.nextId()+"");
labelDao.save(label);
}
@Override
public void deleteById(String id) {
labelDao.deleteById(id);
}
@Override
public void update(Label label) {
labelDao.save(label);
}
@Override
public List<Label> findAll() {
return labelDao.findAll();
}
@Override
public Label findById(String id) {
return labelDao.findById(id).get();
}
}
dao
/**
* 基于jpa的dao接口
*/
public interface LabelDao extends JpaRepository<Label,String>,JpaSpecificationExecutor<Label> {
}
公共异常类
package com.tensquare.base.controller;
import com.tensquare.base.entity.Result;
import com.tensquare.base.entity.StaticCode;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 用于拦截全局的异常
*/
@ControllerAdvice
public class BaseExceptionHandler {
//设置捕获异常并做处理
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result error(Exception e){
e.printStackTrace();
return new Result(false, StaticCode.ERROR,"出现异常"+e.getMessage());
}
}
base包下entity,定义状态码
public class StaticCode {
public static final int OK = 20000; //成功
public static final int ERROR = 20001; //失败
}
部分测试:
五.总结:
1.谈谈你对Restful的理解
是一种软件设计风格,不是标准也不是规范,设计理念,通过统一的url地址实现对状态的变更
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
- DELETE(DELETE):从服务器删除资源。
2.你做过的项目是不是分布式的?ID如何保证不会重复
通过推特公司的雪花算法,实现id的唯一,而且可以实现排序
3.你是如何实现对异常的处理
自己定义一个公共controller 异常类
/**
* 统一异常处理类
*/
@ControllerAdvice
public class BaseExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result error( Exception e) {
e.printStackTrace();
return new Result(false, StatusCode.ERROR, e.getMessage());
}
}