SpringCloud-6-Netflix-6-Ribbon

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: SpringCloud Ribbon是SpringCloud基于Netfix Ribbon实现的一套客户端负载均衡工具。

上篇学习Zuul的时候,点开pom发现它是依赖客户端负载平衡 (Ribbon)和断路器 (Hystrix)实现的,今天来学习下Ribbon。

什么是Ribbon呢?

       SpringCloud Ribbon是SpringCloud基于Netfix Ribbon实现的一套客户端负载均衡工具。

负载均衡分为两种:

集中式LB:(中间件决定调用哪个服务提供节点)

       在服务提供端和请求端之间有一个中间件,负责把请求端的访问请求通过某种策略转发至服务的提供端。比如F5、nginx等。

进程内LB:(客户端决定调用哪个服务提供节点)

           就是在请求端决定调用哪个提供端。消费方从服务注册中心获知哪些地址可用,然后再从这些地址中选出一个合适的服务器,如ribbon。

       在项目中,客户端发起请求后,通过ribbon这个类库,根据给定的策略去注册中心的地址列表中获取到服务提供端的地址,这就是Ribbon的作用。

       Ribbon与Eureka整合后,客户端能够可以直接通过微服务名称调用服务,而不用关心地址和端口,和上篇的Zuul一样哈,因为Zuul就是基于ribbon实现的。

       用代码实现一下请求客户端通过Ribbon去实现调用一个服务的两个节点,并配置负载均衡策略。

一、提供两个服务节点,代码就和eureka client一样,不过发布两个新服务

1.发布

@RequestMapping("/app")
publicStringadmin() {
return"application-one:8005";
}
// 配置文件改变下端口server.port=8005@RequestMapping("/app")
publicStringadmin() {
return"application-two:8006";
}
server.port=8006

2.配置文件

#注意spring.application.name要一样spring.application.name=applicationserver.port=8005#instance-id不能一样eureka.instance.instance-id=application-oneeureka.client.service-url.defaultZone=http://172.23.13.15:8881/eureka/eureka.client.register-with-eureka=trueeureka.client.fetch-registry=true

       确保两个节点都注册到eureka Server 上,如图:

图片

二、建立Ribbon子项目

1.pom.xml

<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.xing</groupId><artifactId>StudyCloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>StudyCloud-ribbon</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!--web组件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--eurekaclient组件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--加入ribbon的依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency></dependencies></project>

2.启动类,发布服务也写到这了

packagecom.xing.study.cloud.ribbon;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;
importorg.springframework.cloud.netflix.eureka.EnableEurekaClient;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.RestController;
importorg.springframework.web.client.RestTemplate;
/*** @author rt*/@RestController@SpringBootApplication@EnableEurekaClient@EnableDiscoveryClientpublicclassRibbonApplication {
finalRestTemplaterestTemplate;
publicRibbonApplication(RestTemplaterestTemplate) {
this.restTemplate=restTemplate;
    }
@RequestMapping(value="/ribbon", method=RequestMethod.GET)
publicStringribbon(){
returnrestTemplate.getForEntity("http://application/app", String.class).getBody();
    }
publicstaticvoidmain(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
    }
}

       注意用EnableDiscoveryClient注解启动。

3.配置@LoadBalanced启动负载均衡

packagecom.xing.study.cloud.ribbon;
importorg.springframework.cloud.client.loadbalancer.LoadBalanced;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.client.RestTemplate;
/*** @author rt*/@ConfigurationpublicclassRibbonConfig {
@Bean@LoadBalancedpublicRestTemplaterestTemplate() {
returnnewRestTemplate();
    }
}

4.启动Ribbon项目,然后访问/ribbon,看看能不能调用到application

再次刷新

       完美!多次刷新可以直观的看到会分别调用两个服务节点,这是因为默认的策略就是轮询,下面我们看下有哪些策略。

三、策略直接看源码把

ffdef6df1bb95d0f27ede33cb76aca4b.png

       IRule接口的实现类中提供了多个策略。

直接网上搜了一个说明:


1.要使用对应的策略,直接这么写就行:

@BeanpublicIRuleiRule(){
returnnewRandomRule();
}

       上面这个配置了随机策略,重启后测试不停刷新就可以看到不会是两个节点轮询啦,换成了随机调用。

2.自定义策略直接继承AbstractLoadBalancerRule抽象类就行

661d4123a6f21507b1d0ceda934835ea.png

       害,我是写不出啥好策略,直接拷贝轮询的源码测试一下

4c6d7d950227ad6e2ed1f8237248833d.png

       测试发现不随机了,变回了轮询策略,只不过这回是我自定义的轮询策略。

总结:

       在客户端决定调用哪个注册中心地址列表中的服务,从而在客户端实现了负载均衡。

END

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
35 13
|
4月前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。
|
4月前
|
Java Maven 微服务
Spring Cloud Netflix 之 Eureka
Spring Cloud Netflix Eureka是服务发现组件,由Netflix开发,Spring Cloud集成为微服务治理工具。Eureka采用客户端/服务器架构,包含Eureka Server(服务注册中心)和Eureka Client(服务提供者和服务消费者)。服务提供者注册到Eureka Server,服务消费者通过它查找并调用服务。
|
5月前
Springcloud-ribbon和hystrix配置
Springcloud-ribbon和hystrix配置
38 0
|
负载均衡 网络协议 算法
【springcloud】Ribbon详解
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。简单点说,其主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接,权重等)去连接这些机器。
177 0
|
12月前
|
负载均衡 算法 网络协议
08SpringCloud - Ribbon介绍
08SpringCloud - Ribbon介绍
56 0
|
12月前
|
缓存 负载均衡 Java
原来这就是大名鼎鼎的SpringCloud Ribbon
大家好,我是三友~~ 本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码。本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果不把Ribbon好好讲清楚,那么有些Ribbon的细节理解起来就很困难,所以我还是打算单独写一篇文章来剖析Ribbon的源码,这样在讲Feign整合Ribbon的时候,我就不再赘述这些细节了。
|
12月前
|
负载均衡 算法 Java
springcloud netflix ribbon 使用
springcloud netflix ribbon 使用
99 0
|
负载均衡 算法
03、SpringCloud之Ribbon(netflix)学习笔记(二)
03、SpringCloud之Ribbon(netflix)学习笔记(二)
03、SpringCloud之Ribbon(netflix)学习笔记(二)