SpringCloud Ribbon详解

Spring Cloud Version:Hoxton.SR3

什么是Ribbon

SpringCloud ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过SpringCloud的封装,可以让我们轻松的将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用,Ribbon只是一个工具类框架,不像服务注册中心、配置中心、API网关需要独立部署,它几乎存在于每一个SpringCloud构建的微服务和基础设施中。因为微服务的调用,请求转发实际上都是通过Ribbon来实现的,包括Feign,它也是基于Ribbon实现的工具框架。

负载均衡

负载均衡在系统架构中是一个非常重要的,并且是不得不去实施的内容。因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。我们通常说的负载均衡都指的是服务端负载均衡,其中又分为硬件负载均衡和软件负载均衡。硬件负载均衡主要是通过服务器节点之间安装专门用于负载均衡的设备,比如F5等;而软件负载均衡则是通过在服务器上安装一些具有负载均衡功能和模块的软件来完成请求分发工作,比如Nginx等。

服务端负载均衡都会维护一个可用的服务端清单,通过心跳检测来剔除故障的服务端节点以保证清单中都是可用正常访问的服务端节点,当客户端发送请求到负载均衡设备的时候,该设备按照某种算法从维护的可用服务端清单中取出一台服务端的地址,然后进行转发。

客户端负载均衡和服务端负载均衡最大的不同点在于服务清单所存储的位置。在客户端负载均衡中,所有的客户端都需要维护着自己要访问的服务端清单,而这些服务清单来自于注册中心。

(目前对服务端负载均衡和客户端负载均衡不透彻,我认为服务端负载均衡是一个特定的工具,所有请求都会通过同一个负载均衡工具,客户端负载均衡是包含在每一个服务消费方的服务里,每一个服务都有属于自己的负载均衡,改日对nginx有了系统学习,在对这块更新,欢迎大神在评论去指教一二,感谢)

Ribbon实现负载均衡操作步骤

通过Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用非常简单,只需要如下两步:

  • 服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。
  • 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。
    在这里插入图片描述
RestTemplate介绍

传统情况下在Java代码里访问Restful服务,一般使用apache的HttpClient,这种方式非常繁琐,Spring提供了一种简单快捷的模版类来进行操作,这就是RestTemplate.

RestTemplate针对几种不同的请求类型和参数类型的服务调用实现:
GET请求
第一种:getForEntity函数。该方法返回的是ResponseEntity,该对象是Spring对HTTP请求响应的封装,其中主要存储了HTTP的几个重要元素,如HTTP请求状态,它的父类HttpEntity实体还存储着HTTP请求的头部信息和请求体信息。getForEntity函数有3个重载方法,介绍如下:。
在这里插入图片描述

  • getForEntity(String url, Class responseType, Object… urlVariables)
    在这里插入图片描述
    url为请求地址,repsonseType为请求响应体body的包装类型,urlVariables为url中的参数绑定,第三个参数会替换掉url中的占位符,urlVariables是一个数组,它的顺序对应url中占位符的数字顺序。
  • getForEntity(String url, Class responseType, Map urlVariables)
    在这里插入图片描述
    url为请求地址,repsonseType为请求响应体body的包装类型,urlVariables为url中的参数绑定,第三个参数会替换掉url中的占位符,urlVariables是一个map类型
  • getForEntity(Url url, Class responseType)
    在这里插入图片描述
    该方法使用URL对象来替代之前的url和urlVariables参数来指定访问地址和参数绑定。URI是jdk java.net包下的一个类,它表示统一资源标识符引用。更多使用方法参数JDK文档。
    第二种:getForObject函数,该方法可以理解为对getForEntity的进一步封装,它通过HttpMessageConverterExtractor对HTTP的请求响应body内容进行对象转换,实现请求直接返回包装好的对象内容。getForObject有三个重载函数,介绍如下:
    在这里插入图片描述
  • getForObject(String url, Class responseType, Object…urlVariables)
    在这里插入图片描述
  • getForObject(String url, Class responseType, Map urlVariables)
    在这里插入图片描述
  • getForObject(Url url, Class responseType)
    在这里插入图片描述
    这三个重载函数的参数和getForEntity的参数意义完全一样,这里不在重复了,和getForEntity函数相比,可以少一个从Response中获取body的步骤,当不需要关注请求响应除了body外的其他内容时,可以使用该函数。

POST请求
在RestTemplate中,对POST请求时可以通过如下三个方法进行调用实现。
第一种:postForEntity函数
在这里插入图片描述
同样,它有三个重载函数,uriVariables参数都用来对url中的参数进行绑定使用,用法和GET请求一样;
responseType参数是对请求响应的body内容的类型定义;request参数可以是一个普通对象,也可以是一个HttpEntity对象,如果是一个普通对象,RestTemplate会将请求对象转换为一个HttpEntity对象来处理,其中Object就是request的类型,request内容会被视作为完整的body来处理;而如果 request是一个HttpEntity对象,那么就会被当作一个完整的HTTP请求对象处理,不仅包含了body信息,还包含header的内容。

第二种:postForObject函数
在这里插入图片描述
该方法和getForObject类型,它的作用是简化postForEntity的后续处理,直接将响应的body内容包装成对象来返回使用,可以少一个从Response中获取body的步骤。参数和postForEntity的一样完全一样,这里不在重复。

第三种:postForLocation函数
在这里插入图片描述
该方法实现了以POST请求提交资源,并返回新资源的URI

PUT请求
在RestTemplate中,对PUT请求可以通过put方法进行调用,put函数也实现了三个不同的重载方法:
在这里插入图片描述
put函数为void类型,所以没有返回内容,所以就没有 responseType参数,其他参数和postForObject完全一样,这里不在重复。

DELETE请求
在RestTemplate中,对DELETE请求可以通过delete方法进行调用实现,delete实现了三个重载方法:
在这里插入图片描述
在进行REST请求时,通常都将DELETE请求的唯一标识拼接在url中,所以DELETE 请求也不需要request的body信息,url指定DELETE请求的位置,urlVariables绑定url中的参数。

负载均衡策略

  • RoundRobinRule:线性轮询(默认)
  • RandomRule:随机选择
  • RetryRule:重试机制
  • WeightedResponseTimeRule:计算权重
  • 。。。。
    (这块需要参考源码进行理解,待续。。。。)

负载均衡配置的三种方式:
第一种:启动类里添加IRule实例(Java代码)
在这里插入图片描述
第二种:@RibbonClient(name=“服务应用名”,configuration=配置类)(注解)
配置类:
在这里插入图片描述在启动类里使用@RibbonClient注解里添加配置类
在这里插入图片描述
(name必须和注册中心里的服务应用名称相同(大写),否则不会生效)

第三种:配置文件
<服务名>.ribbon.NFLoadBalanceRuleClassName=规则,这里的服务名一定是大写,因为在注册中心里,服务名是大写的,这里要注意,否则该配置不会生效。
在这里插入图片描述
未完待续。。。。

发布了8 篇原创文章 · 获赞 0 · 访问量 202

猜你喜欢

转载自blog.csdn.net/weixin_43175427/article/details/105482164