前言:在SpringCloud微服务项目中,我们经常需要跨模块调用接口方法来实现相应的业务逻辑,所以会经常有一些公共重复性的代码,比如接受其他模块接口返回的对象类、接口返回格式封装类、一些工具类以及一些调用第三方接口的实现类等等。

当项目下的子模块越来越多,代码重复的次数也会越来越多,如果每次新增一个子模块又要进行重复代码编写的话,会使得项目越来越冗余,这是我们最不想看到的。为了使这些代码更好的进行管理和复用,我们可以单独构建一个子模块,用来存放这些公共代码。当某个模块需要调用时,只需要用maven工具将该公共模块进行打包,然后在需要调用模块的pom.xml文件中引入该公共模块的依赖即可。


文章目录

  • 一。示例项目说明:
  • 二。项目实现
  • 三。模块重构

一。示例项目说明:

1.初始项目结构

  • springcloud_demo:项目名称
  • eureka-server:服务注册与发现子模块
  • provider:服务提供子模块
  • consumer:服务消费子模块

2.项目场景

consumer服务消费子模块业务逻辑中需要获取所有用户的信息,但是用户接口模块是provider服务提供子模块来进行操作的,所以consumer需要调用provider的接口方法,来拿到所有用户的信息。

二。项目实现

1.provider服务提供端

Controller层

/*** @Description:服务端控制器* @Author :zks* @Date :16:07 2020/8/27*/
@RequestMapping("provider")
@RestController
public class ProviderController {@Autowiredprivate IUserService userService;/*** 得到全部用户信息* @return*/@GetMapping("getUserList")public Result getUser(){List<User> users=userService.getUserList();return Result.success(users);}}

Service层

/*** @Description:用户Service* @Author :zks* @Date :14:24 2020/9/10*/
public interface IUserService {/*** 得到所有用户信息* @return*/List<User> getUserList();
}
/*** @Description:用户Service实现* @Author :zks* @Date :14:26 2020/9/10*/
@Service
public class IUserServiceImpl implements IUserService {@Overridepublic List<User> getUserList() {List<User> users=new ArrayList<>();//这里模拟从数据库获取数据User userOne=new User();userOne.setId(1);userOne.setUserName("张三");userOne.setPassword("123456");User userTwo=new User();userTwo.setId(2);userTwo.setUserName("李四");userTwo.setPassword("654321");users.add(userOne);users.add(userTwo);return users;}
}

Domain层

/*** @Description:用户实体类* @Author :zks* @Date :13:43 2020/9/10*/
public class User {private int id;private String userName;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", userName='" + userName + '\'' +", password='" + password + '\'' +'}';}
}

util接口返回封装工具类

/*** @Description:后台接口返回json格式封装类* @Author :zks* @Date :11:58 2020/9/8*/
public class Result<T> implements Serializable {//状态码private Integer status;//状态private String message;//返回封装数据private T data;public Result() {}public Result(Integer status) {this.status = status;}public Result(Integer status, String message) {this.status = status;this.message = message;}public Result(Integer status, String message, T data) {this.status = status;this.message = message;this.data = data;}//不返回数据构造方法public Result(CodeEnum codeEnum) {this.status = codeEnum.getCode();this.message = codeEnum.getMessage();}//返回数据构造方法public Result(CodeEnum codeEnum, T data) {this(codeEnum);this.data = data;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}//请求成功(不返回数据)public static <T> Result <T> success(){return new Result <T>(CodeEnum.SUCCESS);}//请求成功(返回数据)public static <T> Result <T> success(T data){return new Result <T>(CodeEnum.SUCCESS,data);}//参数格式不正确public static <T> Result <T> badRequest(){return new Result <T>(CodeEnum.BAD_REQUEST);}//  .......可根据自己的需要往下延伸@Overridepublic String toString() {return "Result{" +"status=" + status +", message='" + message + '\'' +", data=" + data +'}';}
}
/*** @Description:状态码枚举类* @Author :zks* @Date :14:00 2020/9/8*/
public enum CodeEnum {/*** 成功*/SUCCESS(200, "ok"),/*** 参数不齐全或参数错误*/BAD_REQUEST(400,"参数不正确");private Integer code;private String message;CodeEnum(Integer code, String message) {this.code = code;this.message = message;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

构建完成项目结构图如下:


2.consumer服务消费端

Controller层

/*** @Description:消费端控制器* @Author :zks* @Date :16:18 2020/8/27*/
@RequestMapping("consumer")
@RestController
public class ConsumerController {@Autowiredprivate ConsumerService consumerService;@RequestMapping("getUserList")public Result getUserList(){return consumerService.getUserList();}
}

Service层

/*** @Description:使用@FeignClient注解调用注册子模块接口方法* @Author :zks* @Date :16:31 2020/8/27*/
//注册子模块名称
@FeignClient(value = "service-provider")
public interface ConsumerService {/*** 跨模块调用得到用户信息列表* @return*/@GetMapping("provider/getUserList")public Result getUserList();}

Domain层util接口返回封装工具类与provider消费端一致。

构建完成项目结构图如下:

项目总结构图如下:

因为侧重点不同,这里没有详细写到项目创建过程,如果对该项目创建有疑惑,可以去看我的另外一篇博文:使用Idea构建SpringCloud项目(图文详解+简单易懂)里面有详细的步骤。

3.项目运行

依次启动eureka-server、provider和consumer:


用postman测试成功:

4.总结

由上述实现代码我们可以发现,Domain层util接口返回封装工具类其实都是两个模块所共用,且代码一致,那我们为何不把它拿出来防在一个公共模块来进行调用呢?

三。模块重构

1.新建一个子模块common-api



重构后项目结构如下:

2.放入公共代码


3.用maven工具打包发布

先clean再install:


打包完成:

4.引入该公共模块依赖

删除consumerprovider中的公共代码:

打开common-api的pom.xml文件,找到打包依赖:

分别复制到consumerprovider的pom.xml文件中:


导入公共模块中的类:


5.项目运行

运行项目使用postman进行测试,成功拿到接口数据:

该Springcloud微服务中多模块重复代码重构成公共模块demo已上传,有需要的小伙伴可以自行下载:springcloud_demo

Springcloud微服务中多模块重复代码重构成公共模块的实现相关推荐

