1 RestTemplate扫盲

  借助 RestTemplate,Spring应用能够方便地使用REST资源   

2 准备

  创建三个springCloud项目

    》Eureaka : 服务注册中心

    》Product 商品服务

    》Order 订单服务

  技巧01:Eureaka 项目需要引入 spring-cloud-starter-netflix-eureka-server 依赖;其余两个项目需要引入 spring-cloud-starter-netflix-eureka-client 依赖

  技巧02:order 服务需要调用 product 项目中的资源数据【请求url为:http://127.0.0.1:8080/msg】,我们可以利用  RestTemplate 来实现

  坑01:所有的 springCloud项目中设置  eureka.instance.hostname 配置时需要注意,因为这个配置必须是IP地址或者域名;因为利用LoadBalancerClient根据应用名获取到的数据就是这个配置

  坑02:直接利用RestTemplate实现时是古老的方式实现,而且如果远程服务是集群部署时需要自己实现负载均衡的逻辑

3 RestTemplate的三种使用方式

  3.1 直接将url写死

    》创建 RestTemplate 实例 restTemplate

    》调用 restTemplate  的 getForObject 方法获取数据

    技巧01:getForObject 第一个参数接受一个string类型的url,例如:http://127.0.0.1:8080/msg;第二个参数指定响应数据类型

    技巧02:这是古老的方式实现,需要自己实现负载均衡和远程服务的信息配置

RestTemplate restTemplate = new RestTemplate();String response = restTemplate.getForObject("http://127.0.0.1:8080/msg", String.class);

View Code

  3.2 利用 LoadBalancerClient 获取引用IP和应用端口

    技巧02:利用ribbon获取远程服务信息,而且ribbon还实现了负载均衡功能

    》依赖注入 LoadBalancerClient  实例 loadBalancerClient

    @Autowiredprivate LoadBalancerClient loadBalancerClient;

View Code

    》调用 loadBalancerClient   的  choose 方法获取应用服务实例 serviceInstance

    》调用 serviceInstance 的 getHost 方法获取应用服务IP

      【技巧01:如果应用服务设置了eureka.instance.hostname,那么getHost 方法返回就是eureka.instance.hostname的配置值】

    》调用 serviceInstance 的 getPort 方法获取应用服务端口

    》将获取到的IP和端口以及请求路径拼接成请求资源的url即可,例如:http://127.0.0.1:8080/msg

    》在调用 RestTemplate 实例的 getForObject  方法

  3.3 通过配置实现

    利用了@LoadBalanced,可以在restTemplate中使用应用名

    》创建一个配置类

package cn.xiangxu.order.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;/*** @author 王杨帅* @create 2018-07-24 21:37* @desc RestConfig配置类**/
@Component
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

View Code

    》依赖注入 RestTemplate 实例 restTemplate

    @Autowiredprivate RestTemplate restTemplate;

View Code

    》调用 restTemplate  的 getForObject 方法获取数据

      【技巧01:这时候可以直接利用应用服务名称来代替应用IP和应用端口信息,例如:"http://PRODUCT/msg"】

  3.4 代码汇总

package cn.xiangxu.product.controller;import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Select;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author 王杨帅* @create 2018-07-24 20:45* @desc 服务端控制层**/
@RestController
@Slf4j
public class ServerController {@GetMapping(value = "/msg")public String msg() {String result = "商品微服务中的信息";log.info(result);return result;}}

服务提供者

package cn.xiangxu.order.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;/*** @author 王杨帅* @create 2018-07-24 21:37* @desc RestConfig配置类**/
@Component
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

服务调用者配置类

package cn.xiangxu.order.controller;import cn.xiangxu.order.config.RestTemplateConfig;
import com.netflix.discovery.converters.Auto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;/*** @author 王杨帅* @create 2018-07-24 20:51* @desc 客户端控制层**/
@RestController
@Slf4j
public class ClientController {//    @Autowired
//    private LoadBalancerClient loadBalancerClient;
@Autowiredprivate RestTemplate restTemplate;@GetMapping("/getProductMsg")public String getProductMsg() {// 方式01 直接将url写死
//        RestTemplate restTemplate = new RestTemplate();
//        String response = restTemplate.getForObject("http://127.0.0.1:8080/msg", String.class);// 方式02:利用LoadBalancerClient获取应用名(IP)和端口,在组装成url
//        RestTemplate restTemplate = new RestTemplate();
//        ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
//        log.info(serviceInstance.getHost());
//        log.info(serviceInstance.getPort() + "");
//        String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort() + "/msg");
//        String response = restTemplate.getForObject(url, String.class);// 方式03:通过配置实现,利用了@LoadBalanced,可以在restTemplate中使用应用名String response = restTemplate.getForObject("http://PRODUCT/msg", String.class);log.info(response);return response;
//        return null;
    }}

