创建实体类

CartAddDTO,代码如下

DTO:前端收集到数据发送给后端的实体

VO:后端从数据库查询出来要发送给前端的实体

@Data
// 定义knife4j在线文档解释文本的注解
@ApiModel("新增购物车商品信息的DTO")
public class CartAddDTO implements Serializable {
​@ApiModelProperty(value = "商品编号", name="commodityCode",example = "PC100")private String commodityCode;   // 商品编号@ApiModelProperty(value = "商品单价", name="price",example = "136")private Integer price;          // 商品单价@ApiModelProperty(value = "商品数量", name="count",example = "3")private Integer count;          // 商品数量@ApiModelProperty(value = "用户ID", name="userId",example = "UU100")private String userId;          // 用户ID
}

创建包

pojo.cart.model

包中创建类Cart

@Data
public class Cart implements Serializable {private Integer id;// 商品编号private String commodityCode;// 价格private Integer price;// 数量private Integer count;// 用户idprivate Integer userId;
​
}

下面创建订单模块需要的类

pojo.order.dto.OrderAddDTO

@ApiModel("新增订单的DTO")
@Data
public class OrderAddDTO implements Serializable {@ApiModelProperty(value = "用户id",name="userId",example = "UU100")private String userId;@ApiModelProperty(value = "商品编号",name="commodityCode",example = "PC100")private String commodityCode;@ApiModelProperty(value = "商品数量",name="count",example = "5")private Integer count;@ApiModelProperty(value = "总金额",name="money",example = "50")private Integer money;
}

pojo.order.model.Order

@Data
public class Order implements Serializable {private Integer id;private String userId;private String commodityCode;private Integer count;private Integer money;
}

最后是库存相关的类

pojo.stock.dto.StockReduceCountDTO

@ApiModel("商品减少库存DTO")
@Data
public class StockReduceCountDTO implements Serializable {@ApiModelProperty(value = "商品编号",name="commodityCode",example = "PC100")private String commodityCode;@ApiModelProperty(value = "减库存数",name="reduceCount",example = "5")private Integer reduceCount;
}

pojo.stock.model.Stock

@Data
public class Stock implements Serializable {private Integer id;private String commodityCode;private Integer reduceCount;
}

创建异常相关类

创建包com.taobao.mall.commons.exception

包中创建类MallServiceException

/*** 业务异常*/
@Data
@EqualsAndHashCode(callSuper = false)
public class MallServiceException extends RuntimeException {
​private ResponseCode responseCode;
​public MallServiceException(ResponseCode responseCode, String message) {super(message);setResponseCode(responseCode);}
​
}

将restful包中用于控制器返回的JsonResult类复制

/*** 通用响应对象*/
@Data
public class JsonResult<T> implements Serializable {
​/*** 状态码*/@ApiModelProperty(value = "业务状态码", position = 1, example = "200, 400, 401, 403, 404, 409, 500")private Integer state;/*** 消息*/@ApiModelProperty(value = "业务消息", position = 2, example = "登录失败!密码错误!")private String message;/*** 数据*/@ApiModelProperty(value = "业务数据", position = 3)private T data;
​/*** 创建响应结果对象,表示"成功",不封装其它任何数据* @return 响应结果对象*/public static JsonResult<Void> ok() {return ok("OK");}
​public static JsonResult ok(String message){JsonResult jsonResult=new JsonResult();jsonResult.setState(ResponseCode.OK.getValue());jsonResult.setMessage(message);jsonResult.setData(null);return jsonResult;}/*** 创建响应结果对象,表示"成功",且封装客户端期望响应的数据* @param data 客户端期望响应的数据* @return 响应结果对象*/public static <T> JsonResult<T> ok(String message,T data) {JsonResult<T> jsonResult = new JsonResult<>();jsonResult.setState(ResponseCode.OK.getValue());jsonResult.setData(data);return jsonResult;}/*** 创建响应结果对象,表示"失败",且封装"失败"的描述** @param e MallServiceException异常对象* @return 响应结果对象*/public static JsonResult<Void> failed(CoolSharkServiceException e) {return failed(e.getResponseCode(), e);}
​/*** 创建响应结果对象,表示"失败",且封装"失败"的描述** @param responseCode "失败"的状态码* @param e            "失败"时抛出的异常对象* @return 响应结果对象*/public static JsonResult<Void> failed(ResponseCode responseCode, Throwable e) {return failed(responseCode, e.getMessage());}
​/*** 创建响应结果对象,表示"失败",且封装"失败"的描述** @param responseCode "失败"的状态码* @param message      "失败"的描述文本* @return 响应结果对象*/public static JsonResult<Void> failed(ResponseCode responseCode, String message) {JsonResult<Void> jsonResult = new JsonResult<>();jsonResult.setState(responseCode.getValue());jsonResult.setMessage(message);return jsonResult;}
​
}

我们编写的所有模块控制层发送异常时,也都由SpringMvc的统一异常处理类来处理

