第一步:创建一个maven项目作为consumer和provider的父项目
配置父项目的pom文件
<!--配置打包方式-->
<packaging>pom</packaging>
<!--版本集中控制-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
<junit.version>4.12</junit.version>
<lombok.version>1.18.10</lombok.version>
<log4j.version>1.2.17</log4j.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.2</mybatis.spring.boot.version>
<logback-core.version>1.2.3</logback-core.version>
</properties>
<!--父依赖管理(预定义依赖约束)-->
<dependencyManagement>
<dependencies>
<!--依赖spring boot 2.1.4版本-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--依赖spring cloud Greenwich.SR1版本,这里一定要与springboot版本相对应,否则可能出现不支持的情况-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--日志和测试-->
<!--junit-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-core.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
第二步:创建实体类module
因为privader和consumer都需要实体类,所以我们把实体类单独拿出来写到一个模块中,再以pom依赖的形式导入到提供者和消费者项目中。
这个module中我只添加了一个依赖,用于自动添加getter and setter。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
这里我创建了一个Dept类作为实体类,并创建相关数据库表。一个CommonResult类作为返回json的模板类。
Dept类:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
private int id;
private String name;
}
CommonResult类:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
private int code;
private String message;
private T data;
public CommonResult(int code,String message){
this.code=code;
this.message=message;
this.data=null;
}
}
第三步:创建provider的module
这里我们需要如下依赖:
<!--这里导入的是你的实体类-->
<dependency>
<groupId>cn.kgc.zhx</groupId>
<artifactId>springcloud-api-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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-actuator</artifactId>
</dependency>
<!-- druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!--日志和测试-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
添加包结构,创建配置文件和主启动类:
编写配置文件:
server:
port: 8001
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: cn.kgc.zhx.pojo
spring:
application:
name: springcloud-provider001
datasource:
url: jdbc:mysql://127.0.0.1:3306/springcloudtest?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimeZone=UTC
driver-class-name: org.gjt.mm.mysql.Driver
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
添加主启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@SpringBootApplication
public class ProviderMain {
public static void main(String[] args) {
SpringApplication.run(ProviderMain.class,args);
}
}
三层结构:
dao层:DeptMapper
import cn.kgc.zhx.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@Mapper
@Repository("deptMapper")
public interface DeptMapper {
Dept selectById(int id);
int add(Dept dept);
}
DeptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 映射接口 相当于实现类继承接口 -->
<mapper namespace="cn.kgc.zhx.dao.DeptMapper">
<select id="selectById" parameterType="int" resultType="Dept">
select dept.id ,dept.name from dept where dept.id=#{id}
</select>
<insert id="add" parameterType="Dept">
insert into dept (name) values (#{name})
</insert>
</mapper>
service层:DeptService
import cn.kgc.zhx.pojo.Dept;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
public interface DeptService{
Dept selectById(int id);
int add(Dept dept);
}
DeptServiceImpl
import cn.kgc.zhx.dao.DeptMapper;
import cn.kgc.zhx.pojo.Dept;
import cn.kgc.zhx.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@Service("deptService")
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public Dept selectById(int id) {
return deptMapper.selectById(id);
}
@Override
public int add(Dept dept) {
return deptMapper.add(dept);
}
}
controller层:
import cn.kgc.zhx.pojo.CommonResult;
import cn.kgc.zhx.pojo.Dept;
import cn.kgc.zhx.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping("/dept/select/{id}")
public CommonResult selectById(@PathVariable int id){
CommonResult<Dept> commonResult=new CommonResult<Dept>();
Dept dept = deptService.selectById(id);
if (dept!=null){
commonResult.setData(dept);
commonResult.setMessage("查询成功!");
commonResult.setCode(200);
}else {
commonResult.setMessage("查询失败!");
commonResult.setCode(444);
}
return commonResult;
}
@PostMapping("/dept/add")
public CommonResult add( @RequestBody Dept dept){
System.out.println(dept);
int add = deptService.add(dept);
CommonResult<Dept> commonResult=new CommonResult<Dept>();
if (add>0){
commonResult.setData(dept);
commonResult.setMessage("添加成功!");
commonResult.setCode(200);
}else {
commonResult.setMessage("添加失败!");
commonResult.setCode(444);
}
return commonResult;
}
}
第四步:创建consumer的module
所需依赖:
<!--实体类-->
<dependency>
<groupId>cn.kgc.zhx</groupId>
<artifactId>springcloud-api-pojo</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-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 用于测试jsonObject传值-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
添加包结构,创建配置文件和主启动类:
这里的配置文件中只需要配置一个访问端口即可。
添加主启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@SpringBootApplication
public class ConsumerMain {
public static void main(String[] args) {
SpringApplication.run(ConsumerMain.class,args);
}
}
consumer只用于调用privder层的接口,所以只需要一个controller层,和一个config类。
添加configer类:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@Configuration
public class RestConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
TestController:
import cn.kgc.zhx.pojo.CommonResult;
import cn.kgc.zhx.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Author: Zhang Haoxiang
* @Date 2020-03-28
*/
@RestController
public class TestController {
//调用服务的端口
public static final String REQUEST_PATH="http://localhost:8001";
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/consumer/select/{id}")
public CommonResult select(@PathVariable int id){
CommonResult forObject = restTemplate.getForObject(REQUEST_PATH + "/dept/select/" + id, CommonResult.class);
return forObject;
}
@RequestMapping("/consumer/add")
public CommonResult add(Dept dept) {
System.out.println(dept);
CommonResult forObject = restTemplate.postForObject(REQUEST_PATH + "/dept/add" ,dept,CommonResult.class);
return forObject;
}
}
运行项目开始测试:
1.测试查询(因为80端口被占用,我给cosumer配置了8080端口):
2.测试添加
测试成功!环境搭建完毕。