使用Ribbon进行负载均衡

在使用Ribbon之前,我们先想一个之前的问题,之前我们将服务提供者注册进了eureka注册中心,但是在消费者端,我们还是使用的restTemplate调用的时候,其中写的还是http://localhost:8001这样的调用方式,是不是有一些不妥呢?是不是应用像dubbo那样,使用服务名进行调用呢?不然,我们使用注册中心有什么用呢?

好的呢,我们先保留这个思考 。来进入Ribbon的学习

什么是Ribbon?

Ribbon [ˈrɪbən] ,是SpringCloud Netflix中的一个关于客户端的负载均衡插件。

主要解释如下:

  • 这个客户端主要是指服务消费者,也就是说,这个插件是用在消费者端的,它自己会根据一些算法对相同服务的提供者(也就是这几个服务提供者的application.name要相同)进行甄别,自己决定我要访问哪一个服务者。
  • 而Nginx是整个服务器的负载均衡,当浏览器等设备的访问请求进来后,它会根据自身的配置,进行服务的路径选择。

Ribbon的集成(客户端,即消费者)

上边说了,是在消费端进行的负载均衡,所以要修改cousumer端,但为了方便学习,我就新创建了一个项目,demo3-ribbon-consumer,代码和之前的没什么太大的变化。而且,要有多个相同名称的服务提供者才能进行负载均衡,才能在多个服务提供者之前进行选择吗?这就好比,你当了皇上,但是皇宫只有皇后一个人,那还有的选吗?哈哈,这车开的有点快了啊!

同样,我们要使用服务名进行调用,而不是使用localhost进行调用了。那是不是也要集成eureka注册中心呢?只有这样,才能在注册中心找到的啊

  • 之前说过的使用SpringCloud组件的两步,第一步,引入依赖(注意,是对Consumer)
<!--ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency> <!--下边这两个是ribbon所依赖的-->
<!--eureka的客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency> <!--SpringCloud的配置-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  • 在启动类上添加对应的注解
@EnableEurekaClient //eureka的客户端
  • 修改application.yml
server:
port: 80 # 下边加eureka的配置就是为了能够在eureka注册中心中发现服务提供者
eureka:
client:
register-with-eureka: false
service-url:
# 使用的eureka集群,上一次配置过的
defaultZone: http://eureka1:7001/eureka/,http://eureka2:7002/eureka/,http://eureka3:7003/eureka/
  • 在配置RestTemplate的bean的配置类上开启负载均衡
  	@Bean
@LoadBalanced //开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
  • Contoller类,暂时修改如下:
    @GetMapping("demo3/consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
//远程调用provider中的接口,这回使用的这个提供者的名称
return restTemplate.getForObject("http://demo3-ribbon-provider/demo3/provider/hello/"+id,String.class);
}

创建多个相同名称的服务提供者

上边说了,这个一定是要有的。只有当你有选择的时候,你才能做出选择。这个步骤太过简单了,只写其中一个的代码,其余的自己复制就可以了(module名称为demo3-ribbon-provider-800x)。

  • pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
  • application.yml
server:
#每个服务提供者对应的端口号肯定要不同
port: 8001 spring:
application:
# 这个应用的名称,用来注册在注册中心的名称
name: demo3-ribbon-provider eureka:
client: #客户端注册进eureka服务列表内
service-url:
# eureka集群的注册地址
defaultZone: http://eureka1:7001/eureka,http://eureka2:7002/eureka,http://eureka3:7003/eureka
instance:
instance-id: demo3-ribbon-provider-8001
prefer-ip-address: true #访问路径可以显示IP地址
  • Controller类
@RestController
public class HelloController { @GetMapping("demo3/provider/hello/{id}")
public String hello(@PathVariable("id") Integer id) {
return "这是来自提供者的一条消息,你传过来的消息" + id+"\n\t你这次访问的服务提供者8001";
}
}
  • 主启动类加上对应的注解
@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@EnableDiscoveryClient//这个表明这个服务能被发现,也就是消费者可以调用它
public class Demo3RibbonProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(Demo3RibbonProvider_8001.class, args);
}
}

最后,齐活。进行测试

启动三个eureka集群、三个相同名称的服务提供者、一个消费者。一共七个服务,七个进程,不行,我的电脑已经开始向我示威了,来看一下我的电脑的内存。我的是8G内存,Idea已经占了我3G多了。

  • Eureka集群的图片

  • 连续三次访问http://localhost/demo3/consumer/hello/99的结果

从上边结果可以看出来,三次连续访问竟然结果不一样,这就是ribbon启动的负载均衡算法了啊。至于为什么是这样?

Ribbon内置的负载均衡算法