服务调用者

  

  

转载于:https://www.cnblogs.com/NeverCtrl-C/p/9363066.html

SpringBoot26 利用 Ribbon + RestTemplate 调用远程服务资源相关推荐

  1. SpringCloud03 Ribbon知识点、 Feign知识点、利用RestTemplate+Ribbon调用远程服务提供的资源、利用feign调用远程服务提供的资源、熔断...

    1 远程服务资源的调用 1.1 古老的套路 在微服务出现之前,所有的远程服务资源必须通过RestTemplate或者HttpClient进行:但是这两者仅仅实现了远程服务资源的调用,并未提供负载均衡实 ...

  2. ribbon, restTemplate 负载均衡服务调用

    ribbon ribbon concept ribbon核心组件IRule 模仿源码重写轮询 ribbon concept spring cloud ribbon 是基于Netflix ribbon实 ...

  3. Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务

    在Eureka Server 集群基础上,使用Spring RestTemplate,结合Ribbon功能进行服务调用,使用方式非常简单. 1.在主项目中新建一个模块,eurekaclient,mav ...

  4. [SpringCould篇]之服务消费方式Ribbon+RestTemplate

    1.前言 1.1调用服务的方式 Spring-Cloud调用服务有两种方式 Ribbon+RestTemplate Feign Ribbon是一个基于HTTP和TCP客户端的负载均衡器,feign默认 ...

  5. 利用FME PythonCaller调用7z解压压缩包

    利用FME PythonCaller调用7z解压压缩包 一.概述 在一些项目中有时候需要对文件目录完整性进行检查,而需要检查的数据又是压缩包的形式.我们都知道FME可以直接读取压缩包里的文件,当通过F ...

  6. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

  7. 【spring boot】使用RestTemplate调用微信code2Session接口

    前言 spring boot 2.1.1.RELEASE 使用RestTemplate调用微信code2Session接口 spring boot中使用RestTemplate,参考这里. 调用方法 ...

  8. 【spring boot】使用RestTemplate调用百度坐标转换服务

    前言 spring boot 2.0.0.RELEASE http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.57542977 ...

  9. 利用java反射调用类的的私有方法

    http://blog.csdn.net/sunyujia/article/details/2501709 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根 ...

最新文章

  1. php导出excel格式数据
  2. 「预训练-调优」范式的未来
  3. java web 总结,Java Web 相关概念经典总结(一)
  4. Java中List.remove报UnsupportedOperationException异常
  5. Cypress EZ-USB FX3 DMA模式下的串口通讯
  6. HarmonyOS 生态最重的拼图,手机开发者 Beta 版终于到来
  7. Usb设备驱动5:usb-firmware简易框架
  8. 刚刚,Google 官方发布了 2 份编程指南,干货十足!
  9. 基于ASP的在线邮件收发系统研究设计
  10. “恒德”机场智能应急指挥调度系统解决方案
  11. android开发 手写签名,Android实现手写签名
  12. mysql rm-rf_rm-rf误操作的恢复过程
  13. mysql是dbf格式吗_数据库文件是什么格式啊
  14. 2021年下半年信息系统项目管理师下午真题及答案解析
  15. 敏捷结果30天之第十一天:高效能、慢生活
  16. 驱动RGB灯带MCU阐述
  17. android os x86下载,Android-x86 Lineage OS 14.1-r3下载(2019/10/23官方更新版)
  18. 2020年河南高考--各高校在河南录取分数线预测(本科二批——文科)
  19. 数字图像处理MATLAB学习笔记(五)
  20. 《SEM运营36计》第10计:笑里藏刀

热门文章

  1. 第一章 Spring的简单剖析
  2. SVM原理以及Tensorflow 实现SVM分类(附代码)
  3. django 学习-13 Django文件上传
  4. ThinkPHP3.2开启静态缓存
  5. Linux下的字符界面扫雷游戏
  6. 蓝桥杯 ADV-117 算法提高 进制转换
  7. 1077. 互评成绩计算 (20)-PAT乙级真题
  8. 蓝桥杯 BASIC-26 基础练习 报时助手
  9. 1042. Shuffling Machine (20)-PAT甲级真题
  10. 服务器_Windows Server 2012 服务器之Web服务器