文
章
目
录
章
目
录
本小节同上一小节类似,我们需要实现微服务消费者订单模块,该模块可以调用微服务提供者支付模块上面的接口,其实现过程与支付模块也类似,都是6个步骤,在此不再赘述,其中有些细节也做简略处理,如果有不清楚的,可以参考上一节内容。
微服务提供者支付模块实现—SpringCloud(H版)微服务学习教程(4)
文章目录第1步:创建Module 第2步:修改pom.xml 第3步:写yml 第4步:主启动类 第5步:业务 […]
下面是该模块的项目结构,接着使用以上几步来实现该模块的创建。
第1步:创建Module
我们这里在mscloud
父工程下创建一个名为cloud-consumer-order80
的子Module,该模块占用端口80
第2步:修改pom
我们修改该子模块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>mscloud</artifactId> <groupId>com.panziye.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>
第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)过来。
注意:这里我们会发现有冗余代码,下一节我们会进行项目重构
2)RestTemplate使用
补充说明:
a)传统情况下在java代码里访问
restful
服务,一般使用Apache的HttpClient
。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate
。因此我们使用RestTemplate
类来实现restful
风格的http
远程调用。RestTemplate
给我们提供了许多访问模板,这里列出常用几个如下:
b)更多RestTemplate
用法请参考官网:参考RestTemplate API
在此使用:
在
com.panziye.springcloud
包下新建config
包,在config
包新建ApplicationContextCofig
类,将RestTemplate
交给Spring管理,代码如下:
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<Payment> create(Payment payment){ return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class); } @GetMapping("/consumer/payment/get/{id}") public CommonResult<Payment> getPayment(@PathVariable("id") Long id){ return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class); } }
注意:这里不需要dao和service,因为直接远程请求支付模块服务了
测试前的补充:
注意我们需要修改
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,"插入数据库失败"); } }
提示:如果不添加此注解,当由消费模块发请求过来时,无法获取请求参数,存入值会为
null
,@RequestBody
主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody
接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交,我们使用的是RestTemplate的postForObject方法是post请求第6步:测试
启动cloud-consumer-order80
的子Module和cloud-provider-payment8001
子模块。
提示:当IDEA检测到有多个模块服务时,会在右下角提示是否在
services
(老版本可能叫Dashboard)中运行,我们选择要show in services
,这样我们IDEA左下角就会有如下窗体,方便我们统一管理(如果你没出先克自行百度解决):
1)测试create

2)测试get
