- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
SpringCloud已经删除了ribbon组件,所以需要手动导入依赖。(要学是因为很多项目业务已经使用了ribbon) 。
服务拉取的时候添加了@LoadBalanced注解,实现负载均衡 。
SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的.
那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081/user/1的呢?
为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口.
显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是 LoadBalancerInterceptor ,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id.
我们进行源码跟踪:
可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:
request.getURI()
:获取请求uri,本例中就是 http://user-service/user/8 originalUri.getHost()
:获取uri路径的主机名,其实就是服务id, user-service
this.loadBalancer.execute()
:处理服务id,和用户请求。 这里的 this.loadBalancer 是 LoadBalancerClient 类型,我们继续跟入.
继续跟入execute方法:
代码是这样的:
在刚才的代码中,可以看到获取服务使通过一个 getServer 方法来做负载均衡
我们继续跟入:
继续跟踪源码chooseServer方法,发现这么一段代码:
我们看看这个rule是谁:
这里的rule默认值是一个 RoundRobinRule ,看类的介绍:
这不就是轮询的意思嘛.
到这里,整个负载均衡的流程我们就清楚了.
SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:
基本流程如下:【重点】 。
默认设置是IRule接口下的 ZoneAvoidanceRule 类(根据就近区域Zone来轮询) 。
负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:
不同规则的含义如下:默认的实现就是ZoneAvoidanceRule,是一种轮询方案 。
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的
|
WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
RetryRule | 重试机制的选择逻辑 |
注意 ,一般用默认的负载均衡规则,不做修改.
通过定义IRule实现可以修改负载均衡规则,有两种方式: (二选一即可) 。
代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
优:配置灵活 劣:修改时需要重新打包 。
copy@Bean public IRule randomRule(){ return new RandomRule(); }
配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:【推荐】 。
优:直观,方便,修改后无需重新打包 劣:无法全局配置,需要对每个服务设置负责均衡规则 。
copyuserservice: # 给某个微服务配置负载均衡规则,这里是userservice服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
推荐修改为饥饿加载,在消费者的yaml中设置 。
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长.
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
copyribbon: eager-load: enabled: true #开启饥饿加载 clients: #指定饥饿加载的服务名称 - userservice - xxx
最后此篇关于Ribbon负载均衡(源码分析)的文章就讲到这里了,如果你想了解更多关于Ribbon负载均衡(源码分析)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
Office 2007/2010 团队的功能区荣誉是用户(菜单)的字体大小。 Windows Ribbon Framework功能区(由 MS Paint 和我的应用程序使用)忽略用户(即我的)字体首
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
当我启动一个新的 Excel Web 插件时,默认情况下空白项目有一个声明功能区的 MyAppName.xml 文件。该声明在 native Home Excel 选项卡下设置自定义组和自定义控件。
我想编写一个脚本(C# 或 AutoIT 或 VBScript .. 任何可行的),它应该 获取已打开的outlook应用程序的引用 遍历功能区以查找特定按钮 执行那个按钮点击 我该怎么做? 最佳答案
我想实现下面的图像,我可以使用的旧方法之一是将上面带有文本的贴纸保存为PNG,然后我用CSS将图像放置在盒子的顶部。 我不是专业的前端开发人员,但我想我可以用CSS3实现它。我的问题是如何用CSS3实
我在 API 网关和 Eureka 服务器上使用功能区作为负载平衡器。当客户端请求到达我的 API 网关时,它是每次都查询服务注册表以获取服务的可用实例,还是 Ribbon 将可用实例存储到其缓存中?
我有一个带有功能区 UI 的应用程序。在此 UI 中,存在一个带有附加菜单的按钮。我想要做的是从按钮处理程序访问菜单以动态添加和删除菜单项。 void CMyScrollView::OnMenuBut
前言 ribbon是一个客户端负载均衡器,它提供了对http和tcp客户端的行为的大量控制。我们在上篇(猛戳:springcloud系列——feign 服务调用)已经实现了多个服务之间的feign
ribbon简介 Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的 软件负载均衡算法 ,将 Netflix 的中间层服务连接在一起。Ribbon 客户端组件提供一系列完善的
我有 Fluent Ribbon 控件。功能区菜单项按键提示显示不正确, 之前, 之后, 我已经为功能区菜单固定了行高..如何解决这个问题,谢谢 这是我的代码:
我是 WPF 的新手,正在尝试使用功能区控件。 我在应用程序中有一个选项卡,并希望隐藏标题但仍显示选项卡本身。 我一直在尝试各种属性和样式,但我只能隐藏整个选项卡。 我试过:ribbontab 可见性
我正在尝试为动态菜单绑定(bind)功能区控件。 顶部的功能区选项卡是我的“真实”功能区选项卡。底部开始是手动构建的,我正在用它来验证
我一直在看网站http://wpf.codeplex.com/并发现功能区控件找到了我的需求。 我想知道它是否需要机器上的任何 Office 许可证等,或者只需要工具包 dll。 它是否需要 Win-
我正在尝试在 .Net 4.5 Framework 上开发一个带有 Ribbon Control 的 WPF 应用程序。据我所知,MSDN Ribbon Class现在包含在 Net 4.5 框架中,
开门见山。 CSS 功能区应该附加到右侧边栏 div,但由于我不知道的原因,它一直附加到左侧。我几乎尝试了所有方法,但无法弄清楚。对于对 CSS 有更高理解的人来说,这一定很容易..so.. 这是代码
我试图在右侧获得与右侧相同的 3d 阴影效果。 请看这个 fiddle : http://jsfiddle.net/tdf84nL7/ WOW [CSS] .ribbon { position:rel
我在 MFC 应用程序的功能区上有一个 CMFCRibbonUndoButton。单击其 ID 时,我有一个处理程序 (ON_COMMAND(ID_EDIT_UNDO, ...))。但是,当按钮也在快
我们希望使用 HTTPS 进行基于 Feign 和 Ribbon 的微服务通信。这些服务基于 Spring Boot,并且正确设置了 tomcat。这些实例使用 HTTPS URL 注册,并且在 Eu
大家好,我是三友~~ 前几天有个大兄弟问了我一个问题,注册中心要集成SpringCloud,想实现SpringCloud的负载均衡,需要实现哪些接口和规范。
我是一名优秀的程序员,十分优秀!