IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 5、 负载均衡 Spring Cloud Ribbon -> 正文阅读

[Java知识库]5、 负载均衡 Spring Cloud Ribbon

Ribbon 简介

什么是Ribbon?

Ribbon是Netflix发布的负载均衡器,有助于控制HTTP客户端行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于负载均衡算法,自动帮助服务消费者请求。

Ribbon默认提供的负载均衡算法:轮询(默认),随机,重试法,加权。当然,我们可用自己定义负载均衡算法

多个服务集群

如果想要做负载均衡,我们的服务至少2个以上,为了演示负载均衡案例,我们可以复制2个工程(去电脑目录操作也行),分别为user-provideruser-provider-demo1,完成后:

启动eureka-serveruser-provideruser-provider-demo1user-consumer,启动前先注释掉eureka-server中的自我保护关闭和剔除服务配置。

开启负载均衡↓

(1)客户端开启负载均衡

Eureka已经集成Ribbon,所以无需引入依赖,要想使用Ribbon,直接在RestTemplate的配置方法上添加@LoadBalanced注解即可

修改user-consumercom.sen.UserConsumerApplication启动类,在restTemplate()方法上添加@LoadBalanced注解,代码如下:

?

(2)采用服务名(user-provider不要写大写,写小写跟配置文件中配置的服务名保证一致)访问配置

修改user-consumercom.sen.controller.UserController的调用方式,不再手动获取ip和端口,而是直接通过服务名称调用,代码如下:

//代码如下,注意服务名不要在Java代码写大写,然后下面的配置负载均衡算法又写小写,否则算法失效,统一小写
String url = "http://user-provider/user/find/"+id;
System.out.println(url);
User user = restTemplate.getForObject(url, User.class);
return user;

(3)测试

启动并访问测试<http://localhost:18082/consumer/1>,可以发现,数据会在2个服务之间轮询切换。

其他负载均衡策略配置,把下面配置拷贝到消费者的配置文件即可↓

配置修改轮询策略:Ribbon默认的负载均衡策略是轮询,通过如下

注意,user-provider不建议大写,建议小写,如大写要跟java代码里面保持一致,否则会造成配置的算法失效还是轮询↓

#修改服务地址轮询策略,默认是轮询,可配置随机等↓
user-provider:
  ribbon:
    #轮询
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
    #随机算法
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    #重试算法,该算法先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重试,获取可用的服务↓
    #可以在idea软件中按ctr shift n或者t搜对应的类进行其中一种算法涉及时间的说明↑
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
    #加权法,会根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信息足够会切换到自身规则。
    #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

SpringBoot可以修改负载均衡规则,配置为ribbon.NFLoadBalancerRuleClassName

格式服务名称.ribbon.NFLoadBalancerRuleClassName

另外,负载均衡算法除了配置文件指定,也可以在启动类配置相关Java类对象

@Bean
public IRule robbinRule(){//从中可以看出,忘了上面的负载均衡策略实现类,可以查看IRule接口的实现类查找↑
    return new RandomRule();
}

负载均衡源码跟踪探究

为什么只输入了Service服务名称比如user-provider就可以访问了呢?不应该需要获取ip和端口吗?

负载均衡器动态的从Eureka服务注册中心中获取服务提供者的访问地址(host、port)

显然是有某个组件根据Service服务名称,获取了服务实例ip和端口。这个组件拦截器是LoadBalancerInterceptor

这个拦截器类会对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真正服务地址信息,替换服务id。

源码跟踪步骤:

打开LoadBalancerInterceptor类(搜类用ctr shift n或者ctr shift t),断点打入intercept方法中→继续跟入execute方法:发现获取了18081发端口的服务→点绿色按钮取消,看下一次,发现这一次访问时端口为18083的服务→通过代码断点内容判断,果然是实现了负载均衡

小结

  • Ribbon的负载均衡算法应用在客户端(Http请求),只需要提供服务列表,就能帮助消费端自动访问服务端,并通过不同算法实现负载均衡。

  • Ribbon的轮询、随机算法配置:在application.yml中配置 服务名称.ribbon.NFLoadBalancerRuleClassName

  • 负载均衡的切换:在LoadBalancerInterceptor中获取服务的名字,通过调用RibbonLoadBalancerClient的execute方法,并获取ILoadBalancer负载均衡器,然后根据ILoadBalancer负载均衡器查询出要使用的节点,再获取节点的信息,并实现调用。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-09 20:33:44  更:2022-02-09 20:35:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:28:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码