在B站学习的springcloud的学习记录,第二天,最难不过坚持。
配置和环境:idea2022 jdk8 mysql8.0
本文章只用于学习和分享,欢迎大家的建议,讨论和指点。
目录
消费者模块构建
在支付模块的基础上增加一个消费者模块,使消费者模块可以调用支付模块的功能,不在消费者模块中写查询数据库的类也能通过他查询到数据和添加数据。
不变的写代码顺序:建model 改pom 写yml 主启动类 业务类
创建一个消费者模块的model,与创建支付模块的步骤方法相同。
改pom文件--->直接复制支付模块的pom文件
<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/maven-v4_0_0.xsd">
<parent>
<artifactId>cloud2023</artifactId>
<groupId>com.liangliang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumer-order80</artifactId>
<packaging>war</packaging>
<name>cloud-consumer-order80 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<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.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</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>
<build>
<finalName>cloud-consumer-order80</finalName>
</build>
</project>
写application.yml配置
sserver:
port: 81
spring:
application:
name: cloudorderservice
datasource:
type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
url: jdbc:mysql://localhost:3306/mybatisdb?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTC
username: root
password: liang7728
driver-class-name: com.mysql.cj.jdbc.Driver
写主启动类
orderMain
@SpringBootApplication
public class OrderMain {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class,args);
}
业务代码编写
实体类entities复制支付模块的
payment实体类
/**
* 主实体类
*/
@Data
@AllArgsConstructor //形参
@NoArgsConstructor //空参
public class Payment implements Serializable {
private Long id;
private String serial;
}
CommonResult类,用于前后端分离
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult <T>
{
private Integer code;
private String message;
private T data;
public CommonResult(Integer code,String message)
{
this(code,message,null);
}
}
编写一个controller类,和一个远程调用的配置类。
ApplicationControllerConfig的作用是将两个数据表连接起来。
@Configuration
public class ApplicationControllerConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
OrderController类
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://localhost:8001";
@Autowired
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);
}
}
还有一件很重要的事情,在支付模块的控制类中,在paymentController中记得添加一个@RequestBody注解这个东东
@RequestBody会帮助你在使用消费者模块这个端口进行插入数据操作时将你需要的插入的数据帮你插入到数据库中去。不然跨服务插入数据不能将数据插入进去!!!
然后我们就可以进行测试了
输入localhost:81/consumer/payment/create?serial=xxxx 进行数据插入操作。
代码重构
代码重构是为了解决的是这消费者模块和支付模块两个微服务中代码重复的问题。让你的model看起来更加的整洁,并且时将你的实体类放置到一个公共的model中,这样可以达到只修改一个地方的实体类代码就可以让其他微服务的实体类一同修改的效果。
首先是先增加一个model,一个公共model。
然后改pom
<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/maven-v4_0_0.xsd">
<parent>
<artifactId>cloud2023</artifactId>
<groupId>com.liangliang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-api-commons</artifactId>
<packaging>war</packaging>
<name>cloud-api-commons Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</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>
<!-- hutool工具包,时间图形工具之类的-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>
<build>
<finalName>cloud-api-commons</finalName>
</build>
</project>
将两个微服务的公共实体类复制到这个公共类model中,再删除那两个微服务中的实体类。
然后修改两个微服务的pom文件,添加自定义公共的jar包依赖。
<!-- 引入自定义的api通用包,可以使用payment支付entity-->
<!-- 这个依赖是实体类引用公共model中的实体类,可以达到只修改一个地方的实体类就能让其他的服务一同修改实体类的效果-->
<dependency>
<groupId>com.liangliang</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
可能会出现引入依赖错误的问题。
我们就要确定这个自定义的地址和引用公共包的服务名称是否一致。
这个是公共model的pom文件的头文件内容,按照你自己的自定义依赖的内容的自行修改,我这个只是参考,你自己要对比一下自己的导入地址和导入名称是否写错。
如果导入还是不成功的话可以在父pom文件中添加红框的这个东西