Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。

一、什么是负载均衡

  当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。

  负载均衡一般分为两种:硬件负载均衡(如F5)和软件负载均衡(Nginx),一般我们在项目中使用更多的是Nginx,硬件的负载均衡虽然强大,但是成本过高,不太适用于我们平常开发的项目。

二、Nginx与ribbon的区别

  我们在项目中,一般是用Nginx实现负载均衡,但是在spring cloud为我们提供了一个负载均衡的组件ribbon,我们就来看看这二者的区别:

  nginx:

  nginx是作为一个中间服务器,将所有的请求统一进行处理,通过负载均衡算法转发收到的请求到各个服务端,可以说nginx是服务端的负载均衡。

  nginx是服务端的负载均衡

  Ribbon:

  Ribbon是从eureka注册中心服务器端上获取已经注册的服务,如果有注册的服务中带有二个或者多个地址,那么就可以通过负载均衡算法实现负载均衡。 

  Ribbon是客户端的负载均衡

三、ribbon负载均衡的配置

  ribbon负载均衡实现需要开启四个微服务:

  1.注册中心服务(不在叙述)

  2.两个服务提供者的微服务(80端口与81端口)

  a.服务提供者的配置与spring cloud eureka客户端的配置相同,主要是两个微服务的配置文件中,服务的名称要一致:

###服务启动端口号
server:
port: 80
###服务名称(服务注册到eureka名称)
spring:
application:
name: producter
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka ---------------------------------------------------------------------------------
###服务启动端口号
server:
port: 81
###服务名称(服务注册到eureka名称)
spring:
application:
name: producter
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka

 b.在80和81项目中分别创建两个controller层访问

80端口的controller层

    @RestController
public class ServiceController { @GetMapping("/producteri")
public String sayHi(){
return "这是80端口的服务";
}
}

81端口的controller层 

    @RestController
public class ServiceController { @GetMapping("/producteri")
public String sayHi(){
return "这是81端口的服务";
}
}  

3.服务消费者

    a.导入maven依赖  

    <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

  b.消费端的yml文件  

###服务启动端口号
server:
port: 8080
###服务名称(服务注册到eureka名称)
spring:
application:
name: consumer
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka

  c.添加一个配置RibbonConfig类

    RibbonConfig类是微服务中消费者自动注入Ioc容器中的类。我们知道在服务调用端中,本身是没有任何业务逻辑的,只有通过RestTemplate的实例来获取微服务,如果我们之所以没有直接注入到controller层,就是因为我们添加了@LoadBalanced注解,实现一个负载均衡的成员属性。

    @Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

  c.定义个服务端请求,调用微服务

    @RestController
public class ClientController{ @Autowired
private RestTemplate restTemplate; @GetMapping("/consumer")
public String sayHi(){
return restTemplate.getForObject("http://producter",String.class);
}
}

  最后访问http://127.0.0.1:8080/consumer,可以看见测试结果

四、ribbon自带的负载均衡算法

ribbon为我们封装了7种负载均衡算法:

  1.BestAvailableRule:选择一个最小的并发请求的server
  2.AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)
  3.WeightedResponseTimeRule:根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。
  4.RetryRule:对选定的负载均衡策略机上重试机制。(RoundRobinRule的加强版,在轮训时发现某些服务无法连接,如果这些服务超过了设定的连接数,之后就会跳过这些服务进行轮训)
  5.RoundRobinRule:轮训(ribbon默认的算法)
  6.RandomRule:随机选中一个server
  7.ZoneAvoidanceRule:复合判断server所在区域的性能和server的可用性选择server

如何选择ribbon自带的算法:

   我们只需要指定IRule实现就可以,实现的类就是上面介绍7种算法的名字。

   在服务调用端中,RibbonConfig类文件下我们添加IRule的实现代码

@Bean
public IRule ribbonRule() {
return new RetryRule();//RetryRule就是我们上面介绍的7种算法,默认的实现是RoundRobinRule算法
}    

