Spring Cloud(三) Ribbon

客户端负载均衡: Spring Cloud Ribbon

  Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Hetflix Ribbon实现。

客户端负载均衡

  负载均衡是对一个系统的高可用、网络压力的缓解、和处理能力扩容的重要手段之一。通常说的负载均衡都指的是服务端负载均衡,主要分为软件负载均衡和硬件负载均衡。硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,比如F5。而软件负载均衡则是通过在服务器中安装一些具有负载均衡功能或者模块的软件来完成请求分发工作,比如Nginx。服务端负载均衡都是维护一个下挂可用的服务器清单,通过某种算法(轮询、按照权重、按照流量等)从可用的服务器清单中取出一台服务器的地址,然后进行转发。客户端负载均衡不同与服务端负载均衡的是所有的客户端都要维护自己要访问的服务器清单,这些清单都来自于注册中心。

Spring Cloud Ribbon使用客户端负载均衡

  1. 服务提供者只需要启动多个服务实例并注册一个注册中心或者多个相关联的服务注册中心
  2. 服务注册者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。

RestTemplate详解

GET请求(2种方法)
getForEntity函数

  该方法返回ResponseEntity(Spring对HTTP请求相应的封装)

  1. getForEntity(String url, Class responseType, Object… uriVariables)
    url : 请求的地址
    responseType : 请求响应体body的包装类型
    uriVariables : url中的参数绑定,数组内容替代{1}这样的占位符。
    例:

    1
    getForEntity("http://USER-SERVICE/user?name={1}",String.class,"didi");
  2. getForEntity(String url, Class responseType, Map uriVariables)
    与1中只有uriVariables不同,替代的是制定参数的{key}这样的占位符。
    例:

    1
    getForEntity("http://USER-SERVICE/user?name={name}",String.class,new HashMap<>().put("name","peter"));
  3. getForEntity(URI url, Class responseType)
    使用URI(统一资源标识符)来代替url
getForObject函数

  可以认为是getForEntity的进一步封装,通过HttpMessageConverterExtractor对HTTP的请求响应体进行对象转换。

  1. getForObject(String url, Class responseType, Object… uriVariables)
  2. getForObject(String url, Class responseType, Map uriVariables)
  3. getForObject(URI url, Class responseType)
POST请求(3种方法)
posrFotEntity函数

  绝大部分和getForEntity用法相同

  1. postForEntity(String url, Object request, Class responseType, Object… uriVariables)
    request : 可以是一个普通对象(REstTemlate会将其转化成一个HttpEntity来处理,类型为Object,request的内容被视为body内容),也可以是一个HttpEntity对象(完整的Http请求,包含body和header)
  2. postForEntity(String url, Object request, Class responseType, Map uriVariables)
  3. postForEntity(URI url, Object request, Class responseType)
postForObject函数

  与getForObject类似

postForLocation函数

  以POST方式提交资源,并返回新资源的URI。因为返回新资源的URI,因此不需要指定responseType。

  1. postForLocation(String url, Object request, Object… uriVariables)
  2. postForLocation(String url, Object request, Map uriVariables)
  3. postForLocation(URI url, Object request)
PUT请求
put函数

  put方法无返回值,因此也就没有responseType,其他与postForObject类似

  1. put(String url, Object request, Object… uriVariables)
  2. put(String url, Object request, Map uriVariables)
  3. put(URI url, Object request)
DELETE请求
delete函数

  通常使用唯一标识,因此无需request的body信息。

  1. delete(String url, Object… uriVariables)
  2. delete(String url, Map uriVariables)
  3. delete(URI url)