所以commons模块编写统一异常处理类也是常规操作

/*** 全局异常处理器*/
@RestControllerAdvice
@Slf4j
public class GlobalControllerExceptionHandler {
​/*** 处理业务异常*/@ExceptionHandler({MallServiceException.class})public JsonResult<Void> handleMallServiceException(MallServiceException e) {log.debug("出现业务异常,业务错误码={},描述文本={}", e.getResponseCode().getValue(), e.getMessage());e.printStackTrace();JsonResult<Void> result = JsonResult.failed(e);log.debug("即将返回:{}", result);return result;}
​/*** 处理绑定异常(通过Validation框架验证请求参数时的异常)*/@ExceptionHandler(BindException.class)public JsonResult<Void> handleBindException(BindException e) {log.debug("验证请求数据时出现异常:{}", e.getClass().getName());e.printStackTrace();String message = e.getBindingResult().getFieldError().getDefaultMessage();JsonResult<Void> result = JsonResult.failed(ResponseCode.BAD_REQUEST, message);log.debug("即将返回:{}", result);return result;}
​/*** 处理系统(其它)异常*/@ExceptionHandler({Throwable.class})public JsonResult<Void> handleSystemError(Throwable e) {log.debug("出现系统异常,异常类型={},描述文本={}", e.getClass().getName(), e.getMessage());e.printStackTrace();JsonResult<Void> result = JsonResult.failed(ResponseCode.INTERNAL_SERVER_ERROR, e);log.debug("即将返回:{}", result);return result;}
}

commons模块内容编写暂时告一段落

创建business模块

business:商业\生意\业务的意思

这个模块创建出来是为了触发订单业务的

创建项目

创建子项目mall-business

父子相认

子项目pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.mall</groupId><artifactId>mall</artifactId><version>0.0.1-SNAPSHOT</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.mall</groupId><artifactId>mall-business</artifactId><version>0.0.1-SNAPSHOT</version><name>mall-business</name><description>Demo project for Spring Boot</description>
​<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId></dependency><dependency><groupId>com.taobao</groupId><artifactId>mall-commons</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>
​
</project>

配置yml

yml文件配置数据源

spring:datasource:url: jdbc:mysql://localhost:3306/csmall_db?useSSL=false&useUnicode=true&characterEncoding=utf-8username: rootpassword: root

配置business模块application.yml文件

yml文件内容如下

server:port: 20000
#公共配置
mybatis:configuration:cache-enabled: false   # 不启用mybatis缓存map-underscore-to-camel-case: true # 映射支持驼峰命名法log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 将运行的sql输出到控制台
knife4j:# 开启增强配置enable: true# 生产环境屏蔽,开启将禁止访问在线API文档production: false# Basic认证功能,即是否需要通过用户名、密码验证后才可以访问在线API文档basic:# 是否开启Basic认证enable: false# 用户名,如果开启Basic认证却未配置用户名与密码,默认是:admin/123321username: root# 密码password: root
spring:profiles:active: dev

我们在配置末尾看到了

spring:profiles:active: dev

上面的配置含义是让SpringBoot读取额外配置文件

我们参数值编写的是dev,那么springBoot会读取application-dev.yml

dev是可以随意修改的名字,没有任何固定要求

SpringBoot相关配置

创建config包,编写一些必要配置

首先创建CommonsConfiguration

// 只有添加了@Configuration才能配置当前Spring环境
@Configuration
// 扫描commons模块的统一异常处理类,使其在项目中生效
@ComponentScan("cn.tedu.csmall.commons.exception")
public class CommonsConfiguration {
​
}

开发business的业务代码

因为business模块是业务的触发者,所以不需要数据库操作,直接编写业务逻辑层即可

创建service包,包中创建IBusinessService接口

代码如下

public interface IBusinessService {// 定义触发新增订单模块功能的方法void buy();
}

新建service.impl包

包中创建BusinessServiceImpl类

代码如下

@Service
@Slf4j
public class BusinessServiceImpl implements IBusinessService {@Overridepublic void buy() {// 模拟购买业务// 创建用于新增订单的DTO实体OrderAddDTOOrderAddDTO orderAddDTO=new OrderAddDTO();// 为orderAddDTO赋值orderAddDTO.setUserId("UU100");orderAddDTO.setCommodityCode("PC100");orderAddDTO.setCount(5);orderAddDTO.setMoney(500);// 因为是模拟购买,现在还不能调用order模块,所以只是输出log.info("新增订单的信息为:{}",orderAddDTO);}
}

创建控制层controller

创建类BusinessController代码如下

@RestController
@RequestMapping("/base/business")
// knife4j控制器描述
@Api(tags = "新增订单业务触发")
public class BusinessController {@Autowiredprivate IBusinessService businessService;
​@PostMapping("/buy")// localhost:20000/base/business/buy(必须是post请求,浏览器输入地址无效)@ApiOperation("执行触发的方法")public JsonResult buy(){// 调用业务逻辑层的方法businessService.buy();return JsonResult.ok("购买完成!");}
​
}

启动当前business项目

访问

http://localhost:20000/doc.html

搭建商城的微服务架构-2相关推荐

