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);

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

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

    》依赖注入 LoadBalancerClient  实例 loadBalancerClient

    @Autowired
private LoadBalancerClient loadBalancerClient;

    》调用 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
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
} }

    》依赖注入 RestTemplate 实例 restTemplate

    @Autowired
private RestTemplate restTemplate;

    》调用 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
@LoadBalanced
public 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; @Autowired
private 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;
} }

服务调用者

  

  

SpringBoot26 利用 Ribbon + RestTemplate 调用远程服务资源的更多相关文章

  1. Android中利用AIDL机制调用远程服务

    服务端: //CalculateInterface.aidl package com.itheima.aidl.calculate; interface CalculateInterface { do ...

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

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

  3. 手把手带你利用Ribbon实现客户端的负载均衡

    之前的文章<SpringCloud搭建注册中心与服务注册>介绍了注册中心的搭建和服务的注册,本文将介绍下服务消费者通过Ribbon调用服务实现负载均衡的过程. 本文目录 一.Ribbon服 ...

  4. spring boot 2.0.3+spring cloud (Finchley)2、搭建负载均衡Ribbon (Eureka+Ribbon+RestTemplate)

    Ribbon是Netflix公司开源的一个负载均衡组件,将负载均衡逻辑封装在客户端中,运行在客户端的进程里. 本例子是在搭建好eureka的基础上进行的,可参考spring boot 2.0.3+sp ...

  5. spring cloud(服务消费者(利用ribbon实现服务消费及负载均衡)——初学二)

    Ribbon是一个基于HTTP和TCP客户端的负载均衡器,利用ribbon实现服务消费,并实现客户端的负载均衡. 一.准备工作(利用上一节的内容) 启动服务注册中心 启动computer-servic ...

  6. 玩转SpringCloud(F版本) 二.服务消费者(1)ribbon+restTemplate

    上一篇博客有人问我,Springcloud系列会不会连载 ,大家可以看到我的标签分类里已经开设了SpringCloud专题,所以当然会连载啦,本人最近也是买了本书在学习SpringCloud微服务框架 ...

  7. Android -- service的开启方式, start开启和绑定开启服务,调用服务的的方法, aidl调用远程服务

    1. 概述 bindService() 绑定服务  可以得到服务的代理人对象,间接调用服务里面的方法. 绑定服务: 间接调用服务里面的方法.           如果调用者activity被销毁了, ...

  8. Spring Boot使用Feign客户端调用远程服务时出现:timed-out and no fallback available,failed and no fallback available的问题解决

    timed-out and no fallback available: 这个错误基本是出现在Hystrix熔断器,熔断器的作用是判断该服务能不能通,如果通了就不管了,调用在指定时间内超时时,就会通过 ...

  9. Ribbon远程调用

    Ribbon是客户端的负载均衡机制,它有几种负载均衡机制.默认是轮询,我们也可以自定义规则.通过合理的分配网络请求来减小服务器的压力.项目都是注册到eureka服务器上.通过ribbon去调用其他服务 ...

随机推荐

  1. 使用 event.preventDefault 拦截表单的提交

    event.preventDefault() 方法 W3C 官方的定义是:取消事件的默认动作,不单单可以拦截表单的提交,<a>标签的跳转, <input>标签的输入等等默认动作 ...

  2. DevExpress使用笔记

    DevExpress这套控件用了也有几年的时间了,现在用的版本是14.2.2. 确实是很强大的一套控件,用的好,做出的效果也是相当的好,记录一些平常用到的代码,就当记笔记吧,慢慢完善,其实网上也有大把 ...

  3. CMCC有限的访问权限如何解决

    最近两天一直出现这个问题,连接CMCC-EDU的时候就是连接不上,提示有限的访问权限,什么诊断和修复IP自动获取都不管用,就是连接不上.怎么说本人也是一个电脑迷,越到这样不靠谱的问题确实不知道如何解决 ...

  4. Arcgis Desktop连接GIS Servers报错“Proxy server got bad address from remote server ...”

    今天打开Arcgis Desktop时突然发现连接GIS Servers报错“Proxy server got bad address from remote server ...” 网上查找到解决方 ...

  5. python3 chromeDriver 安装与配置

    1. 准备工作 在这之前请确保已经正确安装好了Chrome浏览器并可以正常运行,安装过程不再赘述. 2. 查看版本 点击Chrome菜单"帮助"→"关于Google Ch ...

  6. FIR滤波器的FPGA实现方法

    FIR滤波器的FPGA实现方法 2011-02-21 23:34:15   来源:互联网    非常重要的基本单元.近年来,由于FPGA具有高速度.高集成度和高可靠性的特点而得到快速发展.随着现代数字 ...

  7. python操作RabbitMQ(不错)

    一.rabbitmq RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  8. int 和 Integer 有什么区别

    原文地址:https://blog.csdn.net/chenliguan/article/details/53888018 1 int与Integer的基本使用对比 (1)Integer是int的包 ...

  9. laravel中session的过期时间

    在项目开发的过程中,前后端分离 需要用session保存用户的登陆信息 这就涉及到session的有效期了 session又分为php中的session有效期和laravel中的session的有效期 ...

  10. 【转】使用JMeter 完成常用的压力测试(三)

    使用JMeter 完成常用的压力测试 发布时间: 2008-9-27 15:33    作者: 未知    来源: 网络转载 字体:  小  中  大  | 上一篇 下一篇 | 打印  | 我要投稿 ...