前言
本文所记录的构建消费者模块,仅为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 类,内容和支付子模块中的一样
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));
}
二、测试子模块间的调用
同时启动 支付模块和当前的消费者模块 这两个子模块,通过浏览器请求测试子模块间的实现调用是否正确。
三、使用 Run Dashboard 或 Service 便捷管理子模块启动
当我们项目的子模块同时启动数量 >= 2 时,IDEA会智能的提醒我们是否要启用 Run Dashboard 或 Service 对子模块进行便捷管理,其中版本稍低的IDEA 是使用 Run Dashboard,新版本的都是使用 Service ,我当前IDEA版本是 2019.3.5 提示使用的是 Service
若当前IDEA中,同时启动 >= 2 个微服务子模块时,并没有显示上述相关提示 ,则可以通过以下方法进行显示(以我当前IDEA的版本为例)。
结语
通过本文所述的 消费者模块的构建,与之前所创建的 支付模块间的远程调用,让我们对子模块间的远程调用形成初步的认识,在后续学习使用 SpringCloud 各重要组件时,更容易在自我感官上建立两者的对比关系,从而更加容易理解使用 SpringCloud 的初衷。