4.1 介绍

  • 我们会使用一个Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务。
  • 回顾Spring,SpringMVC,Mybatis等以往学习的知识。
  • Maven的分包分模块架构复习。

一个简单的Maven模块结构是这样的:

— app-parent: 一个父项目(app-parent)聚合了很多子项目(app-util\app-dao\app-web…) |— pom.xml | |— app-core ||—— pom.xml | |— app-web ||—— pom.xml ……

一个父工程带着多个Moudule子模块

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

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

4.2 SpringCloud版本选择

大版本说明
**

| SpringBoot | SpringCloud | 关系 | | 1.2.x | Angel版本(天使) | 兼容SpringBoot1.2x | | —- | —- | —- | | 1.3.x | Brixton版本(布里克斯顿) | 兼容SpringBoot1.3x,也兼容SpringBoot1.4x | | 1.4.x | Camden版本(卡姆登) | 兼容SpringBoot1.4x,也兼容SpringBoot1.5x | | 1.5.x | Dalston版本(多尔斯顿) | 兼容SpringBoot1.5x,不兼容SpringBoot2.0x | | 1.5.x | Edgware版本(埃奇韦尔) | 兼容SpringBoot1.5x,不兼容SpringBoot2.0x | | 2.0.x | Finchley版本(芬奇利) | 兼容SpringBoot2.0x,不兼容SpringBoot1.5x | | 2.1.x | Greenwich版本(格林威治) | |

实际开发版本关系
**

spring-boot-starter-parent spring-cloud-dependencles
版本号 发布日期 版本号 发布日期
1.5.2.RELEASE 2017-03 Dalston.RC1 2017-x
1.5.9.RELEASE 2017-11 Edgware.RELEASE 2017-11
1.5.16.RELEASE 2018-04 Edgware.SR5 2018-10
1.5.20.RELEASE 2018-09 Edgware.SR5 2018-10
2.0.2.RELEASE 2018-05 Fomchiey.BULD-SNAPSHOT 2018-x
2.0.6.RELEASE 2018-10 Fomchiey-SR2 2018-10
2.1.4.RELEASE 2019-04 Greenwich.SR1 2019-03

使用后两个
**

4.3 创建工程

1、创建父工程
**

  • 新建父工程项目springcloud,切记Packageing是pom模式
  • 主要是定义POM文件,将后续各个子模块公用的jar包等统一提取出来,类似一个抽象父类

4. SpringCloud RestTemplate学习环境搭建 - 图1

  • 父工程pom.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0</modelVersion>
    6. <groupId>nuc.ss</groupId>
    7. <artifactId>springcloud</artifactId>
    8. <version>1.0-SNAPSHOT</version>
    9. <modules>
    10. </modules>
    11. <!-- 打包方式 pom -->
    12. <packaging>pom</packaging>
    13. <properties>
    14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    15. <maven.compiler.source>1.8</maven.compiler.source>
    16. <maven.compiler.target>1.8</maven.compiler.target>
    17. <junit.version>4.12</junit.version>
    18. <log4j.version>1.2.17</log4j.version>
    19. <lombok.version>1.16.18</lombok.version>
    20. </properties>
    21. <dependencyManagement>
    22. <dependencies>
    23. <dependency>
    24. <groupId>org.springframework.cloud</groupId>
    25. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    26. <version>0.2.0.RELEASE</version>
    27. <type>pom</type>
    28. <scope>import</scope>
    29. </dependency>
    30. <!--springCloud的依赖-->
    31. <dependency>
    32. <groupId>org.springframework.cloud</groupId>
    33. <artifactId>spring-cloud-dependencies</artifactId>
    34. <version>Greenwich.SR1</version>
    35. <type>pom</type>
    36. <scope>import</scope>
    37. </dependency>
    38. <!--SpringBoot-->
    39. <dependency>
    40. <groupId>org.springframework.boot</groupId>
    41. <artifactId>spring-boot-dependencies</artifactId>
    42. <version>2.1.4.RELEASE</version>
    43. <type>pom</type>
    44. <scope>import</scope>
    45. </dependency>
    46. <!--数据库-->
    47. <dependency>
    48. <groupId>mysql</groupId>
    49. <artifactId>mysql-connector-java</artifactId>
    50. <version>5.1.47</version>
    51. </dependency>
    52. <dependency>
    53. <groupId>com.alibaba</groupId>
    54. <artifactId>druid</artifactId>
    55. <version>1.1.10</version>
    56. </dependency>
    57. <!--SpringBoot 启动器-->
    58. <dependency>
    59. <groupId>org.mybatis.spring.boot</groupId>
    60. <artifactId>mybatis-spring-boot-starter</artifactId>
    61. <version>1.3.2</version>
    62. </dependency>
    63. <!--日志测试~-->
    64. <dependency>
    65. <groupId>ch.qos.logback</groupId>
    66. <artifactId>logback-core</artifactId>
    67. <version>1.2.3</version>
    68. </dependency>
    69. <dependency>
    70. <groupId>junit</groupId>
    71. <artifactId>junit</artifactId>
    72. <version>${junit.version}</version>
    73. </dependency>
    74. <dependency>
    75. <groupId>log4j</groupId>
    76. <artifactId>log4j</artifactId>
    77. <version>${log4j.version}</version>
    78. </dependency>
    79. <dependency>
    80. <groupId>org.projectlombok</groupId>
    81. <artifactId>lombok</artifactId>
    82. <version>${lombok.version}</version>
    83. </dependency>
    84. </dependencies>
    85. </dependencyManagement>
    86. <build>
    87. <resources>
    88. <resource>
    89. <directory>src/main/java</directory>
    90. <includes>
    91. <include>**/*.yml</include>
    92. <include>**/*.properties</include>
    93. <include>**/*.xml</include>
    94. </includes>
    95. <filtering>false</filtering>
    96. </resource>
    97. <resource>
    98. <directory>src/main/resources</directory>
    99. <includes>
    100. <include>**/*.yml</include>
    101. <include>**/*.properties</include>
    102. <include>**/*.xml</include>
    103. </includes>
    104. <filtering>false</filtering>
    105. </resource>
    106. </resources>
    107. </build>
    108. </project>


    2、创建子模块springcloud-api

    4. SpringCloud RestTemplate学习环境搭建 - 图2

  • 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">
      <parent>
          <artifactId>springcloud</artifactId>
          <groupId>nuc.ss</groupId>
          <version>1.0-SNAPSHOT</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>
    
      <artifactId>sprintcloud-api</artifactId>
    
      <!--当前的module自己需要的依赖,如果父依赖中已经配置了版本,这里就不用写了-->
      <dependencies>
          <dependency>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
          </dependency>
      </dependencies>
    </project>
    
  • 数据库的创建

