SpringBoot26 利用 Ribbon + RestTemplate 调用远程服务资源
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 调用远程服务资源相关推荐
- SpringCloud03 Ribbon知识点、 Feign知识点、利用RestTemplate+Ribbon调用远程服务提供的资源、利用feign调用远程服务提供的资源、熔断...
1 远程服务资源的调用 1.1 古老的套路 在微服务出现之前,所有的远程服务资源必须通过RestTemplate或者HttpClient进行:但是这两者仅仅实现了远程服务资源的调用,并未提供负载均衡实 ...
- ribbon, restTemplate 负载均衡服务调用
ribbon ribbon concept ribbon核心组件IRule 模仿源码重写轮询 ribbon concept spring cloud ribbon 是基于Netflix ribbon实 ...
- Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务
在Eureka Server 集群基础上,使用Spring RestTemplate,结合Ribbon功能进行服务调用,使用方式非常简单. 1.在主项目中新建一个模块,eurekaclient,mav ...
- [SpringCould篇]之服务消费方式Ribbon+RestTemplate
1.前言 1.1调用服务的方式 Spring-Cloud调用服务有两种方式 Ribbon+RestTemplate Feign Ribbon是一个基于HTTP和TCP客户端的负载均衡器,feign默认 ...
- 利用FME PythonCaller调用7z解压压缩包
利用FME PythonCaller调用7z解压压缩包 一.概述 在一些项目中有时候需要对文件目录完整性进行检查,而需要检查的数据又是压缩包的形式.我们都知道FME可以直接读取压缩包里的文件,当通过F ...
- android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...
想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...
- 【spring boot】使用RestTemplate调用微信code2Session接口
前言 spring boot 2.1.1.RELEASE 使用RestTemplate调用微信code2Session接口 spring boot中使用RestTemplate,参考这里. 调用方法 ...
- 【spring boot】使用RestTemplate调用百度坐标转换服务
前言 spring boot 2.0.0.RELEASE http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.57542977 ...
- 利用java反射调用类的的私有方法
http://blog.csdn.net/sunyujia/article/details/2501709 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根 ...
最新文章
- php导出excel格式数据
- 「预训练-调优」范式的未来
- java web 总结,Java Web 相关概念经典总结(一)
- Java中List.remove报UnsupportedOperationException异常
- Cypress EZ-USB FX3 DMA模式下的串口通讯
- HarmonyOS 生态最重的拼图,手机开发者 Beta 版终于到来
- Usb设备驱动5:usb-firmware简易框架
- 刚刚,Google 官方发布了 2 份编程指南,干货十足!
- 基于ASP的在线邮件收发系统研究设计
- “恒德”机场智能应急指挥调度系统解决方案
- android开发 手写签名,Android实现手写签名
- mysql rm-rf_rm-rf误操作的恢复过程
- mysql是dbf格式吗_数据库文件是什么格式啊
- 2021年下半年信息系统项目管理师下午真题及答案解析
- 敏捷结果30天之第十一天:高效能、慢生活
- 驱动RGB灯带MCU阐述
- android os x86下载,Android-x86 Lineage OS 14.1-r3下载(2019/10/23官方更新版)
- 2020年河南高考--各高校在河南录取分数线预测(本科二批——文科)
- 数字图像处理MATLAB学习笔记(五)
- 《SEM运营36计》第10计:笑里藏刀
热门文章
- 第一章 Spring的简单剖析
- SVM原理以及Tensorflow 实现SVM分类(附代码)
- django 学习-13 Django文件上传
- ThinkPHP3.2开启静态缓存
- Linux下的字符界面扫雷游戏
- 蓝桥杯 ADV-117 算法提高 进制转换
- 1077. 互评成绩计算 (20)-PAT乙级真题
- 蓝桥杯 BASIC-26 基础练习 报时助手
- 1042. Shuffling Machine (20)-PAT甲级真题
- 服务器_Windows Server 2012 服务器之Web服务器