SpringCloud(四):Ribbon与OpenFeign详解

Ribbon与OpenFeign详解

前言:本篇文章主要将介绍

  • Ribbon与OpenFeign是什么?
  • 用来做什么?
  • 如何实现?
  • 实现其功能的大致过程?
  • 项目中如何使用?

这几块来进行对Ribbon与OpenFeign的学习,不会涉及太多源码部分,帮助道友对其有一个基础认识。


一:什么是Ribbon?

Ribbon 是Netflix公司开源的一个负载均衡的项目,是一个客户端负载均衡器,运行在客户端上。因此,其可以很好地控制HTTP和TCP客户端的一些行为。 Feign已经默认使用了Ribbon

项目中多见RestTemplate和Ribbon相结合

代码如下:

  • @LoadBalanced 实现负载均衡(Ribbon)
  • RestTemplate调用服务接口
@Configuration
public class SysConfiguration {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }
}


@RestController
public class ConsumerController {

    @Resource
    private RestTemplate restTemplate;

    /**
     * 服务提供的地址:即服务提供方的spring.application.name 转大写
     * 也可以理解为在Eureka服务注册中心,注册的application值。
     */
    final String urlPath = "http://ORDER-PROVIDER";

    @GetMapping("/consumer/make/order")
    public String makeOrder(@RequestParam("name") String name){
        String template = restTemplate.getForObject(urlPath + "/order-server/create/order", String.class);
        return name + template;
    }
}

这里简单介绍下RestTemplate的用法。

  • 根据请求类型GET,POST等。
  • 根据返回数据类型可以分为:ForObject,ForEntity
  • 根据参数类型,可以分为三种重载方法
    • String url, Class responseType, Object… uriVariables
    • String url, Class responseType, Map uriVariables
    • URI url, Class responseType
  1. ForObject 为返回数据为具体对象;ForEntity 返回类型是ResponseEntity,该对象是Spring对HTTP请求响应的封装,其中主要存储了HTTP的几个重要元素,比如HTTP请求状态码的枚举对象HttpStatus、在它的父类HttpEntity中还存储着HTTP请求的头信息对象HttpHeaders以及泛型类型的请求体对象。
  2. responseType 为返回数据类型;uriVariables 为url中的参数值
GET请求
  • getForObject(String url, Class responseType,Object… urlVariables);
  • getForObject(String url, Class responseType, Map urlVariables);
  • getForObject(URI url, Class responseType);
  • getForEntity(String url, Class responseType,Object… urlVariables);
  • getForEntity(String url, Class responseType, Map urlVariables);
  • getForEntity(URI url, Class responseType);
POST请求
  • postForObject(String url, Object request, Class responseType, Object… uriVariables)
  • postForObject(String url, Object request, Class responseType, Map uriVariables)
  • postForObject(URI url, Object request, Class responseType)
  • postForEntity(String url, Object request, Class responseType, Object… uriVariables)
  • postForEntity(String url, Object request, Class responseType, Map uriVariables)
  • postForEntity(URI url, Object request, Class responseType)

新增加的request参数:该参数可以是一个普通对象,也可以是一个HttpEntity对象。

  • 如果是普通对象,而非HttpEntity对象的时候,RestTemplate会将请求对象转换为一个HttpEntity对象来处理;
  • Object就是request的类型,request内容会被视作完整的body来处理;
  • request是一个HttpEntity对象,那么就会被当作一个完成的HTTP请求对象来处理,这个request中不仅包含了body的内容,也包含了header的内容。

示例代码

RestTemplate rest = new RestTemplate();
User user = new User("张三");
ResponseEntity res = rest.postForEntity("http://USER-SERVER/user",user,String.class);
String boby = res.getBoby();

二:Ribbon如何实现负载均衡

集中式负载均衡(代表产品NGINX)

你可能感兴趣的:(面试,springCloud,SpringCloud,Ribbon,openFeign,feign,面试)