三、构建项目(订单模块)
1.创建module
创建过程同支付模块,选择Maven工程,JDK1.8,不勾选Maven原型。
2.修改pom文件
打开module order80的pom文件,添加如下依赖:
<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>
<!--eureka client-->
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
80pom文件完整的内容如下
<?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>springcloud01</artifactId>
<groupId>com.hry.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>
<!--eureka client-->
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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文件
①新建application.yml文件
②编写yml
server:
port: 80
4.创建主启动类
①新建启动类
package com.hry.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.业务代码
①创建实体entities类
直接复制之前的支付模块的就可以
package com.hry.springcloud.entities;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
private Long id;
private String serial;
}
package com.hry.springcloud.entities;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
/**
* 返回结果 例如404,200
*/
private Integer code;
/**
* 信息 例如success
*/
private String message;
/**
* 结果集 信息体对象
*/
private T data;
public CommonResult(Integer code,String message){
this(code,message,null);
}
}
②创建controller层
通过Spring官方提供的restTemplate
将restTemplate注入Spring容器中,新建config包,在包下新建ApplicationContextConfig类
package com.hry.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* 该配置类相当于SSM框架中 applicationContext.xml中 <bean id="" class=""></bean>
*/
@Configuration
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller代码
@RestController
@Slf4j
public class OrderController {
/**
* Payment的地址
*/
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/create")
public CommonResult<Payment> create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL + "/payment/create",payment,CommonResult.class);
}
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id,CommonResult.class);
}
}
6.测试
依次启动PaymentMain8001和OrderMain80,启动时IDEA会询问是否使用Run Dashboard,我们要选择 Show run configurations in Run Dashboard (新版IDEA已经变为Services了)
开启后效果如图
打开浏览器先测试微服务提供者Payment8001,其实这个上一篇文章测试时已经通过了不会有什么问题。
接下来是消费者访问订单Order80查询
成功啦,那么添加呢
显示成功了,那么数据库中有没有数据呢,查看id为3的数据我们发现serial居然为空!
问题原因:SpringMVC没能绑定传来的JSON内容
解决办法:在PaymentController的create方法形参前加入**@RequestBody**注解
重启,然后用浏览器访问,查看数据库,这次成功了
四、工程重构
我们在编写Order80时entities类是直接复制的Payment8001的,如果以后每个module需要用到这个entities类都直接复制的话会造成代码大量重复,可以把公用的部分抽取出来减少代码冗余。
1.新建module
创建Maven工程,不选择骨架,不对外暴露因此项目名后无端口号。
2.修改pom文件
<dependencies>
<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>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>
3.改造entities
①复制前面module的entities类
②使用Maven工具clean和install,将我们的这个新项目打包,上传。供其他两个module使用。
点击clean后查看控制台信息是否为 BUILD SUCESS(若为failed检查一下包是否正常导入,将报红波浪线的包重新下载并刷新,或者去Maven下载的目录将其删除重新导入重启IDEA)
点击install
③删除Payment8001和Order80的entities
删除后宝目录
另外一个不再赘述。
删除后由于controller用使用了entities,因此删除之后会报错。
④修改Payment8001和Order80的pom文件
在两个pom文件中添加如下坐标,groupId需要填写自己的。
添加后稍等2s,controller恢复正常不报错了。
<!--引入自定义的api通用包 可以使用公用的entities-->
<dependency>
<groupId>com.hry.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
⑤测试
打开浏览器,输入地址访问测试。
查询都通过,这里添加就不再测试了。
至此,入门篇结束。