Rest环境搭建:服务提供者

39 阅读3分钟

总体介绍

  • 通过做一个Dept部门模块的微服务通用案例Consume消费者(Client)通过REST调用Provider提供者(Server)提供的服务。
  • 梳理Spring SpringMVC Mybatis等以往学习的知识
  • Maven的分包分模块架构复习稳固

一个简单的Maven结构

-- app-parent:一个父项目(app-parent)聚合很多子项目(app-uti1,app-dao,app-web.. .)
|-- pom.xm1

|
    | -- app-corell----pom.xm1
|
    |-- app-webll----pom.xm1

一个父工程带着多个子Module子模块 MicroServiceCloud父工程(Project)下初次带着3个子模块(Module)

  • microservicecloud-api【封装的整体entity/接口/公共配置等】
  • microservicecloud-provider-dept-8001【服务提供者】
  • microservicecloud-consumer-dept-80【服务消费者】

SpringCloudb版本说明

image.png

项目搭建

搭建父类项目,可以直接选择SpringBoot,也可以选择Maven(首选推荐),后续再添加公共依赖

image.png

选择导入的依赖(springBoot方式创建项目)

image.png

删除父工程里用不到的文件

image.png

父工程通用依赖配置(酌情添加)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloudstu</groupId>
    <artifactId>springcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud</name>
    <description>springcloud</description>


    <!--删除parent标签springboot版本代码 在properties标签指定稳定版本,对应dependency内部依赖-->
    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <lombok-version>1.18.22</lombok-version>
    </properties>

    <!--打包方式,pom-->
    <packaging>pom</packaging>

    <!--父模块依赖(公共)-->
    <dependencies>
        <!--SpringBoot依赖-->
        <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>
            <scope>test</scope>
        </dependency>
        <!--数据库,数据源-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

    <!--依赖版本控制-->
    <dependencyManagement>
        <dependencies>
            <!--Spring Cloud的版本管理-->
            <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>
            <!--Spring Cloud alibaba的版本管理, 通过dependency完成继承-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

搭建子工程 new一个module

image.png

在子工程中导入需要的依赖,如果父类已经指定了版本并进行了管理,就可以省略版本号了。

创建数据库,数据表

image.png

image.png

# 往表中插入数据
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());
insert into dept(dname, db_source) values ('外联部',database());

编码

实体类

package com.springcloudstu.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 拓展: 链式写法
 *  @Accessors(chain = true)
 *   eg: Dept dept = new Dept();
 *      dept.setDname("").setDbSource("").....
 */
@Data
@NoArgsConstructor
@Accessors(chain = true) // 链式写法
public class Dept implements Serializable { // 实体类 类和表做关系映射
    private Long deptno;
    private String dname;
    /**
     * 保存这个数据是哪个数据库的字段
     *  --- 微服务 一个服务对应一个数据库,同一个信息可能存在不同的数据库
     */
    private String dbSource;

    public Dept(String dname){
        this.dname = dname;
    }
}

创建子模块srpingcloud-provider-dept-8001

添加依赖支持

<?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>
    <parent>
        <groupId>com.springcloudstu</groupId>
        <artifactId>springcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>srpingcloud-provider-dept-8001</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--需要拿到实体类,所以要配置api module-->
        <dependency>
            <groupId>com.springcloudstu</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mysql数据库连接支持-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>
        <!--logback日志组件-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <!--mybatis支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
    </dependencies>
</project>

在子模块添加配置文件

server:
  port: 8001

# mybatis-plus配置

# mybatis配置
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

# spring的配置
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/sqlstudy?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456

mybatis-config配置文件回顾

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--开启二级缓存-->
    <settings>
        <setting name="cacheEnable" value="true"/>
    </settings>
</configuration>

创建dao

package com.springcloudstu.dao;

import com.springcloudstu.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface DeptDao {
    
    boolean addDept(Dept dept);
    
    Dept queryDeptById(Long id);
    
    List<Dept> queryDeptList();
}

编写mapper映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springcloudstu.dao.DeptDao">

    <insert id="addDept">
        insert into dept(dname,db_source) values (#{dname},DATABASE())
    </insert>
    <select id="queryDeptById" resultType="com.springcloudstu.pojo.Dept" parameterType="long">
        select * from dept where id = #{deptno}
    </select>
    <select id="queryDeptList" resultType="com.springcloudstu.pojo.Dept">
        select * from dept
    </select>
</mapper>

编写接口和接口实现类

package com.springcloudstu.service;

import com.springcloudstu.pojo.Dept;

import java.util.List;

public interface DeptService {
    boolean addDept(Dept dept);
    Dept queryDeptById(Long id);
    List<Dept> queryDeptList();
}
package com.springcloudstu.service.seviceImpl;

import com.springcloudstu.dao.DeptDao;
import com.springcloudstu.pojo.Dept;
import com.springcloudstu.service.DeptService;

import javax.annotation.Resource;
import java.util.List;


@Service
public class DeptServiceImpl implements DeptService {
    @Resource
    public DeptDao dao;

    @Override
    public boolean addDept(Dept dept) {
        return dao.addDept(dept);
    }

    @Override
    public Dept queryDeptById(Long id) {
        Dept dept = dao.queryDeptById(id);
        return dept;
    }

    @Override
    public List<Dept> queryDeptList() {
        return dao.queryDeptList();
    }
}

编写接口

package com.springcloudstu.controller;

import com.springcloudstu.pojo.Dept;
import com.springcloudstu.service.DeptService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 提供restful服务
 */
@RestController
public class DeptController {
    @Resource
    private DeptService service;

    @PostMapping("/dept/add")
    public boolean addDept(@RequestBody Dept dept){
        return service.addDept(dept);
    }

    @GetMapping("/dept/get/{id}")
    public Dept getById(@PathVariable("id") Long id){
        return service.queryDeptById(id);
    }
    
    @GetMapping("/dept/list")
    public List<Dept> selectAll(){
        return service.queryDeptList();
    }
}

编写启动类

package com.springcloudstu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@MapperScan("com.springcloudstu.mapper")
//@ComponentScan(basePackages = {"com.springcloudstu.mapper"} )  // 解决mapper注入失败问题
public class Provider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(Provider_8001.class,args);
    }
}

测试

image.png