**
4. SpringCloud RestTemplate学习环境搭建 - 图3

  • 实体类的编写

**
4. SpringCloud RestTemplate学习环境搭建 - 图4

package nuc.ss.springcloud.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;

@Data
@NoArgsConstructor
@Accessors(chain = true)
public class Dept implements Serializable {//实体类  orm 类表关系映射

    private long deptno;//主键
    private String dname;

    //这个数据存在那个数据库的字段,微服务,一个服务对应一个数据库,同一个信息可能存在不同的数据库
    private String db_source;

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

    /*
    * 链式写法:
    * Dept dept = new Dept();
    *
    * dept.setDeptNo(11).setDname('ssss').setDb_source('db01')
    * */
}

3、子模块springcloud-provider-dept-8081服务的提供者的编写
**
4. SpringCloud RestTemplate学习环境搭建 - 图5

  • 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">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>nuc.ss</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-provider-dept-8081</artifactId>

    <dependencies>
        <!--我们需要拿到实体类,所以要配置api module-->
        <dependency>
            <groupId>nuc.ss</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--junit-->
        <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>
        <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>
        </dependency>

        <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>
</project>
  • application.yml的配置

**

server:
  port: 8081

# mybatis的配置
mybatis:
  type-aliases-package: nuc.ss.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

# spring的配置
spring:
  application:
    name: springcloud-provider-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #数据库
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql//localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
    username: root
    password: admin
  • 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>
  • DeptMapper.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="nuc.ss.springcloud.dao.DeptDao">

    <insert id="addDept" parameterType="Dept">
        insert into dept (dname,db_source)
        values (#{dname},DATABASE())
    </insert>

    <select id="queryById" resultType="Dept" parameterType="Long">
        select * from dept where deptno = #{id}
    </select>

    <select id="queryAll" resultType="Dept">
        select * from dept
    </select>

</mapper>
  • 接口DeptController的编写

**

//视图Restful服务
@RestController
public class DeptController {
    @Autowired
    DeptService deptService;

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

    @GetMapping("/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id) {
        return deptService.queryById(id);
    }

    @GetMapping("/dept/list")
    public List<Dept> queryAll() {
        return deptService.queryAll();
    }
}

整体目录结构
**
4. SpringCloud RestTemplate学习环境搭建 - 图6

4、子模块springcloud-consumer-dept-80的编写
**

  • 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">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>nuc.ss</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-consumer-dept-80</artifactId>

    <dependencies>
        <dependency>
            <groupId>nuc.ss</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
  • application.yml


server:
  port: 80
  • 将RestTemplate注册到spring中:ConfigBean.java


@Configuration
public class ConfigBean {   //Cofiguration -- spring applicationContext.xml

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
  • DeptConsumerController.java


@RestController
public class DeptConsumerController {
    // 理解:消费者,不应该有service层
    // RestTemplate ... 供我们直接调用就可以了!注解到spring中

    // (url,实体:Map, Class<T> responseType)
    @Autowired
    private RestTemplate restTemplate;//提供多种便捷访问Http的方法

    private static final String REST_URL_PREFIX = "http://localhost:8081";

    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept) {
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }

    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id) {
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);
    }

    @RequestMapping("/consumer/dept/list")
    public List<Dept> list() {
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
    }
}
  • 启动服务: DeptConsumer_80


@SpringBootApplication
public class DeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_80.class,args);
    }
}
  • 整体目录结构

4. SpringCloud RestTemplate学习环境搭建 - 图7