zoukankan      html  css  js  c++  java
  • Spring Cloud04: RestTemplate的使用

    上一篇我们已经学会了如何创建一个服务提供者,那么这一篇我们来创建一个服务消费者,实现思路是先通过Spring boot搭建一个微服务应用,再通过Eureka Client把它注册到注册中心Eureka Server,成为一个服务消费者。那么服务消费者如何调用服务提供者的接口呢,那么我们首先要来介绍一个组件RestTemplate的使用。

    一、什么是RestTemplate

    RestTemplate 是 Spring 框架提供的基于 REST 的服务组件,底层是对 HTTP 请求及响应进⾏了封装, 提供了很多访问 RETS 服务的⽅法,可以简化代码开发。

    二、如何使用RestTemplate

    1.创建一个maven工程作为子服务

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
    

    2.创建application.yml,代码如下

    server:
      port: 8080
    spring:
      application:
        name: consumer
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
      instance:
        prefer-ip-address: true
    

    2.创建与服务提供者相同的实体类,代码如下

    package com.frr.entity;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data //生成Getter,Setter,equals,canEqual,hasCode,toString等方法
    @AllArgsConstructor //添加一个构造函数,该构造函数含有所有已声明字段属性参数
    @NoArgsConstructor //创建一个无参构造函数
    public class Student {
    	private long id;
    	private String name;
    	private int age;
    }
    

    3.创建controller,并且在方法中调用服务提供者的接口,代码如下

    package com.frr.controller;
    
    import java.util.Collection;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.DeleteMapping;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.PutMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import com.frr.entity.Student;
    
    @RestController
    @RequestMapping("/consumer")
    public class RestTemplateController {
    	
    	@Autowired
    	private RestTemplate restTemplate;
    	
    	@GetMapping("/findAll")
    	@SuppressWarnings("unchecked")
    	public Collection<Student> findAll(){
    		return restTemplate.getForEntity("http://localhost:8010/student/findAll", Collection.class).getBody();
    	}
    	
    	@SuppressWarnings("unchecked")
    	@GetMapping("/findAll2")
    	public Collection<Student> findAll2(){
    		return restTemplate.getForObject("http://localhost:8010/student/findAll",Collection.class);
    	}
    	
    	@GetMapping("/findById/{id}")
    	public Student findById(@PathVariable("id") long id){
    		return	restTemplate.getForEntity("http://localhost:8010/student/findById/{id}",Student.class,id).getBody();
    	}
    	
    	@GetMapping("/findById2/{id}")
    	public Student findById2(@PathVariable("id") long id){
    		return	restTemplate.getForObject("http://localhost:8010/student/findById/{id}",Student.class,id);
    	}
    	
    	@PostMapping("/save")
    	public void save(@RequestBody Student student){
    		restTemplate.postForEntity("http://localhost:8010/student/save",student,null).getBody();
    	}
    	
    	@PostMapping("/save2")
    	public void save2(@RequestBody Student student){
    		restTemplate.postForObject("http://localhost:8010/student/save",student,null);
    	}
    		
    	@PutMapping("/update")
    	public void update(@RequestBody Student student){
    		restTemplate.put("http://localhost:8010/student/update",student);
    	}
    	
    	@DeleteMapping("/deleteById/{id}")
    	public void deleteById(@PathVariable("id") long id){
    		restTemplate.delete("http://localhost:8010/student/deleteById/{id}",id);
    	}
    	
    }
    

    4.创建启动类,需要注意的是,需要在启动类里将RestTemplate的实例进行注入的,这里采用@Bean的方式,代码如下

    package com.frr;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    public class RestTemplateApplication {
    	public static void main(String[] args) throws Exception {
    		SpringApplication.run(RestTemplateApplication.class, args);
    	}
    	
    	@Bean
    	public RestTemplate restTemplate(){
    		return new RestTemplate();
    	}
    }
    

    5.依次启动注册中心、服务提供者、服务消费者,利用Postman工具测试,不同的请求可获得相同的数据返回

    * 8010服务提供者findAll接口返回数据如下

    img

    * 8080服务消费者findAll接口返回数据如下

    img

    *结论:数据返回一致,服务消费者成功调用服务提供者的接口!

    6.总结

    服务提供者和服务消费者从代码的层面来看,是没有太大区别的,他们本身都是Spring boot的工程,我们在此基础上,通过Spring Cloud的一些组件,让他们拥有了不同的身份。服务提供者提供了对外访问的接口,服务消费者也提供了对外访问的接口,只不过接口内部是在调用其他服务的接口,所以从某种意义上讲,服务消费者也是一个服务提供者,其他服务也可以掉用服务消费者的服务。因此,服务之间没有绝对的提供者与消费者,它们之间是可以相互调用的!

  • 相关阅读:
    菜鸟运维笔记:安装MySQL,PHP及phpMyAdmin
    在MyEclipse中统计项目行数
    工作已定,望悉
    经常使用算法之贪心
    leetcode
    程序猿的量化交易之路(20)--Cointrader之Assert实体(8)
    【MySQL】 查询某个数据库有多少张数据表
    【powerdesigner】将pdm或者cdm保存为普通图片格式
    【web maven】新建的项目 controller也有,从前台跳转后台 无法找到对应的controller
    【Java 新建项目】使用程序对新项目的各个实体 创建Dao、DaoImpl、Service、ServiceImpl层的文件
  • 原文地址:https://www.cnblogs.com/kylinxxx/p/14510890.html
Copyright © 2011-2022 走看看