1 总体介绍

以Dept部门模块做一个微服务通用案例
Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务

Maven的聚合工程
cloudDemo父工程
cloud-api :封装的整体Entity/接口/公共配置等
cloud-provider-dept-8001 :微服务落地的服务提供者
cloud-consumer-dept-80: 微服务调用的客户端使用

2 本次SpringCloud版本

稳定版本
image.png

3 构建步骤

3.1 cloudDemo父工程

1 新建一个Maven工程 设置为打包为pom
pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.spiritmark.cloud</groupId>
  5. <artifactId>cloudemo</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>pom</packaging>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. <junit.version>4.12</junit.version>
  13. <log4j.version>1.2.17</log4j.version>
  14. <lombok.version>1.16.18</lombok.version>
  15. </properties>
  16. <dependencyManagement>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-dependencies</artifactId>
  21. <version>Hoxton.RELEASE</version>
  22. <type>pom</type>
  23. <scope>import</scope>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-dependencies</artifactId>
  28. <version>2.2.1.RELEASE</version>
  29. <type>pom</type>
  30. <scope>import</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>mysql</groupId>
  34. <artifactId>mysql-connector-java</artifactId>
  35. <version>8.0.13</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>com.alibaba</groupId>
  39. <artifactId>druid</artifactId>
  40. <version>1.0.31</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.mybatis.spring.boot</groupId>
  44. <artifactId>mybatis-spring-boot-starter</artifactId>
  45. <version>1.3.0</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>ch.qos.logback</groupId>
  49. <artifactId>logback-core</artifactId>
  50. <version>1.2.3</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>junit</groupId>
  54. <artifactId>junit</artifactId>
  55. <version>${junit.version}</version>
  56. <scope>test</scope>
  57. </dependency>
  58. <dependency>
  59. <groupId>log4j</groupId>
  60. <artifactId>log4j</artifactId>
  61. <version>${log4j.version}</version>
  62. </dependency>
  63. </dependencies>
  64. </dependencyManagement>
  65. </project>

3.2 cloud-api :封装的整体Entity/接口/公共配置等

1 新建一个Maven Model 项目

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent><!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 -->
  5. <groupId>com.spiritmark.cloud</groupId>
  6. <artifactId>cloudDemo</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. </parent>
  9. <artifactId>cloud-api</artifactId><!-- 当前Module我自己叫什么名字 -->
  10. <dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
  11. <dependency>
  12. <groupId>org.projectlombok</groupId>
  13. <artifactId>lombok</artifactId>
  14. </dependency>
  15. </dependencies>
  16. </project>

2 新建部门Entity且配合lombok使用

  1. package com.spiritmark.cloud.entity;
  2. import java.io.Serializable;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import lombok.experimental.Accessors;
  6. @SuppressWarnings("serial")
  7. @NoArgsConstructor
  8. @Data
  9. @Accessors(chain=true)
  10. public class Dept implements Serializable //必须序列化
  11. {
  12. private Long deptno; //主键
  13. private String dname; //部门名称
  14. private String db_source;//来自那个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同数据库
  15. public Dept(String dname)
  16. {
  17. super();
  18. this.dname = dname;
  19. }
  20. }

3 mvn clean install后给其它模块引用,达到通用目的。

3.3 cloud-provider-dept-8001 :微服务落地的服务提供者

1 新建一个Model cloud-provider-dept-8001 打包方式是jar
pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>com.spiritmark.cloud</groupId>
  6. <artifactId>cloudDemo</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. </parent>
  9. <artifactId>cloud-provider-dept-8001</artifactId>
  10. <dependencies>
  11. <dependency><!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
  12. <groupId>com..cloud</groupId>
  13. <artifactId>cloud-api</artifactId>
  14. <version>${project.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>junit</groupId>
  18. <artifactId>junit</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>mysql</groupId>
  22. <artifactId>mysql-connector-java</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.alibaba</groupId>
  26. <artifactId>druid</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>ch.qos.logback</groupId>
  30. <artifactId>logback-core</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.mybatis.spring.boot</groupId>
  34. <artifactId>mybatis-spring-boot-starter</artifactId>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-jetty</artifactId>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-web</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework.boot</groupId>
  46. <artifactId>spring-boot-starter-test</artifactId>
  47. </dependency>
  48. <!-- 修改后立即生效,热部署 -->
  49. <dependency>
  50. <groupId>org.springframework</groupId>
  51. <artifactId>springloaded</artifactId>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework.boot</groupId>
  55. <artifactId>spring-boot-devtools</artifactId>
  56. </dependency>
  57. </dependencies>
  58. </project>

2 yml配置文件

  1. server:
  2. port: 8001
  3. mybatis:
  4. config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
  5. type-aliases-package: com.spiritmark.cloud.entity # 所有Entity别名类所在包
  6. mapper-locations:
  7. - classpath:mybatis/mapper/**/*.xml # mapper映射文件
  8. spring:
  9. application:
  10. name: cloud-dept
  11. datasource:
  12. type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
  13. driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
  14. url: jdbc:mysql://localhost:3306/cloudDB01 # 数据库名称
  15. username: root
  16. password: 123456
  17. dbcp2:
  18. min-idle: 5 # 数据库连接池的最小维持连接数
  19. initial-size: 5 # 初始化连接数
  20. max-total: 5 # 最大连接数
  21. max-wait-millis: 200 # 等待连接获取的最大超时时间

3 工程src/main/resources目录下新建mybatis文件夹后新建mybatis.cfg.xml文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <settings>
  7. <setting name="cacheEnabled" value="true"/><!-- 二级缓存开启 -->
  8. </settings>
  9. </configuration>

4 MySQL创建部门数据库脚本

DROP DATABASE IF EXISTS cloudDB01;
CREATE DATABASE cloudDB01 CHARACTER SET UTF8;
USE cloudDB01;
CREATE TABLE dept
(
  deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  dname VARCHAR(60),
  db_source   VARCHAR(60)
);

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());

