05-详解调用服务时负载均衡的配置及其原理

负载均衡

负载均衡的原理(通用)

@LoadBalanced注解用来拦截它所标记的RestTemplate发起的http请求, 底层是利用了一个名为Ribbon的组件来实现负载均衡功能(Cloud高版本已经弃用)

在这里插入图片描述

LoadBalancerInterceptor的intercept方法会对RestTemplate的请求进行拦截

public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {private LoadBalancerClient loadBalancer;private LoadBalancerRequestFactory requestFactory;public LoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerRequestFactory requestFactory) {this.loadBalancer = loadBalancer;this.requestFactory = requestFactory;}public LoadBalancerInterceptor(LoadBalancerClient loadBalancer) {this(loadBalancer, new LoadBalancerRequestFactory(loadBalancer));}public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {// 获取请求uri,如http://userservice/user/1URI originalUri = request.getURI()// 获取uri路径的主机名,其实就是服务名称userserviceString serviceName = originalUri.getHost();Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);        // 处理服务名称和用户请求return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));}
}

RibbonLoadBalancerClient的execute方法根据服务名称获取服务实例地址列表,随后利用负载均衡算法得到一个真实的服务地址信息

public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint) throws IOException {// 根据服务名称得到去Eureka服务端中获取服务的实例地址列表并保存DynamicServerListLoadBalancer到的allServeList属性当中ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);// 利用内置的负载均衡算法,从服务的实例地址列表中选择一个实例地址Server server = this.getServer(loadBalancer, hint);if (server == null) {throw new IllegalStateException("No instances available for " + serviceId);} else {RibbonServer ribbonServer = new RibbonServer(serviceId, server, this.isSecure(server, serviceId), this.serverIntrospector(serviceId).getMetadata(server));return this.execute(serviceId, (ServiceInstance)ribbonServer, (LoadBalancerRequest)request);}
}

负载均衡规则IRule: RibbonLoadBalancerClient的getServer方法最终调用父类BaseLoadBalancer的chooseServer方法

public class BaseLoadBalancer extends AbstractLoadBalancer implements PrimeConnectionListener, IClientConfigAware {private static Logger logger = LoggerFactory.getLogger(BaseLoadBalancer.class);// IRule的实现类不同表示负载均衡的策略不同,RoundRobinRule表示轮循调度private static final IRule DEFAULT_RULE = new RoundRobinRule();private static final BaseLoadBalancer.SerialPingStrategy DEFAULT_PING_STRATEGY = new BaseLoadBalancer.SerialPingStrategy((SyntheticClass_1)null);private static final String DEFAULT_NAME = "default";private static final String PREFIX = "LoadBalancer_";protected IRule rule;protected IPingStrategy pingStrategy;protected IPing ping;public Server chooseServer(Object key) {if (this.counter == null) {this.counter = this.createCounter();}this.counter.increment();if (this.rule == null) {return null;} else {try {// 选出一个负载均衡的策略return this.rule.choose(key);} catch (Exception var3) {logger.warn("LoadBalancer [{}]:  Error choosing server for key {}", new Object[]{this.name, key, var3});return null;}}}
}

负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类,默认的实现就是ZoneAvoidanceRule表示区域内轮询方案

在这里插入图片描述

在这里插入图片描述

自定义负载均衡规则

编程方式(全局):在order-service模块中启动类中注册一个IRule类型的Bean到Spring容器中,对order-service服务想要调用的微服务均有效

  • 优缺点: 配置灵活但修改时需要重新打包发布
@Bean
public IRule randomRule(){// 创建负载均衡的实现类对象return new RandomRule();
}

配置文件方式(局部):在order-service模块的配置文件中添加userservice.ribbon.NFLoadBalancerRuleClassName配置,只针对调用的某个微服务有效

  • 优缺点: 直观方便无需重新打包发布,但是无法做全局配置,只能指定调用的某一个微服务的负载均衡规则
userservice: # 给user-service服务添加负载均衡规则ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

饥饿加载(通用)

Ribbon默认是采用懒加载,只有在用户第一次访问时才会创建LoadBalanceClient负载均衡类做服务拉取的动作,这样用户第一次访问时就大大增加了请求时间

采用饥饿加载是在项目启动时就创建LoadBalanceClient负载均衡类加载指定的服务, 这样用户第一次访问时就大大缩短了请求时间

order-service模块的application.yml配置文件中添加新的配置属性ribbon.eager-load.enabled/clients

ribbon:eager-load:enabled: true # 开启饥饿加载# 指定对userservice单个服务进行饥饿加载clients: userservice  # 指定对多个服务进行饥饿加载clients: - userservice- xxxservice

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】使用Bash和GNU Parallel并行解压缩文件

介绍 在本教程中&#xff0c;我们将学习如何使用Bash脚本和GNU Parallel实现高效并行解压缩多个文件。这种方法在处理大量文件时可以显著加快提取过程。 先决条件 确保系统上已安装以下内容&#xff1a; BashGNU Parallel 你可以使用以下命令在不同Linux系统上安装它们&am…

【数据库】分支与循环函数存储过程

目录 函数 【1】 【2】 【3】❗ 【4】 存储过程 思考&分析 函数 【1】 --&#xff08;1&#xff09;定义一个根据学生姓名查询该生学习课程的函数stu_count。 --create function stu_count(sname char(8))--学生姓名 --returns char(12)--学习课程 --begin --…

layui分页laypage结合Flask+Jinja2实现流程

Layui2.0普通用法<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>Demo</title><!-- 请勿在项目正式环境中引用该 …