Ribbon默认使用的是轮询算法,即对相同的服务提供者进行挨个轮询,这样,就能会让每一个服务提供者都被访问一次了。当然,Ribbon的负载均衡算法还支持自定义,下期再说喽!

更多关于SpringCloud知识以及项目代码,请关注微信公众号“小鱼与Java”获取

SpringCloud之Ribbon负载均衡的入门操作的更多相关文章

  1. spring-cloud配置ribbon负载均衡

    spring-cloud配置ribbon负载均衡 ribbon提供的负载均衡就是开箱即用的,简单的不能再简单了 为了顺利演示此demo,你需要如下 需要提前配置eureka服务端,具体看 https: ...

  2. SpringCloud系列——Ribbon 负载均衡

    前言 Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制.我们在上篇(猛戳:SpringCloud系列——Feign 服务调用)已经实现了多个服务之间的Feign调用 ...

  3. 浅谈SpringCloud (三) Ribbon负载均衡

    什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...

  4. SpringCloud:Ribbon负载均衡

    1.概述 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端       负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客 ...

  5. 四(2)、springcloud之Ribbon负载均衡

    2.Ribbon负载均衡 ​ Ribbon在工作时分成两步第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server. 第二步再根据用户指定的策略,在从server取到的 ...

  6. Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)

    什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机ser ...

  7. SpringCloud之Ribbon负载均衡及Feign消费者调用服务

    目的: 微服务调用Ribbon Ribbon负载均衡 Feign简介及应用 微服务调用Ribbon Ribbon简介 1. 负载均衡框架,支持可插拔式的负载均衡规则 2. 支持多种协议,如HTTP.U ...

  8. SpringCloud之Ribbon负载均衡配置

    一.负载均衡解决方案分类及特征 业界主流的负载均衡解决方案有: 1.1 集中式负载均衡 即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责 ...

  9. Spring-Cloud之Ribbon负载均衡-3

    一.负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式.一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix .另一种是将负载均衡逻辑以代码的形式封装到服 ...

随机推荐

  1. W3C 带来了一个新的语言

    2019年12月5日,W3C 宣布: WebAssembly 核心规范 正式成为 Web 官方标准. 继 HTML, CSS, JavaScript 之后,WebAssembly 成为了第4个 Web ...

  2. 【java面试】网络通信篇

    1.说一下HTTP协议 HTTP协议是超文本传输协议,属于应用层协议,规定了客户端与服务端传输数据的格式:它是无状态的,对于前面传送过的信息没有记录:请求方式有GET,POST,HEAD,PUT,DE ...

  3. 创建过滤扩展方法 Creating Filtering Extension Methods 精通ASP-NET-MVC-5-弗瑞曼 Listing 4-17

  4. Kafka源码工程examples项目配置log4j

    examples项目启动想知道有哪些错误,通过日志了解代码执行逻辑,但是启动SimpleConsumerDemo了报错如下: log4j.proproties也配置了 log4j.proproties ...

  5. 【编程的乐趣-用python解算法谜题系列】谜题一 保持一致

    谜题一 保持一致 谜题 假设有一大群人排队等待观看棒球比赛.他们都是主场球迷,每个人都戴着队帽,但不是所有人都用同一种戴法,有些人正着戴,有些人反着戴. 假定你是保安,只有在全组球迷帽子戴法一致时才能 ...

  6. C#系列之算数运算符(四)

    今天,我将做一个算术运算符++和--的笔记以及一元运算符和二元运算符同时存在怎么计算的笔记 ++:分为前加加和后加加,但是最后结果都是+1: --:分为前减减和后减减,但是最后结果都是-1: 例如: ...

  7. 透彻分析和解决一切javaWeb项目乱码问题

    前言 乱码是我们在程序开发中经常碰到且让人头疼的一件事,尤其是我们在做javaweb开发,如果我们没有清楚乱码产生的原理,碰到乱码问题了就容易摸不着头脑,无从下手. 乱码主要出现在两部分,如下: 第一 ...

  8. FPGA基础知识关键点摘要

    FPGA基础知识关键点摘要 一.组合逻辑和时序逻辑的区别:组合逻辑与输入直接实时相关,时序逻辑还必须在时钟上升沿出发后输出新值,有没有时钟输入是他们最大的区别!组合时序容易出现竞争冒险现象出现亚稳态, ...

  9. 认识Git与GitHub

    Git介绍 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.相比CVS.SVN等版本控制工具,Git更加优秀,功能也更加强大.但是相对也难学. 使用Git来管理 ...

  10. 2018icpc南京现场赛-G Pyramid(打标找规律+逆元)

    题意: 求n行三角形中等边三角形个数,图二的三角形也算. n<=1e9 思路: 打表找下规律,打表方法:把所有点扔坐标系里n^3爆搜即可 打出来为 1,5,15,35,70,126,210.. ...