spring cloud学习笔记二 ribbon负载均衡的更多相关文章

  1. 《Spring Cloud》学习(二) 负载均衡!

    第二章 负载均衡 负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.Spring Cloud Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netfli ...

  2. Spring Cloud第四篇 | 客户端负载均衡Ribbon

    ​ 本文是Spring Cloud专栏的第四篇文章,了解前三篇文章内容有助于更好的理解本文: ​Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  3. 【Spring Cloud学习之二】服务注册和发现

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 一.EurekaEureka是Netflix开源的一个RESTful服务,主要用于服 ...

  4. spring cloud学习笔记三 Feign与Ribbon负载均衡的区别

    一.Feign的介绍 Feign一般比较书面的解释是:Feign是一个声明式的WebService客户端,使用Feign编写的WebService客户端更加简单,他的使用方法是定义一个接口,然后在上线 ...

  5. Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制

    上一篇文章单独介绍了Ribbon框架的使用,及其如何实现客户端对服务访问的负载均衡,但只是单独从Ribbon框架实现,没有涉及spring cloud.本文着力介绍Ribbon的负载均衡机制,下一篇文 ...

  6. spring cloud学习(三)使用Ribbon实现客户端负载均衡

    使用Ribbon实现客户端的负载均衡 * 个人博客空间 : https://zggdczfr.cn/ * Ribbon Spring Cloud Netflix Ribbon 是一个客户端负载均衡的组 ...

  7. Spring Cloud学习笔记【二】Eureka 服务提供者/服务消费者(ribbon)

    Ribbon 是 Netflix 发布的开源项目,主要功能是为 REST 客户端实现负载均衡.它主要包括六个组件: ServerList,负载均衡使用的服务器列表.这个列表会缓存在负载均衡器中,并定期 ...

  8. Spring Cloud 学习笔记(二)——Netflix

    4 Spring Cloud Netflix Spring Cloud 通过自动配置和绑定到Spring环境和其他Spring编程模型惯例,为Spring Boot应用程序提供Netflix OSS集 ...

  9. 史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)

    能够实现Nacos安装 基于Nacos能实现应用负载均衡 能基于Nacos实现配置管理 配置管理 负载均衡 多环境切换 配置共享 配置刷新 灰度发布 掌握Nacos集群部署 1 Nacos安装 Nac ...

随机推荐

  1. 批处理bat文件显示中文乱码解决方式

    1.下载Notepad++并安装 2.选择编码,将文件编码转换为ANSI编码

  2. django的安装和初步使用

    安装参考:步骤也可以参考这个 很详细 https://blog.csdn.net/zww1984774346/article/details/54408759 如果想在终端查看项目结构 需要用到tre ...

  3. php array()函数 语法

    php array()函数 语法 作用:生成一个数组 语法:索引数组:array(value1,value2,value3,etc.);关联数组:array(key=>value,key=> ...

  4. 现在的编辑器不能复制粘贴word中的文本

    我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...

  5. 基于ES6的tinyJquery

    原文地址:Bougie的博客 jQuery作为曾经Web前端的必备利器,随着MVVM框架的兴起,如今已稍显没落.但它操作DOM的便利性无出其右.我用ES6写了一个基于class简化版的jQuery,包 ...

  6. 新建 SecondFragment 实现类

    package com.test.mvp.mvpdemo.mvp.v6.view; import android.os.Bundle;import android.support.annotation ...

  7. map()函数用法

    需求:已知两个列表,现在要一个列表中的元素,分别全部插入另一个列表中,新列表是[[0, 9, 1], [0, 9, 2], [0, 9, 3], [0, 9, 4], [0, 9, 5], [0, 9 ...

  8. 微信小程序的开发框架

    wxss:是一套样式语言,用来描述wxml的组件样式:小程序在css基础上做的修改和扩充的版本 css:是一套样式语言,样式表,用来描述xml和html文件样式的呈现: 设备像素:是图片在设备上显示的 ...

  9. noi.ac#228 book

    分析 代码 #include<bits/stdc++.h> using namespace std; #define int long long const int inf =1e18; ...

  10. P2258子矩阵

    传送 一道看起来就很暴力的题. 这道题不仅暴力,还要用正确的姿势打开暴力. 因为子矩阵的参数有两个,一个行一个列(废话) 我们一次枚举两个参数很容易乱对不对?所以我们先枚举行,再枚举列 枚举完行,列, ...