Java--SpringCloud-6-Netflix-6-Ribbon

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 上篇学习Zuul的时候,点开pom发现它是依赖客户端负载平衡 (Ribbon)和断路器 (Hystrix)实现的,今天来学习下Ribbon。什么是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 上,如图:

image.png

二、建立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

image.png

再次刷新

image.png

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

三、策略直接看源码把

image.png

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

直接网上搜了一个说明:

image.png

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

@BeanpublicIRuleiRule(){
returnnewRandomRule();
}

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

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

image.png

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

image.png

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


总结:

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



END

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
前端开发 数据可视化 JavaScript
基于React的简易数据可视化图表库集成与应用
基于React的简易数据可视化图表库集成与应用
266 1
|
存储 人工智能 大数据
云计算平台:AWS、Azure和Google Cloud的比较与选择
在当今数字化时代,云计算平台成为了企业和个人的首选。本文将重点比较三大主流云计算平台:AWS、Azure和Google Cloud,从性能、功能、可用性以及定价等方面进行综合评估,帮助读者更好地选择适合自己需求的云计算平台。
element-plus 树形控件结合下拉列表
要将Element Plus的Tree控件与下拉列表结合起来,可以使用Element Plus的Select控件和Tree控件的插槽来实现。
767 0
|
前端开发 UED 开发者
颠覆你的前端知识:防抖与节流的区别及实战解析!
【8月更文挑战第23天】在Web前端开发中,处理用户界面交互产生的事件可能会影响性能。为此,我们有两种优化方法:防抖(debounce)和节流(throttle)。防抖确保函数仅在事件停止触发一段时间后执行一次,适用于如搜索自动补全场景。而节流则确保函数按固定时间间隔执行,不管用户操作频率如何。本篇技术博客将深入解析两者差异并提供示例代码,帮助开发者更好地理解和应用这些技巧以提升应用性能和用户体验。
484 0
|
存储 算法 Java
为什么重写 equals 方法时必须同时重写 hashCode 方法?
本文探讨了 Java 中 `hashCode` 方法的作用及其与 `equals` 方法的关系,解释了为什么重写 `equals` 方法时必须同时重写 `hashCode` 方法,并提供了如何正确重写 `hashCode` 方法的示例。
225 2
|
存储 Kubernetes Docker
docker-compose转化为pod配置文件
docker-compose转化为pod配置文件
|
SQL OLAP 数据库
OceanBase怎么样
【8月更文挑战第9天】OceanBase怎么样
358 4
|
缓存 Ubuntu 前端开发
在Ubuntu上手动与自动启动Nginx的踩坑经历、以及重启服务
本文分享了作者在Ubuntu系统上手动和自动启动Nginx服务的踩坑经历,包括创建启动脚本、解决依赖问题、配置服务自动启动以及通过命令行管理Nginx服务的方法。
813 0
在Ubuntu上手动与自动启动Nginx的踩坑经历、以及重启服务
|
Ubuntu 安全 Linux
选择合适的Linux内核版本
【8月更文挑战第9天】选择合适的Linux内核版本
834 2
|
存储 负载均衡 关系型数据库
分布式架构|打造高效、稳定、灵活的现代IT基石
分布式架构|打造高效、稳定、灵活的现代IT基石
581 1