本小节同上一小节类似,我们需要实现微服务消费者订单模块,该模块可以调用微服务提供者支付模块上面的接口,其实现过程与支付模块也类似,都是6个步骤,在此不再赘述,其中有些细节也做简略处理,如果有不清楚的,可以参考上一节内容。
[neilian ids=2614]
下面是该模块的项目结构,接着使用以上几步来实现该模块的创建。
第1步:创建Module
我们这里在mscloud父工程下创建一个名为cloud-consumer-order80的子Module,该模块占用端口80
第2步:修改pom
我们修改该子模块pom.xml如下:

程序员导航
优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站
mscloud com.panziye.springcloud 1.0-SNAPSHOT 4.0.0 cloud-consumer-order80 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
第3步:写yml
我们在resources下新建application.yml如下:
server:
port: 80
spring:
application:
name: cloud-order-service
第4步:主启动类
在java目录下新建名为OrderMain80的主启动类,如下:
package com.panziye.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class,args); } }
第5步:业务类
1)实体类
直接复制上一个支付模块(即cloud-provider-payment8001子模块)中entities包及其中的两个类(Payment和CommonResult)过来。
[v_blue]注意:这里我们会发现有冗余代码,下一节我们会进行项目重构[/v_blue]
2)RestTemplate使用
[v_act]补充说明:[/v_act]
a)传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。因此我们使用RestTemplate类来实现restful风格的http远程调用。
RestTemplate给我们提供了许多访问模板,这里列出常用几个如下:

b)更多RestTemplate用法请参考官网:参考RestTemplate API
[v_act]在此使用:[/v_act]
在com.panziye.springcloud包下新建config包,在config包新建ApplicationContextCofig类,将RestTemplate交给Spring管理,代码如下:

AI 工具导航
优网导航旗下AI工具导航,精选全球千款优质 AI 工具集
package com.panziye.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextCofig {
/**
* 配置RestTemplate
* @return
*/
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3)我们在com.panziye.springcloud.controller包中新建OrderController如下:
package com.panziye.springcloud.controller;
import com.panziye.springcloud.entities.CommonResult;
import com.panziye.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
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;
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/create")
public CommonResult create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);
}
@GetMapping("/consumer/payment/get/{id}")
public CommonResult getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}
[v_warn]注意:这里不需要dao和service,因为直接远程请求支付模块服务了[/v_warn]
[v_act]测试前的补充:[/v_act]
注意我们需要修改cloud-provider-payment8001子模块,在PaymentController中的create方法参数前添加@RequestBody注解,修改后如下:
@PostMapping(value = "/payment/create")
public CommonResult create(@RequestBody Payment payment){
int result = paymentService.create(payment);
log.info("插入数据库结果==="+result);
if(result>0){
return new CommonResult(200,"插入数据库成功",result);
}else{
return new CommonResult(444,"插入数据库失败");
}
}
[v_blue]提示:如果不添加此注解,当由消费模块发请求过来时,无法获取请求参数,存入值会为null,@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交,我们使用的是RestTemplate的postForObject方法是post请求[/v_blue]
第6步:测试
启动cloud-consumer-order80的子Module和cloud-provider-payment8001子模块。
[v_blue]提示:当IDEA检测到有多个模块服务时,会在右下角提示是否在services(老版本可能叫Dashboard)中运行,我们选择要show in services,这样我们IDEA左下角就会有如下窗体,方便我们统一管理(如果你没出先克自行百度解决):[/v_blue]

1)测试create

2)测试get




