1.3 eureka+ribbon,完成服务注册与调用,负载均衡源码追踪

chatgpt/2023/9/27 5:51:37

本篇继先前发布的1.2 eureka注册中心,完成服务注册的内容

目录

环境搭建

采用eureka+ribbon的方式,对多个user服务发送请求,并实现负载均衡

负载均衡原理

负载均衡源码追踪

负载均衡策略

如何选择负载均衡策略?

饥饿加载

复制(补充)


环境搭建

给order模块和user模块建立独立的数据库,使用mybatis访问数据库

 user模块编写接口根据id获取用户信息:

返回样例:

order模块编写接口根据id获取订单信息以及对应的用户信息:

返回样例: 

采用eureka+ribbon的方式,对多个user服务发送请求,并实现负载均衡

根据1.2 eureka注册中心,完成服务注册将服务注册至euraka,注册两个user服务(复制方法在末尾)

 通过浏览器访问euraka,可以看到注册了两个user实例

 改写order模块接口,将实际ip:端口,修改为服务名(通过服务名访问)

 在RestTemplate的bean上添加@LoadBalanced注解,实现负载均衡

 重启服务,访问order模块接口10次

 可以看到,user服务被调用了5次

user2服务也被调用了5次

user和user2服务都被调用了5次,实现了使用eureka注册实例,ribbon负载均衡访问。

负载均衡原理

        负载均衡流程简要:

        某服务发出请求,被Ribbon拦截,Ribbon从eureka中拉取对应服务名称的服务列表,找到服务名对应的访问ip端口,经过负载均衡处理,发出真实的带ip端口的请求。如下图

负载均衡源码追踪

        在前面提到过,某服务发出请求,被Ribbon拦截,即LoadBalancerInterceptor,这个类会在对请求进行拦截,然后从eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

查看这个类,实现了客户端http请求拦截器接口 

在这个接口里有一个方法 

LoadBalancerInterceptor类自然是重写了intercept方法,在这里打个断点。 

发送请求,可以看到,程序在这里停止了,证明这个请求确实被拦截了

 可以看到刚刚发送的请求地址

 继续,能看到服务名称被获取:usersvice

拿到了服务名称,按照流程,应该要找eureka获取服务列表了

这里已经看到了ribbon的字眼了

服务名称被交给了这个方法,步进查看

 步入

 可以看到,已经获取了usersvice的两个服务的ip和端口了,即获取了服务列表。接下来就该到负载均衡了

 步入

 步入

步过到此,看到chooseServer方法,选择服务,步入

进入 chooseServer,步过到choose,注意rule(rule可是规则的意思啊,猜测以下,是负载均衡的规则)

 点开这个rule查看, 看到IRule,查看IRule的实现类

 可以看到几个熟悉的字眼,Random(随机),RoundRobin(轮询),说明找对了 

再回来看这里的rule,是ZoneAvoidanceRule,是某种规则

 继续,执行返回到刚刚的方法,发现已经选择了 localhost:8081 ip和端口

 接下来就是一路返回,最后发出真实的ip和端口的请求咯

负载均衡策略

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

如何选择负载均衡策略?

非常简单,在配置类配置ribbon的策略就行

方式1:定义IRule的bean,返回策略规则

@Bean
public IRule randomRule(){return new RandomRule();
}

方法2:配置文件配置策略规则

userservice: #给某个微服务配置负载均衡规则ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

饥饿加载

当第一次访问服务的时候,由于Ribbon默认使用懒加载,导致时间会很长。

可以使用饥饿加载,服务一启动就加载,降低第一次的访问时耗、

如何配置饥饿加载?

  修改配置文件:

ribbon:eager-load:enabled: trueclients: userservice

复制(补充)

点击 Copu Configuration

 Name和端口都要改,完成点击apply

 

可以看到,已经复制成功

文章参考、图片来源:

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5312828.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

20.2 HTML 常用标签

1. head头部标签 <head>标签用于定义网页的头部, 其中的内容是给浏览器读取和解析的, 并不在网页中直接显示给用户. <head>标签通常包含以下一些常见的子标签: - <title>: 定义网页的标题, 在浏览器的标题栏或标签页上显示. - <meta>: 用于设置网页的…

ORB_SLAM3 TrackReferenceKeyFrame

TrackReferenceKeyFrame 使用条件&#xff1a; 运动模型为空并且imu未初始化&#xff0c;说明是刚初始化完第一帧跟踪&#xff0c;或者已经跟丢了当前帧和重定位帧间隔很近&#xff0c;用重定位帧来恢复位姿恒速云端模型跟踪失败 1.计算当前帧的描述子的Bow向量 mCurrentFr…

在linux上面部署activemq

1、下载 网址&#xff1a;ActiveMQ 注意&#xff1a;新版本5.17起 要求jdk11, 5.16兼容jdk8, 所以&#xff0c;确保已经安装 java11 或以上的版本 这里安装较新版&#xff1a;5.18.2&#xff0c;已经安装了java17 如何安装jdk17,请详见我的另一篇文章&#xff1a;linux…

开源Blazor UI组件库精选:让你的Blazor项目焕然一新!

今天给大家推荐一些开源、美观的Blazor UI组件库&#xff0c;这些优秀的开源框架和项目不仅能够帮助开发者们提高开发效率&#xff0c;还能够为他们的项目带来更加丰富的用户体验。 注&#xff1a;排名不分先后&#xff0c;都是十分优秀的开源框架和项目 ​Ant Design Blazor…

刷题day12

题目一 给定一个只包含正整数的数组arr&#xff0c;arr中任何一个子数组sub,一定都可以算出(sub累加和&#xff09;*&#xff08;sub中的最小值&#xff09;是什么&#xff0c;那么所有子数组中&#xff0c;这个值最大是多少&#xff1f; 啊 假如说有这么一个数组 3 4 5 6 3 2…

PHP: 开发入门macOS系统下的安装和配置

安装Homebrew 安装 ~~友情提示&#xff1a;这个命令对网络有要求&#xff0c;可能需要翻墙或者用你的手机热点试试&#xff0c;或者把DNS换成&#xff08;114.114.114.114 和 8.8.8.8&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

一份热乎乎的字节面试真题

一份热乎乎的字节面试真题 说说Redis为什么快 基于内存存储实现 内存读写是比在磁盘快很多的&#xff0c;Redis基于内存存储实现的数据库&#xff0c;相对于数据存在磁盘的MySQL数据库&#xff0c;省去磁盘I/O的消耗。 高效的数据结构 Mysql索引为了提高效率&#xff0c;选…

我总结的接地概念,为什么水泥大地是导体,为什么要接地,TT和TN供电系统等

我总结的接地概念&#xff0c;为什么水泥大地是导体&#xff0c;为什么要接地&#xff0c;TT和TN供电系统等 wxleasyland 个人参考网上资料理解的相关接地的问题&#xff0c;可能会有不对的地方&#xff0c;仅供参考。 主要参考了大神的&#xff1a;《浅谈接地》https://zhuan…
推荐文章