在学习微服务之前,我们需要搭建一个父子结构的项目,实现一个公共的API项目子项目、接口生产者子项目、接口消费者子项目。
工具:IDEA 2020.3
父项目名:microservicecloud
api子项目名:microservicecloud-api
provider(生产者)子项目名:microservicecloud-provider-dept-8001
consumer(消费者)子项目名:microservicecloud-consumer-dept-80
4.0.0
com.atguigu.springcloud
microservicecloud
0.0.1-SNAPSHOT
pom
UTF-8
1.8
1.8
4.12
1.2.17
1.16.18
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR1
pom
import
org.springframework.boot
spring-boot-dependencies
1.5.9.RELEASE
pom
import
mysql
mysql-connector-java
5.0.4
com.alibaba
druid
1.0.31
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.0
ch.qos.logback
logback-core
1.2.3
junit
junit
${junit.version}
test
log4j
log4j
${log4j.version}
microservicecloud
src/main/resources
true
org.apache.maven.plugins
maven-resources-plugin
$
这样我们就完成了一个父工程的创建
4.0.0
com.atguigu.springcloud
microservicecloud
0.0.1-SNAPSHOT
microservicecloud-api
org.projectlombok
lombok
当我们成功创建一个子项目后,你会发现在父项目的pom.xml文件下面多了一个子项目的引入,如下:
前几步和新建microservicecloud-api子项目一样,不熟悉的翻看上面。这里主要说明下主要配置文件的内容。
<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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-provider-dept-8001</artifactId>
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</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-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
这里需要注意以下以下代码,当我们需要在microservicecloud-provider-dept-8001引入microservicecloud-api里面的内容时,需要配置如下代码才能正确引入:
<dependency>
<!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
因为我们是建立的一个生产者的子项目,所以我们需要将mybatis整合到子项目中。
在项目目录src.main.resources下面新建application.yml配置文件,内容如下:
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.atguigu.springcloud.entities # 所有Entity别名类所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/clouddb01 # 数据库名称
username: root
password: root
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
这里需要注意的是,首先你需要有一个可连接的mysql数据库(不管是本地安装的mysql或者是其他来源服务器),其次是配置mybatis时在resources/mybatis/mybatis.cfg.xml路径下需要有一个mybatis的配置文件mybatis.cfg.xml(可选配置,如果不添加信息在application.yml下面将这个配置去掉)
mybatis.cfg.xml内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true" /><!-- 二级缓存开启 -->
</settings>
</configuration>
springBoot需要配置一个项目的启动类DeptProvider8001_App(名称随意):
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DeptProvider8001_App {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
完成以上的配置后,我们已经成功的实现了springBoot和mybatis的整合,下面我们可以编写一些简单的API来测试以下是否配置成功。
建立数据库表(脚本):
DROP DATABASE IF EXISTS cloudDB01;
CREATE DATABASE cloudDB01 CHARACTERSET UTF8;
USE cloudDB01;
CREATE TABLE dept(
deptno BIGINT NOT NULL PRIMARYKEY AUTO_INCREMENT,
dname VARCHAR(60),
db_source VARCHAR(60)
);
INSERT INTO dept(dname,db_source) VALUES('开发部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('财务部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('市场部',DATABASE());
INSERT INTO dept(dname,db_source) VALUES('运维部',DATABASE());
SELECT * FROM dept;
上面的脚本是为了新建一个cloudDB01的数据库,同时在数据库中新建一个dept表并插入数据,效果如下图:
编写简单的测试文件:
Dept .java
这里使用了一个公共的Dept.java这个文件我是编写在公共子项目microservicecloud-api中,其他的均写在microservicecloud-provider-dept-8001下
package com.atguigu.springcloud.entities;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
// 空参构造函数
@NoArgsConstructor
// 全参数构造函数
//@AllArgsConstructor
// getter setter toString
@Data
//开启链式风格访问
@Accessors(chain=true)
public class Dept implements Serializable// entity --orm--- db_table
{
private Long deptno; // 主键
private String dname; // 部门名称
private String db_source;// 来自那个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同数据库
public Dept(String dname) {
this.dname = dname;
}
}
DeptMapper.xml
<mapper namespace="com.atguigu.springcloud.dao.DeptDao">
<select id="findById" resultType="Dept" parameterType="Long">
select deptno,dname,db_source from dept where deptno=#{deptno};
select>
<select id="findAll" resultType="Dept">
select deptno,dname,db_source from dept;
select>
<insert id="addDept" parameterType="Dept">
INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());
insert>
mapper>
DeptDao.java
package com.atguigu.springcloud.dao;
import com.atguigu.springcloud.entities.Dept;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface DeptDao {
boolean addDept(Dept dept);
Dept findById(Long id);
List<Dept> findAll();
}
这里需要注意一下,一定不要忘记注解@Mapper
DeptService.jave
package com.atguigu.springcloud.service;
import com.atguigu.springcloud.entities.Dept;
import java.util.List;
public interface DeptService {
boolean add(Dept dept);
Dept get(Long id);
List<Dept> list();
}
DeptServiceImpl.java
package com.atguigu.springcloud.service.impl;
import com.atguigu.springcloud.entities.Dept;
import com.atguigu.springcloud.dao.DeptDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.atguigu.springcloud.service.DeptService;
import java.util.List;
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptDao deptDao;
@Override
public boolean add(Dept dept) {
return deptDao.addDept(dept);
}
@Override
public Dept get(Long id) {
return deptDao.findById(id);
}
@Override
public List<Dept> list() {
List<Dept> reList = deptDao.findAll();
return reList;
}
}
这里需要注意一下,一定不要忘记注解@Service
DeptController.java
package com.atguigu.springcloud.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.atguigu.springcloud.entities.Dept;
import com.atguigu.springcloud.service.DeptService;
@RestController
public class DeptController {
@Autowired
private DeptService service;
@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean add(@RequestBody Dept dept) {
return service.add(dept);
}
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") Long id) {
return service.get(id);
}
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list() {
return service.list();
}
}
当我们做完以上的操作后,我们可以测试以下代码了,通过DeptProvider8001_App.java启动类启动项目(不清楚springBoot如何启动的同学去百度查以下,这里就不做描述了),以下启动完成:
浏览器访问接口请求地址,返回结果集:
这样我们就完成了mybatis的整合和测试。
有些同学发现查询出来的数据可能存在中文乱码,这是因为mysql数据库的编码设置得不对,统一采用utf8来存储数据。查看mysql数据库的编码,修改数据库编码即可。
如何修改mysql默认编码可参考另一篇博文:https://blog.csdn.net/qq_33631756/article/details/116118366
前几步和新建microservicecloud-provider-dept-8001子项目一样,这里介绍下配置文件内容即可
<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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-consumer-dept-80</artifactId>
<description>部门微服务消费者</description>
<dependencies>
<dependency><!-- 自己定义的api -->
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
主要引入了microservicecloud-api和spring-boot-starter-web(作为消费者引入web)
和生产者子项目一样,我们先新建一个application.yml文件,然后编辑以下内容:
server:
port: 80
在com.atguigu.springcloud包路径下新建cfgbeans包,然后在cfgbeans包里面新建一个configBean.java文件,编辑configBean.java文件内容:
package com.atguigu.springcloud.cfgbeans;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
//boot -->spring applicationContext.xml --- @Configuration配置 ConfigBean = applicationContext.xml
@Configuration
public class configBean {
@Bean
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
说明:
在springBoot中java类添加注解@Configuration
表示这个文件是spring的一个bean对象配置文件,作用和springMVC里面的applicationContext.xml配置文件一样的,主要是对bean对象的配置注入。
以上例子我们就是对RestTemplate对象进行了一个注入(RestTemplate类似于JDBCTemplate一样,里面基于HttpClient封装了简单的rest请求api,可以直接模仿浏览器发送rest请求),作为一个消费端我们主要就是对生产者暴露的接口进行调用。
新建一个消费者项目启动类DeptConsumer80_App
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DeptConsumer80_App
{
public static void main( String[] args )
{
SpringApplication.run(DeptConsumer80_App.class, args);
}
}
编写一个controller文件,使用RestTemplate对microservicecloud-provider-dept-8001(生产者)提供的接口进行调用,获取数据库数据。
package com.atguigu.springcloud.controller;
import java.util.List;
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;
import com.atguigu.springcloud.entities.Dept;
@RestController
public class DeptController_Consumer
{
private static final String REST_URL_PREFIX = "http://localhost:8001";
/**
* 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
* ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
*/
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer/dept/add")
public boolean add(Dept dept)
{
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
}
@RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id)
{
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
}
@RequestMapping(value = "/consumer/dept/list")
public List<Dept> list()
{
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
}
}
最后我们启动microservicecloud-provider-dept-8001(生产者)子项目和我们的microservicecloud-consumer-dept-80(消费者)子项目,浏览器访问消费者rest请求:
http://localhost/consumer/dept/list
如图所示,表示我们成功的通过microservicecloud-consumer-dept-80调用microservicecloud-provider-dept-8001获取到了数据库的部门数据。
至此我们就完成了父子结构项目的搭建,并实现一个公共的API项目子项目、接口生产者子项目、接口消费者子项目之间的调用。
源码地址:
链接:https://pan.baidu.com/s/17e8nm0UeGD5QzdPMJtirGQ
提取码:00ol