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. 分类(类别/Category)与 类扩展(Extension)

    一.分类(类别/Category) 1.适用范围      当你已经封装好了一个类(也可能是系统类.第三方库),不想在改动这个类了,可是随着程序功能的增加需要在类中增加一个方法,这时我们不必修改主类, ...

  2. fn project hot functions 说明

    1. 简单介绍 所谓 hot  functions 实际上就是长时间运行的functions ,简单理解类似后台任务 2. fnproject  处理的方式 fnproject 使用 类似 http的 ...

  3. 《笔者带你剖析Apache Commons DbUtils 1.6》(转)

    前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更 多的是依靠Hibernate.Ibatis.Spring JDBC.JPA等大厂提供的持久层技术解决方案, ...

  4. js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)

    本文为大家详细介绍下使用js实现遮罩弹出层居中,且随浏览器窗口滚动条滚动,示例代码如下,感兴趣的朋友可以参考下, js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动) 下面看看我的原始代码: & ...

  5. C#检测应用程序重复启动----函数检测(可以在多用户登录情况下检测)

    上文是在网上找的检测程序重复运行的类,但是感觉不是很好用,而且还使用了API,似乎完全没有必要,于是晚上自己写了一个函数,经过测试,在多用户下仍然可以检测到程序的多次运行.当然,如果程序改了名字还是可 ...

  6. 关于Gateway

    为什么要有gateway?就是因为如果没有,很多的功能需要在在每个微服务中都实现,这样成本很高.

  7. utf_8 和 GBK 不搭出现乱码(转)

    今天调数据的时候发现调出来的一直是乱码,用了各种方法都未解决,简单的调数据用了好长时间,最后突然发现了一个问题 页面的 <meta http-equiv="Content-Type&q ...

  8. 记一次印象有点深刻的坑(bug)

    1.该模块的主要功能介绍 该系统是一个网上课程预约系统. 学生进行口语预约(没上课前可以进行取消)--> 等待上课 --> 上完课老师进行完成的确认操作. 2.问题描述 看下图,现在出现的 ...

  9. MTK驱动移植相关路径

    转自:http://blog.csdn.net/yicao821/article/details/52314578 一.Flash兼容 bootable/bootloader/preloader/to ...

  10. jenkins使用HTML Publisher Plugin插件 拉取报告样式缺失问题解决

    ---------------------------------------------------------临时解决方案----亲测ok 要解决该问题,方式也比较简单,就是修改Content S ...