SpringCloud初体验

源码地址: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

猜你喜欢

转载自blog.csdn.net/weixin_45481406/article/details/109907498