关于这个demo工程
开发springboot应用的时候,经常用到redis、mybatis、restTemplate这些技术,在此将常用代码和配置都整理出来,以后有需要就能直接拿来用了;
demo的功能简介
此demo是个父子结构的maven工程,两个子工程特点如下:
整个服务如下图所示:写操作:用户通过浏览器向service-a发起请求,通过service-a将数据写入mysql,然后service-a会调用service-b的接口,将数据写入redis;
读操作:用户通过浏览器向service-a发起请求,service-a会调用service-b的接口从redis中取数据,如果取到了就返回给浏览器,如果取不到,就从mysql中取,如果从mysql中能取到,就先通过service-b写入redis,再返回给浏览器,如果mysql中也没有,就返回无数据;
版本信息参考操作系统:CentOS Linux release 7.7.1908
docker:Community 19.03.2
springboot:2.0.5.RELEASE
mysql:5.7.27
redis:5.0.6
demo源码下载
如果您不想编码,可以直接从GitHub下载完整的demo工程源码,地址和链接信息如下表所示:项目主页
https://github.com/zq2599/blog_demos
该项目在GitHub上的主页
git仓库地址
(https)https://github.com/zq2599/blog_demos.git
该项目源码的仓库地址,https协议
git仓库地址(ssh)
git@github.com:zq2599/blog_demos.git
该项目源码的仓库地址,ssh协议
这个git项目中有多个文件夹,本章的应用在pinpoint185demo文件夹下,如下图红框所示:
快速部署mysql为了快速准备好mysql服务用来测试,我这里是用docker来完成的,一行命令即可:
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=888888 -idt mysql:5.7.27创建数据库demo和表student,表结构非常简单:
CREATE DATABASE demo;
USE demo;
CREATE TABLE student (id INT(11), name VARCHAR(128));
快速部署redis
为了快速准备好redis服务用来测试,我这里是用docker来完成的,一行命令即可:
docker run --name redis -p 6379:6379 -idt redis:5.0.6 redis-server --appendonly yes
父工程首先创建名为pinpoint185demo的maven工程,pom.xml内容如下:
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">
4.0.0
service-a
service-b
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
com.bolingcavalry
pinpoint185demo
1.0-SNAPSHOT
pom
1.8
UTF-8
UTF-8
1.8
2.0.5.RELEASE
org.apache.maven.plugins
maven-compiler-plugin
${java.version}
${java.version}
${project.build.sourceEncoding}
子工程service-a编码在此工程下创建子工程service-a,其pom.xml内容如下:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.bolingcavalry
pinpoint185demo
1.0-SNAPSHOT
service-a
service-a
服务a
1.8
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
mysql
mysql-connector-java
com.alibaba
fastjson
1.2.28
org.apache.commons
commons-lang3
3.9
org.springframework.boot
spring-boot-maven-plugin
以上内容有几点需要注意:
a. 要提供web服务,所以依赖了spring-boot-starter-web;
b. 要使用mybaits,所以依赖了mybatis-spring-boot-starter;
c. 要连接mysql,所以依赖了mysql-connector-java;
d. commons-lang3、fastjson作为工具类,在代码中会用到它们的API;service-a的系统配置application.yml内容如下,注意数据库和mybaits的配置:
server:
port: 8080
spring:
datasource:
username: root
password: 888888
url: jdbc:mysql://192.168.121.143:3306/demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mapping/*Mapping.xml
type-aliases-package: com.bolingcavalry.servicea.entity
logging:
level:
com:
bolingcavalry:
servicea: debug
# service-b的服务url
serviceb:
baseurl: http://localhost:8081/mybatis的mapping文件在src\main\resources\mapping目录,名为StudentMapping.xml,对应student表的定义和操作:
select * from student where id = #{id}
insert into student (id, name) values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR})
student表对应的实体类:
package com.bolingcavalry.servicea.entity;
/*** @Description: student entity* @author: willzhao E-mail: zq2599@gmail.com* @date: 2019/10/3 9:55*/
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}student对应的mapper接口:
package com.bolingcavalry.servicea.mapper;
import com.bolingcavalry.servicea.entity.Student;
import org.springframework.stereotype.Repository;
/*** @Description: mybatis mapper* @author: willzhao E-mail: zq2599@gmail.com* @date: 2019/10/3 9:58*/
@Repository
public interface StudentMapper {
Student getById(Integer id);
void insert(Student student);
}由于要用到restTemplate访问service-b,因此要增加对应的配置类:
package com.bolingcavalry.servicea.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/*** @Description: 远程请求的配置* @author: willzhao E-mail: zq2599@gmail.com* @date: 2019/10/3 11:45*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = ne