博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SpringCloud - 02使用REST实现服务通信

Posted on 2021-01-13 19:57  Kingdomer  阅读(113)  评论(0编辑  收藏  举报

SpringCloud - 02使用REST实现服务通信

(1)项目框架

工程项目POM文件

 
 <packaging>pom</packaging>
 <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mysql.version>5.1.43</mysql.version>
        <druid.version>1.1.19</druid.version>
        <spring.boot.version>2.3.6.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR9</spring.cloud.version>
        <spring.cloud.eureka.server.version>2.2.6.RELEASE</spring.cloud.eureka.server.version>
        <spring.cloud.eureka.client.version>2.2.6.RELEASE</spring.cloud.eureka.client.version>
        <spring.cloud.config.version>2.2.6.RELEASE</spring.cloud.config.version>
        <spring.cloud.ribbon.version>2.2.6.RELEASE</spring.cloud.ribbon.version>
        <spring.cloud.feign.version>2.2.6.RELEASE</spring.cloud.feign.version>
        <spring.cloud.hystrix.version>2.2.6.RELEASE</spring.cloud.hystrix.version>
        <spring.cloud.hystrix.dashboard.version>2.2.6.RELEASE</spring.cloud.hystrix.dashboard.version>
        <spring.cloud.zuul.version>2.2.6.RELEASE</spring.cloud.zuul.version>

        <mybatis.spring.boot.version>2.1.0</mybatis.spring.boot.version>
        <lombok.version>1.18.12</lombok.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <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>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <version>${spring.boot.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
                <version>${spring.cloud.eureka.server.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                <version>${spring.cloud.eureka.client.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                <version>${spring.cloud.ribbon.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
                <version>${spring.cloud.config.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
                <version>${spring.cloud.config.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
                <version>${spring.boot.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>${spring.cloud.feign.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
                <version>${spring.cloud.hystrix.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
                <version>${spring.cloud.hystrix.dashboard.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
                <version>${spring.cloud.zuul.version}</version>
            </dependency>
        </dependencies>

    </dependencyManagement>

服务框架:

  • Project                         : 整体父工程,定义POM文件
  • microservicecloud-api           : 公共子模块Module, 封装的entity/接口/公共配置等
  • microservicecloud-dept-provider : 部门微服务提供者Module
  • microservicecloud-dept-consumer : 部门微服务消费者Module

 

(2)microservicecloud-api

Dept类

@Data
public class Dept implements Serializable
{
    private Long   deptno;
    private String dname;
    private String db_source;
}

 

(3)microservicecloud-dept-provider

(3.1)POM文件

     <dependency>
            <groupId>com.bearpx</groupId>
            <artifactId>microservicecloud-api</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

(3.2)application.yml配置文件

server:
  port: 8001

mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  type-aliases-package: com.bearpx.springcloud.entity
  mapper-locations:
    - classpath:mapper/*.xml

spring:
  application:
    name: microservicecloud-dept-provider
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/clouddb01?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: Mysql2020
    dbcp2:
      min-idle: 5
      initial-size: 5
      max-total: 10
      max-wait-millis: 200

(3.3)MyBatis配置文件mybatis-config.xml

<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

(3.4)SQL语句

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(50),
    db_source varchar(50)
);

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

(3.5)DeptDao接口及Dept.xml文件

@Mapper
public interface DeptDao {
    public boolean addDept(Dept dept);
    public Dept findById(Long id);
    public List<Dept> findAll();
}
<?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.bearpx.springcloud.dept.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>

(3.6) DeptService/DeptServiceImpl类

@Service          // import org.springframework.stereotype.Service;
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptDao deptDao;

    public boolean add(Dept dept) {
        return deptDao.addDept(dept);
    }

    public Dept get(Long id) {
        return deptDao.findById(id);
    }

    public List<Dept> list() {
        return deptDao.findAll();
    }
}

(3.7)DeptController类

@RestController
@RequestMapping("/dept")
public class DeptController {

    @Autowired
    private DeptService deptService;

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

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

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

(3.8)主启动类

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

 

(4)microservicecloud-dept-consumer

(4.1)POM文件

    <dependencies>
        <dependency>
            <groupId>com.bearpx</groupId>
            <artifactId>microservicecloud-api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

(4.2)ConfigBean类

  • RestTemplate提供了多种便捷访问远程HTTP服务的方法,是一种访问RESTful服务模板类。
    • 是Spring提供的用于访问REST服务的客户端模板工具集。
  • restful接口:(url, requestMap, ResponseBean.class)->  REST请求地址、请求参数、HTTP响应被转换为对象类型
@Configuration
public class ConfigBean {

    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

(4.3)消费者Controller类

@RestController
public class DeptConsumerController {

    private final static String REST_DEPT_URL_PREFIX ="http://localhost:8001";

    @Autowired
    private RestTemplate restTemplate;

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

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

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

(4.4)主启动类

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

(4.5)测试