Spring Cloud之(四)基于RestTemplate的微服务调用

四、基于RestTemplate的微服务调用

前面我们已经成功的把第一个小案例跑起来了,其中消费者使用了RestTemplate来调用提供者提供的微服务,下面就来详细的说明一下RestTemplate的用法!

4.1 RestTemplate介绍

Spring框架提供了RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接,我们只需要传入url以及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。

在Spring应用程序中访问第三方REST服务与使用Spring RestTemplate类有关。RestTemplate类的设计原则与许多其他Spring 模板类(例如JdbcTemplate、JmsTemplate)相同,为执行复杂任务提供了一种具
有默认行为的简化方法。

RestTemplate默认依赖JDK提供http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library。

考虑到RestTemplate类是为调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者是HTTP协议的方法:HEAD、GET、POST、PUT、DELETE和OPTIONS。例如,
RestTemplate类具有headForHeaders()、getForObject()、postForObject()、put()和delete()等方法。

4.2 RestTemplate方法介绍

该模板类的主要切入点为一下几个方法,并对应这HTTP的六个主要方法:

HTTP methodRestTemplate methods
GETgetForObject(String,Class< T >,Object…)
getForEntity(String,Class< T >,Object…)
POSTpostForLocation(String,Object,Object…)
postForObject(String,Object,Class< T >,Object…)
PUTput(String,Object,Object…)
DELETEdelete(String,Object…)
HEADheadForHeaders(String,Object…)
OPTIONSoptionsFoeAllow(String,Object…)
anyexchange(String,HttpMethod,HttpEntity<?>,Class< T >,Object…)
execute(String,HttpMethod,RequestClaaback,ResponseExtractor< T >,Object…)

4.3 通过RestTemplate调用微服务

  • 在消费者方配置启动类

    在启动类中注入RestTemplate的bean实例

    /**
     * 配置RestTemplate交给spring管理
     * @return
     */
    @Bean
    public RestTemplate restTemplate()
    {
    	return new RestTemplate();
    }
    
  • 在消费者方Controller编写方法

    package cn.ebuy.order.controller;
    import cn.ebuy.order.pojo.EasybuyProduct;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    import java.util.List;
    @RestController
    @RequestMapping("/order")
    @SuppressWarnings("all")
    public class OrderController {
        @Autowired
        RestTemplate restTemplate;
        @Autowired
        private DiscoveryClient discoveryClient;
        /**
         * 这里的地址是没有做集群时的写法,只有一个地址
         * @param id
         * @return
         */
        @RequestMapping(value = "/{id}",method = RequestMethod.GET)
        public EasybuyProduct findById(@PathVariable Long id) {
            EasybuyProduct easybuyProduct=new EasybuyProduct();
            // 这里是调用product里的服务,端口号是:9011    
            easybuyProduct=restTemplate.getForObject("http://127.0.0.1:9011/product/"+id,EasybuyProduct.class);
            return easybuyProduct;
        }
    }
    

4.4 硬编码存在的问题

现在,我们已经可以通过RestTemplate调用商品微服务的RESTful API接口,但是很明显我们使用的是提供者的网络地址(ip:端口)等硬编码到了代码中,这种做法存在许多问题:

  • 应用场景有局限;
  • 无法动态调整

这个时候我们就很容易想到例如Dubbo这样的注册中心,将服务注册到注册中心,通过注册中心动态的对服务注册和服务发现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值