源码地址:https://gitee.com/peachtec/springcloud
上一章说了关于SpringCloud的一些理论,今天开始上代码进行演示。SpringCloud与SpringBoot的个版本之间存在兼容性问题,所以在创建项目的时候一定一定要注意版本的选择。
1.创建一个普通的maven项目,用这个项目去管理其他的功能模块
2.项目创建完成配置pom.xml文件,并导入需要的jar包
在父工程内导入项目需要的jar包进行统一管理,子工程只需要引用就行,不用去管理版本,所有的jar包版本都在父工程中进行统一管理
<!-- 打包方式 pom-->
<packaging>pom</packaging>
<!-- 全局属性,比如说版本号可以在这里进行统一管理-->
<properties>
<spring.cloud.version>Hoxton.SR9</spring.cloud.version>
<spring.boot.version>2.3.5.RELEASE</spring.boot.version>
<mysql.version>8.0.22</mysql.version>
<druid.version>1.2.3</druid.version>
<mybatis.plus.version>3.4.1</mybatis.plus.version>
<junit.version>4.13.1</junit.version>
<lombok.version>1.18.16</lombok.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<!-- jar包依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- SpringCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- MySQL数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<!-- junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
3.创建第一个maven模块,这个模块在这个示例中主要用于管理实体类
注意在创建的时候父工程选择之前创建的项目
4.配置第一个模块:实体类模块的pom.xml文件,导入依赖
导入的jar包,如果在父工程中定义了版本,在子模块引入是就可以不用指定版本号了;并且,如果子模块正确创建并引用父工程成功,会在父工程的pom.xml文件中看到当前的模块坐标,如下图
因为是管理实体类的,所以就导入一个lombok就行,或者不导入直接手写set和get
<!-- 当前module的jar包依赖 -->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
5.创建需要的实体类
好像忘记说创建数据库了
drop database if exists db01;
create database if not exists db01 default character set utf8mb4 collate utf8mb4_general_ci;
use db01;
drop table if exists `dept`;
create table if not exists `dept`
(
`id` int primary key auto_increment comment '编号',
`name` varchar(60) not null comment '部门',
`db_source` varchar(20) not null comment '数据库名'
) comment '部门表';
insert into dept (name, db_source)
values ('开发部', database()),
('人事部', database()),
('市场部', database()),
('销售部', database()),
('运维部', database()),
('行政部', database());
如果不用lombok,就用快捷键或者手写其他的方法,注意,因为是网络传输,必须要实现Serializable 接口,实现序列化
@Data
@Accessors(chain = true) //链式编程
public class Dept implements Serializable {
private Integer id;
private String name;
private String dbSource;
}
6.创建第二个模块,这个模块用户服务提供,就是SpringBoot的service层
主要选择父工程
7.配置第二个模块:服务类模块的pom.xml文件,导入依赖
<dependencies>
<!-- 实体类模块坐标 -->
<dependency>
<groupId>org.peach</groupId>
<artifactId>springcloudentity</artifactId>
<version>1.0</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>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- springboot的测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- jetty 应用服务器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!-- 热部署工具 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
8.配置第二个模块的yaml文件
server:
port: 8001
mybatis-plus:
type-aliases-package: com.peach.entity
mapper-locations: classpath*:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
cache-enabled: true
spring:
application:
name: springcloud-server
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://192.168.0.109/db01?useUnicode=true&characterEncoding=utf-8
9.编写服务类的接口,并实现它
//数据操作层
@Mapper
@Repository
public interface DeptMapper {
}
//服务层
@Service
public class DeptService implements IDeptService {
}
//控制层
@RestController
@RequestMapping("/dept")
public class DeptApi {
@Autowired
private IDeptService service;
@PostMapping("/add")
private boolean addDept(Dept dept){
return service.addDept(dept);
}
@GetMapping("/get/{id}")
private Dept queryById(@PathVariable Integer id){
return service.queryById(id);
}
@GetMapping("/get")
private List<Dept> queryAll(){
return service.queryAll();
}
}
//主启动类
@SpringBootApplication
public class Dept_8001 {
public static void main(String[] args) {
SpringApplication.run(Dept_8001.class, args);
}
}
项目测试启动,并测试是否能正常访问
10.创建第三个模块:消费者模块,用来调用第二个模块提供的服务
注意选择父工程
11.配置第三个模块:消费者模块的pom.xml文件,导入依赖
<dependencies>
<dependency>
<groupId>org.peach</groupId>
<artifactId>springcloudentity</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
12.配置第三个模块的yaml文件,配置一个端口就行了
server:
port: 80
13.添加RestTemplate到Spring容器中
在Dubbo中,我们可以通过**@DubboReference去调用远程接口,但是在SpringCloud中,是使用RestFul风格的请求,所以有一个RestTemplate**的类,它里面有我们常用的五种请求方式对应的方法,我们可以直接调用,但是这个类默认是没用注册到Spring中,所以在使用前我们需要将其注册到Spring容器中
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
14.消费者的控制层接口
SpringCloud是基于restful风格的请求,在消费者中是没有服务层的,需要去调用其它层的接口,在RestTemplate类已经封装好了方法,我们可以直接使用;单一服务时,前端通过请求后端的url地址去获取数据;在SpringCloud中,RestTemplate封装的各种方法,通过这些方法去调用其他的url去获取数据
例如:public ResponseEntity getForEntity(String url, Class responseType, Object… uriVariables)
url是请求的地址,和单一服务时的请求地址一样,相当于RestTemplate去访问这个地址
responseType是返回参数的类型,
uriVariables是请求时需要传递的参数
@RestController
@RequestMapping("/dept")
public class ConsumerApi {
//注入RestTemplate
@Autowired
private RestTemplate restTemplate;
/**
* SpringCloud是基于restful风格的请求,在消费者中是没有服务层的,需要去调用其它层的接口
* 在RestTemplate类已经封装好了方法,我们可以直接使用
* 单一服务时,前端通过请求后端的url地址去获取数据
* 在SpringCloud中,RestTemplate封装的各种方法,通过这些方法去调用其他的url去获取数据
* 例如:public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)
* url是请求的地址,和单一服务时的请求地址一样,相当于RestTemplate去访问这个地址
* responseType是返回参数的类型,
* uriVariables是请求时需要传递的参数
*/
/**
* url的前缀
*/
private static final String URL_PREFIX = "http://localhost:8001/dept";
@GetMapping("/get/{id}")
public Dept getDeptById(@PathVariable Integer id) {
return restTemplate.getForObject(URL_PREFIX + "/get/" + id, Dept.class);
}
@PostMapping("/add")
private boolean addDept(Dept dept) {
return restTemplate.postForObject(URL_PREFIX + "/add", dept, boolean.class);
}
@GetMapping("/get")
private List<Dept> queryAll() {
return restTemplate.getForObject(URL_PREFIX + "/get", List.class);
}
}
//主启动类
@SpringBootApplication
public class Resumer_80 {
public static void main(String[] args) {
SpringApplication.run(Resumer_80.class, args);
}
}
15.启动并测试
启动两个服务,两个服务没有启动的顺序限制,但是为了避免在调用时出现失败的情况,建议先启动服务提供者,在启动服务消费者
16.最后附一张项目结构
SpringCloud的初体验就到这了,这只是一个很简单的示例
源码地址:https://gitee.com/peachtec/springcloud