  1. 容器化技术与微服务结合---结合springcloud微服务框架进行部署(含切换成阿里云docker仓库)(五)

    目录 系列 更换成阿里云仓库 开通阿里云镜像服务 创建仓库 本地k8s切换成阿里云的镜像仓库 测试阿里云镜像 准备简单的微服务 eureka 应用配置 k8s配置: demo-a 应用配置 k8s配置 ...

  2. SpringCloud微服务前后端分离开发中出现的弱智问题之(不支持当前请求方法)

    SpringCloud微服务前后端分离开发中出现的弱智问题之(不支持当前请求方法) 问题背景 问题解决 为什么说这是一个弱智问题,因为这多是编写代码不仔细造成的. 问题背景 当当后台API发布的接口与 ...

  3. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

  4. Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

    Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...

  5. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台:   微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...

  6. SpringCloud微服务架构学习

    SpringCloud 1. 微服务架构理论入门 1.1. 微服务架构概述 微服务架构是一种架构模式,它提倡将单一应用程序划分为一组小的服务,服务之间互相协调,互相配合,为用户提供最终价值.每个服务运 ...

  7. SpringCloud 微服务(一)

    看完了黑马程序员的免费课程,感觉受益匪浅,写个笔记,记录一下 课程地址:https://www.bilibili.com/video/BV1LQ4y127n4?p=1 1.微服务框架,学习哪些内容 系 ...

  8. SpringCloud微服务架构实战:商家权限体系设计及开发

    商家管理后台与sso设计 在本文的电商平台实例中,商家是这个平台的主角,商家管理后台是专门为这个主角提供的一个安全可靠的操作平台.在商家管理后台中,商家可以进行商品管理.订单管理.物流管理.会员管理. ...

  9. SpringCloud微服务技术实践与总结(基础篇)

    1.认识微服务 1.1.单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署. 单体架构的优缺点如下: 优点: 架构简单.部署成本低 缺点: 耦合度高(维护困难.升级困难) 1.2 ...

  10. SpringCloud 微服务框架

    单体架构:将业务全部功能集中到一个项目中,打成一个war包存储,部署在一台服务器中,只有一个数据库 优点 :架构简单,部署成本低.适合小型项目 问题:高并发性能问题,开发时代码耦合问题,部署升级时停服 ...

最新文章

  1. SpringBoot多线程环境下,解决多个定时器冲突问题
  2. MySQL导出到excle显示不了_mysql导出select语句结果到excel文件遇到问题及解决方法_MySQL...
  3. CSS3 常用属性
  4. java异常体系分类(面试)
  5. RFI远程文件包含的漏洞
  6. 翻译题(map使用)
  7. Win7系统还原声音图标的方法
  8. 看看webpack打包优化
  9. logo qt添加_Qt官方示例-窗口标志
  10. 通过密钥 SFTP(三)指定不限定根目录
  11. win7 旗舰版 64位注册dll(regsvr32)失败解决方法
  12. ASO优化:如何提炼ASO关键词词库
  13. python运维都做些什么_系统运维是做什么的(python在实际工作中的应用)
  14. 编码原则总结:面向对象设计的SOLID原则
  15. oracle12c 删除磁盘组,12C RAC重装无法识别磁盘组(AFD新特性)
  16. 多台主机同时接到一台显示器上
  17. 蓄电池与超级电容混合储能并网matlab/simulink仿真模型,混合储能采用低通滤波器进行功率分配,可有效抑制功率波动
  18. 【Java基础】JDBC
  19. linux:置之死地而后生,一次系统急救后的经验总结
  20. 跨境电商shopify 独立站如何引流量-上篇(付费流量版)__多账号管理浏览器AdsPower

热门文章

  1. scrapy框架爬取大单、中单、小单净流入流出
  2. 数据结构练习题——图(含应用题)
  3. 7-8 哈利·波特的考试,7-9 旅游规划,7-10 公路村村通
  4. 密码学的安全性浅析-1
  5. MMDetection学习教程(一)
  6. 前端必备:六款CSS工具让代码充满魅力
  7. plsql远程连接oracle数据库及报ORA-12514错误解决
  8. MTK6577+Android之Camera驱动
  9. 如何搭建 MTK 6577模拟器
  10. 考研之复习经验与时间安排篇