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

前言:在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 {

    @Autowired
    private 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 {
    @Override
    public 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;
    }

    @Override
    public 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);
    }

    //  .......可根据自己的需要往下延伸


    @Override
    public 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 {

    @Autowired
    private 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

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Spring Cloud 微服务架构实战代码是一个基于 Spring Cloud 微服务解决方案的实践项目。它通过将常见的微服务技术组件和应用场景进行集和示例演示,使读者能够深入了解和学习 Spring Cloud 微服务架构的实际应用。 该项目包含多个模块,其包括注册心(Eureka)、配置心(Config)、网关(Zuul)、负载均衡(Ribbon)、链路跟踪(Sleuth)、熔断器(Hystrix)等,涵盖了微服务架构的关键技术组件。在实现过程,项目采用了 Spring Boot 来简化微服务架构的搭建和开发,并以 Maven 进行依赖管理和构建。 通过该项目的学习,读者可以了解到微服务架构的基本概念、实际应用场景和解决方案,掌握 Spring Cloud 微服务架构的相关技术和工具的实际应用,了解微服务架构的开发和部署流程,掌握基于 Spring Boot 的微服务开发和集方法,从而提高微服务架构的设计实现和部署能力。 总之,Spring Cloud 微服务架构实战代码是一份完整的微服务架构实践项目,它可以帮助读者深入学习和了解微服务架构的实际应用,并具备较高的实际参考价值。 ### 回答2: Spring Cloud是一个开源的微服务架构实战代码,能够让开发人员在构建分布式系统时快速开发和部署微服务。它诞生于Spring项目之上,提供了基于Spring Boot的一套开发工具和服务,可以方便地管理和实现微服务架构的各项需求。 Spring Cloud包含了许多组件,如Eureka、Feign、Hystrix、Zuul等,这些组件都可以独立使用,也可以混合使用,相互之间的集非常容易。例如,Eureka提供了服务注册与发现的能力,Feign支持微服务之间的远程调用,Hystrix可以提供服务的自我保护机制,Zuul可以提供API网关的功能,等等。 通过使用Spring Cloud,开发人员可以有效地解决微服务需要处理的分布式问题,例如服务发现、服务注册、服务负载均衡、熔断、容错、路由、安全等等。此外,Spring Cloud还提供了一些常用的开发工具,如Spring Cloud Config,它可以帮助团队在开发和发布过程有效地管理和配置系统的环境和配置文件。 总之,Spring Cloud是一套非常完善,且易于集、扩展的微服务架构实战代码,尤其适用于企业级和大型系统的开发。它能够快速地实现微服务的各项技术需求,提高开发效率,使得开发人员更加专注于业务逻辑的开发,而不用再花费大量时间和精力处理微服务本身的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Keson Z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值