目录
前言
1、数据库准备
2、创建Maven父项目,并编写pom.xml
3、建立子Module
4、配置springcloud-api
5、配置springcloud-provider-blog-8001
4、配置springcloud-consumer-blog-80
5、测试REST搭建环境
6、复盘全局
小结
【一心同学】正在参加【博客之星】
希望各位大佬能够投【五星】? ? ? ? ?给予【一心同学】,每一份投票都是【一心同学】的动力。
【一心同学】投票专区入口:https://bbs.csdn.net/topics/603956556?
想要学到更多后端知识,欢迎关注【一心同学】
??????感谢各位大可爱小可爱!???????
前言
我们知道Spring Cloud是基于HTTP的REST方式调用的,然而听概念只是感觉很抽象,本篇博客将由【一心同学】带领大家进行基于Spring Clou的Rest环境的搭建,更加了解Spring Cloud的特性。
1、数据库准备
CREATE DATABASE mydb1;
USE mydb1;
DROP TABLE IF EXISTS `blog`;
CREATE TABLE `blog` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`db_source` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
insert into `blog`(`id`,`name`,`db_source`) values (1,'一心同学','mydb1'),(2,'张三','mydb1');
2、创建Maven父项目,并编写pom.xml
(1)配置打包方式?
<!--打包方式 pom-->
<packaging>pom</packaging>
(2)版本号和依赖管理
<!--版本号统一管理-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.13.2</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.20</lombok.version>
</properties>
<!--依赖管理,这样子项目导入依赖时就无需指定版本号了-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloud的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.12.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--SpringBoot 启动器-->
<!-- mybatis 启动器,版本至关重要-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--日志测试~-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
(3)注意事项
spring-cloud-dependencies这个依赖的版本要与Spring Boot的版本相对应!
步骤一:进入Spring Cloud官网:Spring Cloud
步骤二:点击LEARN,并选择相应的Spring Cloud依赖
步骤三:进入 Reference Doc.
可以发现我选的这个Spring Cloud依赖是:Hoxtom.SR12,其对应的Spring Boot版本需要2.3.12.RELEASE及以上的。
(4) 完整的父项目pom配置文件
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.yixin</groupId>
<artifactId>SpringCloud</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式 pom-->
<packaging>pom</packaging>
<!--版本号统一管理-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.13.2</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.20</lombok.version>
</properties>
<!--依赖管理,这样子项目导入依赖时就无需指定版本号了-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloud的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.12.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--SpringBoot 启动器-->
<!-- mybatis 启动器,版本至关重要-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--日志测试~-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
3、建立子Module
注:同样以Maven形式创建。
(1)添加Module
(2)? 建立三个Maven子项目,目录如下
4、配置springcloud-api
我们把实体类放在springcloud-api中。
(1)导入依赖
可以发现,由于父项目中以及管理了lombok这个jar包指定了版本号,所以我们这里无需再指定版本号了。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
(2)建立以下目录
(3)编写实体类Blog
package com.yixin.springcloud.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
//所有的实体类必须实现序列化接口
public class Blog implements Serializable {
private Integer id;
private String name;
private String db_source;//这个数据是存在哪个数据库的字段
//微服务架构:一个服务对应一个数据库,也就是说同一个信息会存到不同的数据库,因此需要 db_source 进行区分
}
5、配置springcloud-provider-blog-8001
springcloud-provider-blog-8001:是我们的服务提供方。
(1)导入依赖
<dependencies>
<!--导入我们刚刚写的springclou-api,这样我们才可以调用到里面的实体类Blog-->
<dependency>
<groupId>org.yixin</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</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>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.4.5</version>
</dependency>
<!--注意这里的Spring Boot版本要与Spring Cloud的版本相匹配!-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<version>2.5.2</version>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.4.5</version>
</dependency>
</dependencies>
(2)建立以下目录
(3)编写BlogDao接口
package com.yixin.springcloud.dao;
import com.yixin.springcloud.pojo.Blog;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface BlogDao {
boolean addBlog(Blog blog);
Blog queryById(Integer id);//根据id查找Blog
List<Blog> queryAll();
}
(4)编写application.yml
我们将其端口号设置为:8001
server:
port: 8001
mybatis:
type-aliases-package: com.yixin.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
(5)编写mybatis-config.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>
(6)编写BlogMapper.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="com.yixin.springcloud.dao.BlogDao">
<insert id="addBlog" parameterType="Blog">
insert into blog (name,db_source) values (#{name},DATABASE());
</insert>
<select id="queryById" resultType="Blog" parameterType="java.lang.Integer">
select * from blog where id=#{id};
</select>
<select id="queryAll" resultType="Blog">
select * from blog;
</select>
</mapper>
(7)编写接口BlogService
package com.yixin.springcloud.service;
import com.yixin.springcloud.pojo.Blog;
import java.util.List;
public interface BlogService {
boolean addBlog(Blog blog);
Blog queryById(Integer id);
List<Blog> queryAll();
}
(8)编写实现类BlogServiceImpl
package com.yixin.springcloud.service;
import com.yixin.springcloud.dao.BlogDao;
import com.yixin.springcloud.pojo.Blog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BlogServiceImpl implements BlogService{
@Autowired
private BlogDao blogDao;
@Override
public boolean addBlog(Blog blog) {
return blogDao.addBlog(blog);
}
@Override
public Blog queryById(Integer id) {
return blogDao.queryById(id);
}
@Override
public List<Blog> queryAll() {
return blogDao.queryAll();
}
}
(9)编写BlogController
package com.yixin.springcloud.controller;
import com.yixin.springcloud.pojo.Blog;
import com.yixin.springcloud.service.BlogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class BlogController {
@Autowired
private BlogService blogService;
@PostMapping("/blog/add")
public boolean addBlog(Blog blog){
return blogService.addBlog(blog);
}
@GetMapping("/blog/get/{id}")
public Blog get(@PathVariable("id") Integer id){
return blogService.queryById(id);
}
@GetMapping("/blog/list")
public List<Blog> queryAll(){
return blogService.queryAll();
}
}
注意:我们【提交】请求一般实用Post,因为使用GET进行提交不安全,而获取就可以使用【GET】。
(10)编写启动类BlogProvider_8001
Tip:其实可以发现我们这个子项目其实就是我们自己手写搭建的Spring Boot项目。
package com.yixin.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BlogProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(BlogProvider_8001.class,args);
}
}
(11)启动项目,进行测试
访问:http://localhost:8001/blog/list
注意:端口号是8001。
测试成功!
4、配置springcloud-consumer-blog-80
(1)导入依赖
<dependencies>
<!--导入我们刚刚写的springclou-api,这样我们才可以调用到里面的实体类Blog-->
<dependency>
<groupId>org.yixin</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--注意这里的Spring Boot版本要与Spring Cloud的版本相匹配!-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.5</version>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.4.5</version>
</dependency>
</dependencies>
(2)创建以下目录
(3)编写application.yml
设置端口号为:8000
server:
port: 8000
(4)编写配置类ConfigBean
a、由于Spring Cloud是基于HTTP的REST方式进行调用,所以我们这里需要使用到一个类RestTemplate,其可以提供多种便捷访问远程http服务的方法,简单的Restful服务模板。
b、但是RestTemplate并没有注入到Spring中,所以才需要我们自己编写配置类注册到Spring中。
package com.yixin.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ConfigBean{
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
(5)编写BlogConsumerController控制类
注意:我们这个springcloud-consumer-blog-80是一个消费者项目,所以不存在service和dao,该项目只需要进行调用请求即可。
package com.yixin.springcloud.controller;
import com.yixin.springcloud.pojo.Blog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class BlogConsumerController {
@Autowired
private RestTemplate restTemplate;
/**
* 服务提供方地址前缀
*/
private static final String REST_URL_PREFIX="http://localhost:8001";
/**
* 消费方根据博客Blog的id进行查询博客
*/
@GetMapping("/consumer/blog/get/{id}")
public Blog get(@PathVariable Integer id){
// getForObject(服务提供方地址(接口),返回类型.class)
return restTemplate.getForObject(REST_URL_PREFIX +"/blog/get/"+id, Blog.class);
}
/**
* 消费方添加博客Blog信息
*/
@PostMapping("/consumer/blog/add")
public boolean add(Blog blog){
// postForObject(服务提供方地址(接口),参数实体,返回类型.class)
return restTemplate.postForObject(REST_URL_PREFIX +"blog/add",blog,Boolean.class);
}
/**
* 消费方查找所有博客
*/
@GetMapping("/consumer/blog/list")
public List<Blog> list(){
return restTemplate.getForObject(REST_URL_PREFIX +"/blog/list", List.class);
}
}
(6)编写Spring? Boot启动类BlogConsumer_80
package com.yixin.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BlogConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(BlogConsumer_80.class,args);
}
}
5、测试REST搭建环境
依次启动Spring Boot:
BlogProvider_8001-------->BlogConsumer_80
测试:
访问:http://localhost:8000/consumer/blog/list
注意:我们是以消费方的角度去访问的,我们设置消费方的端口是:8000。
结果:
测试成功!
6、复盘全局
进行到这一步,我们基于Spring Cloud的REST环境搭建就已经成功了!我们来看下各个子项目分别都执行了什么功能。
springcloud-api:负责实体类的存放
springcloud-provider-blog-8001:服务提供方,负责与数据库进行交互,dao层和service层都在这个子项目中。
springcloud-consumer-blog-80:消费方,只需负责对请求的调用。
服务方与消费方之间通过RestTemplate进行调用。
小结
以上就是【一心同学】对Spring Cloud中Rest环境搭建的详细讲解了,我们再回顾这么【一句话】:Spring Cloud是基于HTTP的REST方式调用的。对这句话是不是就理解得更加深刻了。
【一心同学】在博客中的讲解喜欢用通俗易懂的文笔去讲明白一个知识点,而不喜欢用那种高大上的官方文笔来进行陈述,如果你对后端知识感兴趣,欢迎关注??????【一心同学】???????。
|