5 DeptDao部门接口

package com.spiritmark.cloud.dao;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.spiritmark.cloud.entities.Dept;

@Mapper
public interface DeptDao
{
  public boolean addDept(Dept dept);

  public Dept findById(Long id);

  public List<Dept> findAll();
}

6 工程src/main/resources/mybatis目录下新建mapper文件夹后再建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="com.spiritmark.cloud.dao.DeptDao">

  <select id="findById" resultType="Dept" parameterType="Long">
   select deptno,dname,db_source from dept where deptno=#{deptno}; 
  </select>
  <select id="findAll" resultType="Dept">
   select deptno,dname,db_source from dept; 
  </select>
  <insert id="addDept" parameterType="Dept">
   INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());
  </insert>

</mapper>

7 DeptService部门服务接口、实现类

package com.spiritmark.cloud.service;

import java.util.List;

import com.spiritmark.cloud.entities.Dept;

public interface DeptService
{
  public boolean add(Dept dept);
  public Dept    get(Long id);
  public List<Dept> list();
}
package com.spiritmark.cloud.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.spiritmark.cloud.dao.DeptDao;
import com.spiritmark.cloud.entities.Dept;
import com.spiritmark.cloud.service.DeptService;

@Service
public class DeptServiceImpl implements DeptService
{
  @Autowired
  private DeptDao dao ;

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

  @Override
  public Dept get(Long id)
  {
   return dao.findById(id);
  }

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

}

8 DeptController部门微服务提供者REST

package com.spiritmark.cloud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.spiritmark.cloud.entities.Dept;
import com.spiritmark.cloud.service.DeptService;

@RestController
public class DeptController
{
  @Autowired
  private DeptService service;

  @RequestMapping(value="/dept/add",method=RequestMethod.POST)
  public boolean add(@RequestBody Dept dept)
  {
   return service.add(dept);
  }

  @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
  public Dept get(@PathVariable("id") Long id)
  {
   return service.get(id);
  }

  @RequestMapping(value="/dept/list",method=RequestMethod.GET)
  public List<Dept> list()
  {
   return service.list();
  }

}

9 DeptProvider8001主启动类

package com.spiritmark.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DeptProvider8001
{
  public static void main(String[] args)
  {
   SpringApplication.run(DeptProvider8001.class, args);
  }
}

10 测试 http://localhost:8001/dept/list

3.4 cloud-consumer-dept-80: 微服务调用的客户端使用

1 新建一个Model cloud-consumer-dept-80 打包方式是jar

2 pom.xml

<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.spiritmark.cloud</groupId>
   <artifactId>cloudDemo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
  </parent>

  <artifactId>cloud-consumer-dept-80</artifactId>
  <description>部门微服务消费者</description>

  <dependencies>
   <dependency><!-- 自己定义的api -->
     <groupId>com.spiritmark.cloud</groupId>
     <artifactId>cloud-api</artifactId>
     <version>${project.version}</version>
   </dependency> 
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <!-- 修改后立即生效,热部署 -->
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>springloaded</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
   </dependency>   
  </dependencies>


</project>

3 yml配置文件

server:
  port: 80

4 ConfigBean编写

package com.spiritmark.cloud.cfgbeans;

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();
    }
}

RestTemplate是什么:
RestTemplate提供了多种便捷访问远程Http服务的方法,
是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集

官网及使用:链接

使用restTemplate访问restful接口非常的简单粗暴无脑。(url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。

5 DeptControllerConsumer

package com.spiritmark.cloud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.spiritmark.cloud.entities.Dept;

@RestController
public class DeptController_Consumer
{
    private static final String REST_URL_PREFIX = "http://localhost:8001";

    @Autowired
    private RestTemplate restTemplate;

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

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

    @SuppressWarnings("unchecked")
    @RequestMapping(value="/consumer/dept/list")
    public List<Dept> list()
    {
         return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
    }   
}

6 DeptConsumer80

package com.spiritmark.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class DeptConsumer80
{
  public static void main(String[] args)
  {
   SpringApplication.run(DeptConsumer80.class, args);
  }
}

7 测试
http://localhost/consumer/dept/list

以上就是一个微服务的案例 由cloud-consumer-dept-80(消费者) 调用cloud-provider-dept-8001(服务提供者)