uniapp iOS离线打包——运行项目到模拟器报错?

运行项目、打包时报错问题 记录个人在开发过程中遇到的相关问题&#xff0c;后续有时间会不定时更新 文章目录 运行项目、打包时报错问题运行到模拟器报错解决方案 打包报错解决方案 运行到模拟器报错 解决方案 选中项目工程 —> Build Settings 滑动底部 —> User-Defi…

Java基础课的中下基础课04

目录 二十三、集合相关 23.1 集合 &#xff08;1&#xff09;集合的分支 23.2 List有序可重复集合 &#xff08;1&#xff09;ArrayList类 &#xff08;2&#xff09;泛型 &#xff08;3&#xff09;ArrayList常用方法 &#xff08;4&#xff09;Vector类 &#xff08;…

gin博客项目开发日志1

gin项目博客系统伪第一代 项目概述 1.1 目标 实现一个功能完整、易用的博客系统&#xff0c;允许用户发布、编辑和管理博客文章。 1.2 背景 看到网上有很多语言写的博客系统&#xff0c;但go的却很少&#xff0c;正好&#xff0c;现在我在学go&#xff0c;可以拿博客来练练…

组件之间传值

目录 1&#xff1a;组件中的关系 2&#xff1a;父向子传值 3&#xff1a;子组件向父组件共享数据 4&#xff1a;兄弟组件数据共享 1&#xff1a;组件中的关系 在项目中使用到的组件关系最常用两种是&#xff0c;父子关系&#xff0c;兄弟关系 例如A组件使用B组件或者C组件…

深入了解UDP协议:特点、应用场景及市面上常见软件案例

目录 引言 UDP的特点 UDP的应用场景 市面上使用UDP的软件案例 结论 引言 在计算机网络中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff09;是一种面向无连接、无状态的传输层协议。与TCP相比&#xff0c;UDP具有独特的特点和适用场景。本文将深入探讨UDP协…

解码方法dp

1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 从左往右 5.返回值 dp[n-1] 6.处理边界问题以及初始化问题的技巧

【小沐学Python】Python实现TTS文本转语音(speech、pyttsx3、百度AI)

文章目录 1、简介2、Windows语音2.1 简介2.2 安装2.3 代码 3、pyttsx33.1 简介3.2 安装3.3 代码 4、ggts4.1 简介4.2 安装4.3 代码 5、SAPI6、SpeechLib7、百度AI8、百度飞桨结语 1、简介 TTS(Text To Speech) 译为从文本到语音&#xff0c;TTS是人工智能AI的一个模组&#xf…

Python从入门到精通

一、Python基础语法 1、字面量 掌握字面量的含义了解常见的字面量类型基于print语句完成各类字面量的输出 什么是字面量&#xff1f; 字面量&#xff1a;在代码中&#xff0c;被写下来的的固定的值&#xff0c;称之为字面量 常用的值类型 Python中常用的有6种值&#xff…

MyBatis 四大核心组件之 ResultSetHandler 源码解析

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

基于SpringBoot+JSP+Mysql宠物领养网站+协同过滤算法推荐宠物(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

ffmpeg6.0之ffprobe.c源码分析二-核心功能源码分析

本篇我们继续分析: 1、ffprobe -show_packets 参数的处理流程;2、ffprobe -show_frames 参数的处理流程;3、ffprobe -show_streams 参数的处理流程;4、ffprobe -show_format 参数的处理流程; 因为前面的文章已经回顾了这些命令的使用,以及作用。本文就不在赘述,以免篇幅…

“新华三杯”第十届成都信息工程大学ACM程序设计竞赛(同步赛)L. 怎么走啊(最短路+二分 分段函数)

题目 登录—专业IT笔试面试备考平台_牛客网 思路来源 衡阳师范学院ac代码、pj学弟 题解 大致可以证明&#xff0c;在w从1e5减小到1的过程中&#xff0c; 之前某条反向边没有用到&#xff0c;现在需要用到反向边&#xff0c;也就是正向边用到的变少了 这样的变化有sqrt个&a…

分层网络模型(OSI、TCP/IP)及对应的网络协议

OSI七层网络模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连参考模型&#xff0c; 一般都叫OSI参考模型&#xff0c;是ISO组织于1985年研究的网络互连模型。OSI是分层的体系结构&#xff0c;每一层是一个模块&#xff0c;用于完成某种功…

服务器GPU占用,kill -9 PID 用不了,解决办法

PID&#xff08;progress ID 进程ID&#xff09; 上图为占用情况&#xff0c;使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 还是不行 # 等等网上的 chatgpt 提供的其他办法&#xff0c;一圈试了下来还是不管用最后解决办法 首先用下面的指令查看进程的树结构…

【Hexo】自动在中英文之间添加空格

本文首发于 ❄️慕雪的寒舍 如题&#xff0c;中英文添加空格是比较规范的写法&#xff0c; 但是我个人实在是懒&#xff0c;每次都要这么弄太累了。想找找hexo有没有对应的插件&#xff0c;还是有的 npm install hexo-filter-auto-spacing --save安装了之后&#xff0c;在hexo的…

〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

iOS使用CoreText完成txt阅读器

CoreText是一个高效处理字符和字形转换和进行文字排版的框架&#xff0c;API基于C语言。 常见的CoreText类介绍 &#xff08;1&#xff09;、CFAttributedStringRef 属性字符串&#xff0c;用于存储需要绘制的文字字符和字符属性 &#xff08;2&#xff09;、CTFramesetterR…