十次方day01(系统设计与工程搭建)

一.系统设计

         十次方名称的由来: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

  1. GET(SELECT):从服务器取出资源(一项或多项)。
  2. POST(CREATE):在服务器新建一个资源。
  3. PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
  4. 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地址实现对状态的变更

  1. GET(SELECT):从服务器取出资源(一项或多项)。
  2. POST(CREATE):在服务器新建一个资源。
  3. PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
  4. 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());
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的小巍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值