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. python学习之面向对象(下)

    该篇主要是针对面向对象的细讲,包括类的多重继承,方法的重写,析构函数,回收机制进行讲解 #该类主要是讲述python面象对象的一些特征,包括继承,方法的重写,多态,垃圾回收 class person( ...

  2. c++使用http协议上传文件到七牛云服务器

    使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置: "Content-Type:multipart/form-data;boundary=xxx" ...

  3. 51nod 1085 背包问题

    在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数).求背包能够容纳的最大价值. 收起   输入 第1行,2个 ...

  4. LG3628 [APIO2010]特别行动队

    题意 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i, i + 1, . ...

  5. RESTful Get方式传参json格式后端400 解决方案

    前端采用vue+axios 后端采用spring boot restful 问题: 前端get 请求需要传递array 字段值 后端由于tomcat 版本问题,不支持url接受特殊字符包括 [] {} ...

  6. 泛型List<T>排序(利用反射)

    在最近一个项目中,有需求要对页面中所有的gridview添加排序功能.由于gridview的数据源绑定的是一个集合类List,而不是DataTable,所以无法使用DataView排序功能.另外,不同 ...

  7. ELK之kibana的web报错[request] Data too large, data for [<agg [2]>] would be larger than limit of

    http://blog.51cto.com/11819159/1926411 ELK架构:elasticsearch+kibana+filebeat 版本信息: elasticsearch 5.2.1 ...

  8. eclipse配置storm1.1.0开发环境并本地跑起来

    storm的开发环境搭建比hadoop(参见前文http://www.cnblogs.com/wuxun1997/p/6849878.html)简单,无需安装插件,只需新建一个java项目并配置好li ...

  9. dxjk中 支付宝二维码支付 git 存疑

    线上的vendor/latrell/alipay 文件拉取不了至本地,失去了git监控 要想本地使用 1.注释掉config/app.php 'providers' 下的Latrell模块 2.下载线 ...

  10. week-02 线性表

    一.PTA实验作业 题目1:顺序表 7-1 最长连续递增子序列 1. 设计思路 定义结构体List,定义数组Data[maxsize]表示顺序表元素,变量Position表示位置,变量Length表示 ...