您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
SpringCloud之Ribbon负载均衡的入门操作
 
作者:小鱼吃猫
  2136  次浏览      16
 2020-8-7
   
 
编辑推荐:
本文主要介绍了如何使用Ribbon进行负载均衡,Ribbon的集成,创建,最后到测试的一个整体步骤,希望对您的学习有所帮助。
本文来自于博客园,由火龙果软件Alice编辑、推荐。

使用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默认使用的是轮询算法,即对相同的服务提供者进行挨个轮询,这样,就能会让每一个服务提供者都被访问一次了。

 
   
2136 次浏览       16
相关文章

企业架构、TOGAF与ArchiMate概览
架构师之路-如何做好业务建模?
大型网站电商网站架构案例和技术架构的示例
完整的Archimate视点指南(包括示例)
相关文档

数据中台技术架构方法论与实践
适用ArchiMate、EA 和 iSpace进行企业架构建模
Zachman企业架构框架简介
企业架构让SOA落地
相关课程

云平台与微服务架构设计
中台战略、中台建设与数字商业
亿级用户高并发、高可用系统架构
高可用分布式架构设计与实践
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]
 
最新文章
大数据平台下的数据治理
如何设计实时数据平台(技术篇)
大数据资产管理总体框架概述
Kafka架构和原理
ELK多种架构及优劣
最新课程
大数据平台搭建与高性能计算
大数据平台架构与应用实战
大数据系统运维
大数据分析与管理
Python及数据分析
更多...   
成功案例
某通信设备企业 Python数据分析与挖掘
某银行 人工智能+Python+大数据
北京 Python及数据分析
神龙汽车 大数据技术平台-Hadoop
中国电信 大数据时代与现代企业的数据化运营实践
更多...