使用普通maven一步一步构建SpringCloud生产者和消费者
1.因为idea中没有工作空间的概念,我们在这创建一个maven项目,删除src目录,作为整个项目的父项目
2.给父项目导入相关依赖,dependencyManagement>进行版本控制
<!-- 1.打包方式 pom-->
<packaging>pom</packaging>
<!-- 2.properties 定义版本号的,后面步骤写-->
<properties>
<junit.version>4.12</junit.version>
<lombok.version>1.18.12</lombok.version>
<log4j.version>1.2.17</log4j.version>
<logback.version>1.2.3</logback.version>
</properties>
<!-- 3.dependencyManagement进行依赖管理-->
<dependencyManagement>
<!-- 4.springCloud依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 5.springboot依赖,因为我们这是总工程,下面会放很多子工程,直接导入springBoot依赖,而不去导parent-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 6.数据库-->
<!--数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<scope>runtime</scope>
</dependency>
<!-- 7.数据库连接池-->
<!--德鲁伊连接池-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- springboot启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!-- 8.junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!-- 9.lombok-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- 10.log4j-->
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- ## <type>pom</type> type为pom是避免导入太多jar包导致pom.xml文件过大,所以将很多jar包封装成pom文件,通过导入pom来导入jar包 ##<scope>import</scope> 一般在我们使用的项目中都是通过Spring-boot-starter-parent来引入springboot所需要的jar包,但是在实际开发过程中,如果只是继承一个parent是不足以满足开发需求的,这就需要import来实现多继承,在dependencyManagement通过import来导入多个jar包的合集-->
关于springboot依赖管理的几种方案,参考
关于springboot依赖管理的几种方案,参考https://www.cnblogs.com/ld-mars/p/11714151.html
3.创建一个公共的api,用来存储实体类
右键springcloud-demo父项目,new->module
4.引入lombok依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
5.创建Student实体类
6.建立相对应的数据库
插入一批伪数据,后面db_source是所存在的数据库名,因为不同的数据或者相同的数据也许存在不同的数据库,以此保证数据安全,通过DATABASE()函数会自动生成对应的数据库名
7.建立provider的module,配置pom.xml
<dependencies>
<dependency>
<groupId>com.qiao</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
8.创建以下目录结构,并配置application.yml文件
\
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.qiao.domain
mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
application:
name: springcloud-provider-student-8001
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3304/db02?useUnicode=true&characterEncoding=utf-8
username: root
password: root
9.写provider的StuMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiao.mapper.StuMapper">
<insert id="addStudent" parameterType="Student">
insert into student(student_name,db_source)
values (#{student_name},DATABASE())
</insert>
<select id="findByID" resultType="Student" parameterType="Long">
select * from student where student_id=#{student_id};
</select>
<select id="findAll" resultType="Student">
select * from student;
</select>
</mapper>
10.写provider的StuMapper接口
package com.qiao.mapper;
import com.qiao.domain.Student;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Author: 谢侨
* @Date: 2021/09/12/13:39
* @Description:
*/
@Mapper
@Repository
public interface StuMapper {
public boolean addStudent(Student student);
public Student queryByID(Long id);
public List<Student> queryAll();
}
11.写provider的Service层和其实现类
package com.qiao.service;
import com.qiao.domain.Student;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Author: 谢侨
* @Date: 2021/09/12/13:39
* @Description:
*/
public interface StuService {
boolean addStudent(Student student);
Student queryByID(Long id);
List<Student> queryAll();
}
package com.qiao.service;
import com.qiao.domain.Student;
import com.qiao.mapper.StuMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Author: 谢侨
* @Date: 2021/09/12/14:01
* @Description:
*/
@Service
public class StuServiceImpl implements StuService {
@Resource
private StuMapper stuMapper;
public boolean addStudent(Student student) {
return stuMapper.addStudent(student);
}
public Student findByID(Long id) {
return stuMapper.findByID(id);
}
public List<Student> findAll() {
return stuMapper.findAll();
}
}
12.写provider的Controller层
package com.qiao.controller;
import com.qiao.domain.Student;
import com.qiao.service.StuService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Author: 谢侨
* @Date: 2021/09/12/13:39
* @Description:
*/
@RestController
public class StuController {
@Resource
StuService stuService;
@PostMapping("/student/add")
public boolean addStudent(@RequestBody Student student){
return stuService.addStudent(student);
}
@GetMapping("/student/get/{id}")
public Student findById(@PathVariable("id") Long id){
return stuService.findByID(id);
}
@GetMapping("/student/list")
public List<Student> findAll(){
return stuService.findAll();
}
}
13.在com.qiao下面创建springboot启动类,并启动测试provider
package com.qiao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Created with IntelliJ IDEA.
*
* @Author: 谢侨
* @Date: 2021/09/12/14:10
* @Description:
*/
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
14.建立model写consumer,导入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>springcloud-demo</artifactId>
<groupId>com.qiao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-consumer-student-80</artifactId>
<!-- 实体类+web-->
<dependencies>
<dependency>
<groupId>com.qiao</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
15.建立application.yml文件
server:
port: 80
16.写consumer的controller层
package com.qiao.controller;
import com.qiao.domain.Student;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.List;
/**
* Created with IntelliJ IDEA.
*
* @Author: 谢侨
* @Date: 2021/09/12/14:17
* @Description:
*/
@RestController
public class StuController {
//消费者,采用Restful风格,只是调用,是不会有service层的,所以spring提供了template为其提供调用
@Resource
private RestTemplate restTemplate;
private static final String REST_URL="http://localhost:8001";
@PostMapping("/consumer/student/add")
public boolean add(Student student){
return restTemplate.postForObject(REST_URL+"/student/add", student, boolean.class);
}
@RequestMapping("/consumer/student/get/{id}")
public Student get(@PathVariable("id") Long id){
return restTemplate.getForObject(REST_URL+"/student/get/"+id,Student.class);
}
@RequestMapping("/consumer/student/list")
public List<Student> get(){
return restTemplate.getForObject(REST_URL+"/student/list", List.class);
}
}
17.查看RestTemplate源码,会发现并没有将其注意spring容器,手动创建config注入
package com.qiao.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* Created with IntelliJ IDEA.
*
* @Author: 谢侨
* @Date: 2021/09/12/14:21
* @Description:
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
18.配置启动类
package com.qiao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Created with IntelliJ IDEA.
*
* @Author: 谢侨
* @Date: 2021/09/12/14:23
* @Description:
*/
@SpringBootApplication
public class consumerApplication {
public static void main(String[] args) {
SpringApplication.run(consumerApplication.class,args);
}
}
到此,消费者也配置完毕,启动测试,先启动8001的provider,再启动80的consumer
至此,运行完毕,下一篇将在此基础上搭建注册中心-Eureka