这里有新鲜出炉的精品教程,程序狗速度看过来!
Spring 是什么呢?首先它是一个开源的项目,而且目前非常活跃;它是一个基于 IOC 和 AOP 的构架多层 j2ee 系统的框架,但它不强迫你必须在每一层 中必须使用 Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的 MVC,对不同的数据访问技术提供了统一的接口,采用 IOC 使得可以很容易的实现 bean 的装配,提供了简洁的 AOP 并据此实现 Transcation Managment,等等
下面小编就为大家带来一篇 spring cloud 之 客户端负载均衡 Ribbon 深入理解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
一、负载均衡
负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行,例如 web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
1、服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最后将数据返回给客服端。(nginx)
2、客服端负载均衡:基于客户端的负载均衡,简单的说就是在客户端程序里面,自己设定一个调度算法,在向服务器发起请求的时候,先执行调度算法计算出向哪台服务器发起请求,然后再发起请求给服务器。
基于客户端负载均衡的特点:
由客户端内部程序实现,不需要额外的负载均衡器软硬件投入。
程序内部需要解决业务服务器不可用的问题,服务器故障对应用程序的透明度小。
程序内部需要解决业务服务器压力过载的问题。
二、Ribbon 实现客户端的负载均衡
我们使用 spring boot 来测试。
pom 文件:
- <project xmlns="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>
- <groupId>com.jalja.org</groupId>
- <artifactId>spring-consumer-server-ribbon</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>1.5.2.RELEASE</version>
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- </properties>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>Camden.SR4</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-ribbon</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- </dependencies>
- </project>
application.yml
- stores: ribbon: listOfServers: www.baidu.com,
- www.jalja.org,
- www.163.com
Ribbon 的负载均衡策略
1、RoundRobinRule(轮询模式)
public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin 方式轮询选择 server 轮询 index,选择 index 对应位置的 server 该策略也是 ribbon 的默认策略
SpringCloudRibbonApplication.java
- @SpringBootApplication
- @EnableDiscoveryClient
- @RestController
- public class SpringCloudRibbonApplication {
- public static void main(String[] args) {
- SpringApplication.run(SpringCloudRibbonApplication.class, args);
- }
- @Autowired
- private LoadBalancerClient loadBalancer;
- @RequestMapping(value="static")
- public String staticRibbon(){
- ServiceInstance instance = loadBalancer.choose("stores");
- URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
- System.out.println(storesUri);
- return "static";
- }
- }
- 连续请求6次执行结果:
- http://www.baidu.com:80
- http://www.jalja.org:80
- http://www.163.org:80
- http://www.baidu.com:80
- http://www.jalja.org:80
- http://www.163.org:80
2、RandomRule(随机策略)
public class RandomRule extends AbstractLoadBalancerRule 随机选择一个 server 在 index 上随机,选择 index 对应位置的 server。
在配置文件 application.yml 加入
- NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- stores:
- ribbon:
- listOfServers: www.baidu.com,www.jalja.org,www.163.org
- #随机
- NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
在 SpringCloudRibbonApplication.java 中加入
- @Bean
- public IRule ribbonRule() {
- return new RandomRule();//这里配置策略,和配置文件对应
- }
执行 6 次的结果:
- http://www.baidu.com:80
- http://www.baidu.com:80
- http://www.baidu.com:80
- http://www.163.org:80
- http://www.baidu.com:80
- http://www.jalja.org:80
3、BestAvailableRule(并发量)
public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 选择一个最小的并发请求的 server 逐个考察 Server,如果 Server 被 tripped 了,则忽略,在选择其中 ActiveRequestsCount 最小的 server
在配置文件 application.yml 加入
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule
在 SpringCloudRibbonApplication.java 中加入
- @Bean
- public IRule ribbonRule() {
- return new BestAvailableRule();//这里配置策略,和配置文件对应
- }
执行 6 次的结果:
- http://www.baidu.com:80
- http://www.baidu.com:80
- http://www.baidu.com:80
- http://www.baidu.com:80
- http://www.baidu.com:80
- http://www.baidu.com:80
4、AvailabilityFilteringRule(服务器状态)
public class AvailabilityFilteringRule extends PredicateBasedRule 过滤掉那些因为一直连接失败的被标记为 circuit tripped 的后端 server,并过滤掉那些高并发的的后端 server(active connections 超过配置的阈值) 使用一个 AvailabilityPredicate 来包含过滤 server 的逻辑,其实就就是检查 status 里记录的各个 server 的运行状态
5、WeightedResponseTimeRule(根据响应时间)
public class WeightedResponseTimeRule extends RoundRobinRule 根据响应时间分配一个 weight,相应时间越长,weight 越小,被选中的可能性越低。 一个后台线程定期的从 status 里面读取评价响应时间,为每个 server 计算一个 weight。Weight 的计算也比较简单 responsetime 减去每个 server 自己平均的 responsetime 是 server 的权重。当刚开始运行,没有形成 statas 时,使用 roubine 策略选择 server。
6、RetryRule(根据策略 + 重试)
public class RetryRule extends AbstractLoadBalancerRule 对选定的负载均衡策略机上重试机制。
在一个配置时间段内当选择 server 不成功,则一直尝试使用 subRule 的方式选择一个可用的 server
7、ZoneAvoidanceRule(Zone 状态 + 服务状态)
public class ZoneAvoidanceRule extends PredicateBasedRule
复合判断 server 所在区域的性能和 server 的可用性选择 server
使用 ZoneAvoidancePredicate 和 AvailabilityPredicate 来判断是否选择某个 server,前一个判断判定一个 zone 的运行性能是否可用,剔除不可用的 zone(的所有 server),AvailabilityPredicate 用于过滤掉连接数过多的 Server。
4、5、6、7 这些策略使用方式与上述方式相同这里不在演示
以上这篇 spring cloud 之 客户端负载均衡 Ribbon 深入理解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 PHPERZ。
来源: http://www.phperz.com/article/17/0818/338310.html