  1. 毕业设计无从下手?四个步骤手把手带你搭建一个后台微服务架构

    更多精彩文件点击访问:https://blog.csdn.net/weixin_45692705?spm=1011.2124.3001.5343 教程目录 后台技术栈 准备工作 一. 创建父工程 二. ...

  2. 快速正确的搭建一个微服务架构需要了解的那几个点

    原文:https://my.oschina.net/u/3636867/blog/1803023 作者:烂猪皮 一.微服务架构四大特性 好的微服务架构是什么样的呢?想要搭建好一个微服务架构,必须要具备 ...

  3. 微服务架构的环境搭建及简单测试

    目录 一.系统架构的演变过程 1.0 前言 1.1 单体应用架构 1.2 垂直应用架构 1.3 分布式架构 1.4 SOA架构 1.5 微服务架构 二.微服务架构搭建 2.1 微服务架构简介 2.2  ...

  4. 《Spring Cloud 微服务架构进阶》读书笔记

    前页 随着 DevOps 和以 Docker 为主的容器技术的发展,云原生应用架构和微服 务变得流行起来. 云原生包含的内容很多,如 DevOps.持续交付.微服务.敏捷等 第一章,微服务架构介绍 架 ...

  5. 视频教程-C++微服务架构及安全云盘项目实训-C/C++

    C++微服务架构及安全云盘项目实训 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真,计算机视觉,嵌入式图像处理,云安全审 ...

  6. 实战落地微服务架构商城项目-part01

    文章目录 分布式三高商城系统 一.系统架构演变 1.服务架构的演变 1.1单体架构 1.2集群 1.3垂直化 1.4服务化 1.5微服务化 微服务和SOA的区别 2.微服务架构的需求 2.1RPC框架 ...

  7. 阿里高级微服务架构师亲手教你搭建一套可自动化构建的微服务框架

    这套微服务框架能干啥? 这套系统搭建完之后,那可就厉害了: 微服务架构 你的整个应用程序将会被拆分成一个个功能独立的子系统,独立运行,系统与系统之间通过RPC接口通信.这样这些系统之间的耦合度大大降低 ...

  8. 微服务架构:动态配置中心搭建

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在微服务架构中,服务之间有着错综复杂的依赖关系,每个服务都有自己的依赖配置,在运行期间很多配置会根据访问流量等因素进行调整,传统的配置信息 ...

  9. 5分钟看懂微服务架构下的Consul 特性及搭建

    一.前言 虽然说牛逼的公司都有那么几个牛逼的运维团队,牛逼的运维团队都有着神秘黑科技般敲代码的姿势:本人虽然不是一个运维工程师,但是自己比较爱倒腾这些东西,会那么一点点运维姿势,虽然不算专业,但是还是 ...

最新文章

  1. Kubernetes文章汇总
  2. 马云携阿里17位创始人及合伙人捐赠浙大一院5.6亿,杭州渐成中国硅谷
  3. php自己总结的一些经典的实例
  4. Python基础、条件语句和基本数据类型
  5. Windows下静态链接库的使用
  6. kali2020识别不到网卡_WIN10环境下台式机找不到RealTek HD管理器解决耳塞式耳机外放问题...
  7. hihocoder1033交错和
  8. c语言检查tcp连接_TCP/IP的底层队列
  9. paip.java优缺点attilax总结c0.doc
  10. 分别使用御剑工具和dirsearch工具(需要在kali下进行安装)对http://159.75.16.25进行扫描, 扫描出敏感文件,敏感文件内有flag值
  11. php无法运行,php不执行是什么原因造成的
  12. r5 5600g和5600x的区别 选哪个好
  13. 操作系统-软件架构设计
  14. Centos6.5离线安装中文输入法
  15. 虚拟服务器 vmotion,VMotion简单步骤
  16. MagicLicense破解记录
  17. python关键字提取源码_python实现按关键字筛选日志文件
  18. 1166 Summit – PAT甲级真题
  19. 是一场短暂而美好的修行
  20. 高德地图API——信息窗体InfoWindow

热门文章

  1. 鞍山c语言培训,10_鞍山科技大学:C语言与数据结构_ppt_大学课件预览_高等教育资讯网...
  2. Lady General Hua Mu-lan花木兰剧本
  3. resume english
  4. iou(交并比)的概念
  5. 【关于vue的那些事】vue.runtime.esm.js?2b0e:619
  6. mysql8对系统的要求_linux-mysql8的安装步骤详解及需要注意的坑
  7. torch.nn、(二)
  8. 吸血鬼数字 java_找出吸血鬼数(Java)
  9. 莫纳什大学招收AI/CV/ML/计算生物信息学和生物医学方向全奖博士研究生
  10. java 上位机 socket_通讯编程上位机软件实现(SOCKET)——第二回