Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。

一、什么是负载均衡

  当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。

  负载均衡一般分为两种:硬件负载均衡(如F5)和软件负载均衡(Nginx),一般我们在项目中使用更多的是Nginx,硬件的负载均衡虽然强大,但是成本过高,不太适用于我们平常开发的项目。

二、Nginx与ribbon的区别

  我们在项目中,一般是用Nginx实现负载均衡,但是在spring cloud为我们提供了一个负载均衡的组件ribbon,我们就来看看这二者的区别:

  nginx:

  nginx是作为一个中间服务器,将所有的请求统一进行处理,通过负载均衡算法转发收到的请求到各个服务端,可以说nginx是服务端的负载均衡。

  nginx是服务端的负载均衡

  Ribbon:

  Ribbon是从eureka注册中心服务器端上获取已经注册的服务,如果有注册的服务中带有二个或者多个地址,那么就可以通过负载均衡算法实现负载均衡。 

  Ribbon是客户端的负载均衡

三、ribbon负载均衡的配置

  ribbon负载均衡实现需要开启四个微服务:

  1.注册中心服务(不在叙述)

  2.两个服务提供者的微服务(80端口与81端口)

  a.服务提供者的配置与spring cloud eureka客户端的配置相同,主要是两个微服务的配置文件中,服务的名称要一致:

###服务启动端口号
server:
port: 80
###服务名称(服务注册到eureka名称)
spring:
application:
name: producter
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka ---------------------------------------------------------------------------------
###服务启动端口号
server:
port: 81
###服务名称(服务注册到eureka名称)
spring:
application:
name: producter
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka

 b.在80和81项目中分别创建两个controller层访问

80端口的controller层

    @RestController
public class ServiceController { @GetMapping("/producteri")
public String sayHi(){
return "这是80端口的服务";
}
}

81端口的controller层 

    @RestController
public class ServiceController { @GetMapping("/producteri")
public String sayHi(){
return "这是81端口的服务";
}
}  

3.服务消费者

    a.导入maven依赖  

    <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

  b.消费端的yml文件  

###服务启动端口号
server:
port: 8080
###服务名称(服务注册到eureka名称)
spring:
application:
name: consumer
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka

  c.添加一个配置RibbonConfig类

    RibbonConfig类是微服务中消费者自动注入Ioc容器中的类。我们知道在服务调用端中,本身是没有任何业务逻辑的,只有通过RestTemplate的实例来获取微服务,如果我们之所以没有直接注入到controller层,就是因为我们添加了@LoadBalanced注解,实现一个负载均衡的成员属性。

    @Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

  c.定义个服务端请求,调用微服务

    @RestController
public class ClientController{ @Autowired
private RestTemplate restTemplate; @GetMapping("/consumer")
public String sayHi(){
return restTemplate.getForObject("http://producter",String.class);
}
}

  最后访问http://127.0.0.1:8080/consumer,可以看见测试结果

四、ribbon自带的负载均衡算法

ribbon为我们封装了7种负载均衡算法:

  1.BestAvailableRule:选择一个最小的并发请求的server
  2.AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)
  3.WeightedResponseTimeRule:根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。
  4.RetryRule:对选定的负载均衡策略机上重试机制。(RoundRobinRule的加强版,在轮训时发现某些服务无法连接,如果这些服务超过了设定的连接数,之后就会跳过这些服务进行轮训)
  5.RoundRobinRule:轮训(ribbon默认的算法)
  6.RandomRule:随机选中一个server
  7.ZoneAvoidanceRule:复合判断server所在区域的性能和server的可用性选择server

如何选择ribbon自带的算法:

   我们只需要指定IRule实现就可以,实现的类就是上面介绍7种算法的名字。

   在服务调用端中,RibbonConfig类文件下我们添加IRule的实现代码

@Bean
public IRule ribbonRule() {
return new RetryRule();//RetryRule就是我们上面介绍的7种算法,默认的实现是RoundRobinRule算法
}    

最新文章

  1. [总结] JDBC数据库操作
  2. 基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录
  3. 思维导图XMiand
  4. 为 Web 设计师准备的 25+ 款扁平 UI 工具包
  5. MySQL分区表(转)
  6. 阅读《RobHess的SIFT源码分析:综述》笔记
  7. oracle 物化视图及创建索引
  8. [微信小程序] 终于可以愉快的使用 async/await 啦
  9. SQL Server 2008对日期时间类型的改进
  10. [Java] 在 jar 文件中读取 resources 目录下的文件
  11. 原生JS实现图片轮播
  12. Linux 配置代理
  13. Centos7.5 部署postfix邮件系统
  14. MySQL 锁信息和事务
  15. python语法_算数运算+赋值运算符+比较运算符+逻辑运算符
  16. win10安装JDK
  17. [百家号]看完再也不会被坑!笔记本接口大揭秘:HDMI、DP、雷电
  18. 14 Zabbix Item类型之Simple checks类型
  19. blog 社会化评论插件 多说for china, disqus for global range
  20. 深度学习动手入门:GitHub上四个超棒的TensorFlow开源项目

热门文章

  1. win7系统安装sql2000数据库时没有反应,不出来安装界面?
  2. Android逆向之旅---静态分析技术来破解Apk
  3. 【CF1257D】Yet Another Monster Killing Problem【贪心】
  4. 为应用程序池 &#39;&#39;DefaultAppPool&#39;&#39; 提供服务的进程意外终止。进程 ID 是 &#39;&#39;xxx&#39;&#39;问题的解决方法
  5. Oracle命令行模式,批量执行SQL脚本
  6. 生产环境下,oracle不同用户间的数据迁移。第二部分
  7. day12—jQuery ui引入及初体验
  8. KEIL建立新唐MCU的工程时,移植官网程序报错变量未定义问题解决方法
  9. mysql-M-S-S模型 中继器 级联
  10. org.w3c.dom。 XML解析 练习