前言

        本文所记录的构建消费者模块,仅为SpringCloud学习视频中的项目,主要让大家对未使用SpringCloud 相关组件时,对多个子模块间调用有个大体认识,为后续微服务项目学习铺垫基础,并没有严格的对服务进行细分等。

一、创建消费者子模块

1. 创建消费者子模块(cloud-consumer-order80)

        子模块构建流程和中大体一样,仅需修改模块名称、pom.xml 和 application.yml 文件。

消费者子模块 pom.xml 如下

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-order80</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

application.yml 文件如下

server:
  port: 80

2. 新建相关业务类

        消费者模块中,不需要对具体业务进行操作,通过调用之前新建的支付模块(cloud-provider-payment8001) 的 controller 中的相关方法实现具体操作。

2.1.1 新建相关 bean 类,内容和支付子模块中的一样

springcloud中模块调用用什么呢 springcloud common 模块_SpringCloud

2.1.2 新建 ApplicationContextConfig 配置类

        通过 ApplicationContextConfig 配置类,将用于不同子模块间调用的 RestTemplate 注入到Spring 容器中。

        RestTemplate 提供了多种便捷远程访问 Http 服务的方法,是一种简单便捷的访问 RESTFUL 服务模板类,是 Spring 提供的用于访问 Rest 服务的客户端模板工具集。

        官网地址:RestTemplate (Spring Framework 5.2.2.RELEASE API)

        使用 RestTemplate 访问 RESTFUL 接口非常简单,仅需无脑的传入三个参数即可,(url(REST请求地址), requestMap(请求参数), ResponseBean.class(HTTP响应转换被转换成的对象类型))

package com.atguigu.springcloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

/**
 * @auther He
 * @date 2022-04-26 22:19
 */
@Component
public class ApplicationContextConfig {

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

2.1.3 新建 controller 类

        新建的controller 类 OrderController.java 为消费者模块的接口入口,在当前 controller 类中通过注入 RestTemplate 调用订单模块中的各接口,以达到模拟子模块间的远程调用。

package com.atguigu.springcloud.controller;

import com.atguigu.springcloud.bean.CommonResult;
import com.atguigu.springcloud.bean.Payment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @auther He
 * @date 2022-04-26 22:14
 */
@RestController
public class OrderController {
    
    public static final  String PAYMENT_URL = "http://localhost:8001";

    @Resource
    private RestTemplate restTemplate;

    /**
     * 新增流水记录
     * @param payment
     * @return
     */
    @GetMapping(value = "/consumer/payment/create")
    public CommonResult<Payment> createInfo(Payment payment) {
        return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
    }

    /**
     * 根据id获取流水详情
     * @param id
     * @return
     */
    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}

注:

        此刻,需要同步将之前新建的订单模块中的 PaymentController.java 中的  createInfo 方法中的参数加上 @RequestBody 注解,否则会接收不到 消费者模块传入的参数。

消费者子模块中 PaymentController 中的 createInfo 方法中的参数增加@RequestBody注解

/**
     * 新增支付流水
     * @param payment
     * @return
     */
    @PostMapping(value = "/payment/create")
    public CommonResult createInfo(@RequestBody Payment payment) {
        return new CommonResult(200, "新增成功", iPaymentService.createInfo(payment));
    }

二、测试子模块间的调用

        同时启动 支付模块和当前的消费者模块 这两个子模块,通过浏览器请求测试子模块间的实现调用是否正确。

springcloud中模块调用用什么呢 springcloud common 模块_Cloud_02

springcloud中模块调用用什么呢 springcloud common 模块_SpringCloud_03

三、使用 Run Dashboard 或 Service 便捷管理子模块启动 

        当我们项目的子模块同时启动数量 >= 2 时,IDEA会智能的提醒我们是否要启用 Run Dashboard 或 Service 对子模块进行便捷管理,其中版本稍低的IDEA 是使用 Run Dashboard,新版本的都是使用 Service ,我当前IDEA版本是 2019.3.5 提示使用的是 Service

springcloud中模块调用用什么呢 springcloud common 模块_SpringCloud_04

springcloud中模块调用用什么呢 springcloud common 模块_xml_05

        若当前IDEA中,同时启动 >= 2 个微服务子模块时,并没有显示上述相关提示 ,则可以通过以下方法进行显示(以我当前IDEA的版本为例)。 

springcloud中模块调用用什么呢 springcloud common 模块_xml_06

   

 结语

        通过本文所述的 消费者模块的构建,与之前所创建的 支付模块间的远程调用,让我们对子模块间的远程调用形成初步的认识,在后续学习使用 SpringCloud 各重要组件时,更容易在自我感官上建立两者的对比关系,从而更加容易理解使用 SpringCloud 的初衷。