SpringCloud-Netflix-03-服务远程调用

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 SpringCloud-Netflix-03-服务远程调用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文


三、服务远程调用

3.1 工程准备

3.1.1 搭建父工程

3.1.1.1 maven依赖:

<?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>
    <packaging>pom</packaging>
    
    <modules>
        <module>order_server</module>
        <module>store_server</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.8.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.cloud</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

3.1.2 搭建商品微服务

3.1.2.1 maven依赖:

<?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>01_SpringCloud_RestTemplate</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>item_server</artifactId>


</project>

3.1.2.2 application.yml

server:
  port: 9000

3.1.2.3 ItemApplication

package com.cloud.item;

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

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@SpringBootApplication
public class ItemApplication {
    public static void main(String[] args) {
        SpringApplication.run(ItemApplication.class);
    }
}

3.1.2.4 ItemController

package com.cloud.item.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@RestController
@RequestMapping("/item")
public class ItemController {


}

3.1.2.5 Order实体类

实际开发应该搭建一个common公共模块,实体类编写在公共模块中,我们为了简单起见,在各个微服务中编写同样的实体类;

package com.cloud.item.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * @author lscl
 * @version 1.0
 * @intro: 订单实体类
 */
@Data                   // get/set/toString
@NoArgsConstructor      // 无参构造
@AllArgsConstructor     // 有参构造
public class Order {

    private Integer id;
    private String itemName;
    private Double price;
    private Integer num;
}

3.1.3 搭建订单微服务

3.1.3.1 maven依赖

<?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>01_SpringCloud_RestTemplate</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>order_server</artifactId>

</project>

3.1.3.2 application.yml

server:
  port: 9001

3.1.3.3 OrderApplication

package com.cloud.order;

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

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }
}

3.1.3.4 Order实体类

package com.cloud.order.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * @author lscl
 * @version 1.0
 * @intro: 订单实体类
 */
@Data                   // get/set/toString
@NoArgsConstructor      // 无参构造
@AllArgsConstructor     // 有参构造
public class Order {

    private Integer id;
    private String itemName;
    private Double price;
    private Integer num;
}

3.1.3.5 OrderController

package com.cloud.order.controller;

import com.cloud.order.entity.Order;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@RestController
@RequestMapping("/order")
public class OrderController {

    /**
     * 新增订单
     * @param order
     * @return
     */
    @PostMapping
    public Map save(@RequestBody Order order){

        return new HashMap(){{
            put("flag",true);
            put("message","新增成功");
            put("statusCode","200");
            put("order",order);
        }};
    }

    /**
     * 删除订单
     * @param id
     * @return
     */
    @DeleteMapping("{id}")
    public Map delete(@PathVariable Integer id){

        return new HashMap(){{
            put("flag",true);
            put("message","删除成功");
            put("statusCode","200");
            put("id",id);
        }};
    }

    /**
     *
     * @param id
     * @param order
     * @return
     */
    @PutMapping("{id}")
    public Map update(@PathVariable Integer id,@RequestBody Order order){

        order.setId(id);
        return new HashMap(){{
            put("flag",true);
            put("message","修改");
            put("statusCode","200");
            put("order",order);
        }};
    }

    @GetMapping("{id}")
    public Map findById(@PathVariable Integer id){

        return new HashMap(){{
            put("flag",true);
            put("message","查询成功");
            put("statusCode","200");
            put("id",id);
        }};
    }
}

工程搭建如下:

在这里插入图片描述

3.2 RestTemplate

RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。接下来我们就来看看这些操作方法的使用。

3.2.1 RestTemplate方法介绍

请求方式 方法 返回值
GET getForObject(String,Class,Object…)
GET getForEntity(String,Class,Object…) ResponseEntity
POST postForLocation(String,Object,Object…) URI
POST postForObject(String,Object,Class,Object…)
POST postForEntity(String,Class,Object…) ResponseEntity
PUT put(String,Object,Object…) void
DELETE delete(String,Object…) void
自定义 exchange(String,HttpMethod,HttpEntity,Class,Object…) ResponseEntity

3.2.2 配置 RestTemplate

package com.cloud.item;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@SpringBootApplication
public class ItemApplication {
    public static void main(String[] args) {
        SpringApplication.run(ItemApplication.class);
    }

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

3.2.3 测试类

package com.cloud.demo;

import com.cloud.item.ItemApplication;
import com.cloud.item.entity.Order;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
@SpringBootTest(classes = ItemApplication.class)
@RunWith(SpringRunner.class)
public class Demo01 {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * get请求
     */
    @Test
    public void test1() {

        // 直接获取响应体
//        Map resultMap = restTemplate.getForObject("http://localhost:9001/order/1", Map.class);

        // 获取响应实体
        ResponseEntity<Map> entity = restTemplate.getForEntity("http://localhost:9001/order/1", Map.class);

        // 响应码
        System.out.println(entity.getStatusCodeValue());

        // 响应头
        System.out.println(entity.getHeaders());

        // 响应体
        Map resultMap = entity.getBody();
        System.out.println(resultMap);
    }

    /**
     * post请求
     */
    @Test
    public void test2() {
        Map resultMap = restTemplate.postForObject(
                "http://localhost:9001/order",
                new Order(1, "赣南脐橙", 48.8, 10),
                Map.class);

        // 响应码
        System.out.println(resultMap);
    }

    /**
     * put请求
     */
    @Test
    public void test3() {

        // 可以发送put请求,但是没有返回值
        restTemplate.put(
                "http://localhost:9001/order/11",
                new Order(null, "赣南脐橙", 48.8, 10));

        // 封装一个请求对象
        HttpEntity<Order> httpEntity=new HttpEntity(new Order(null, "赣南脐橙", 48.8, 10));

        // 发送PUT请求
        ResponseEntity<Map> responseEntity = restTemplate.exchange(
                "http://localhost:9001/order/110",
                HttpMethod.PUT,
                httpEntity,
                Map.class
        );

        Map resultMap = responseEntity.getBody();
        System.out.println(resultMap);

    }

    /**
     * delete请求
     */
    @Test
    public void test4() {
        // 可以发送put请求,但是没有返回值
//        restTemplate.delete("http://localhost:9001/order/110");

        // 发送PUT请求
        ResponseEntity<Map> responseEntity = restTemplate.exchange(
                "http://localhost:9001/order/110",
                HttpMethod.DELETE,
                null,
                Map.class
        );

        Map resultMap = responseEntity.getBody();
        System.out.println(resultMap);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131750.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!