【SpringCloud Alibaba】(四)使用 Feign 实现服务调用的负载均衡
在上一文中,我们实现了服务的自动注册与发现功能。但是还存在一个很明显的问题:如果用户微服务和商品微服务在服务器上部署多份的话,之前的程序无法实现服务调用的负载均衡功能。
本文就带着大家一起实现服务调用的负载均衡功能
1. 负载均衡
负载均衡:将原本由一台服务器处理的请求根据一定的规则分担到多台服务器上进行处理。目前,大部分系统都实现了负载均衡的功能
负载均衡根据发生的位置,可以分为服务端负载均衡和客户端负载均衡
服务端负载均衡
服务端负载均衡指的是在服务端处理负载均衡的逻辑,如下图所示:

负载均衡在服务端进行处理,当客户端访问服务端的服务 A 时,首先访问到服务端的负载均衡器,由服务端的负载均衡器将客户端的请求均匀的分发到服务端部署的两个服务 A 上
客户端负载均衡
客户端负载均衡指的是在客户端处理负载均衡的逻辑,如下图所示:

负载均衡逻辑在客户端一侧,客户端应用调用服务端的应用 A 时,在向服务端发送请求时,就已经经过负载均衡的逻辑处理,并直接向服务端的某个服务发送请求
2. 启动多服务
为了实现服务调用的负载均衡功能,我们在本地的 IDEA 环境中分别启动两个用户微服务进程和两个商品微服务进程
2.1 启动多个用户/商品微服务
这里,我们在IDEA开发环境中启动多个用户微服务,其实也就是在同一台机器(服务器)上启动多个用户微服务。启动用户微服务时,默认监听的端口为 8060,主要由如下配置决定:
server:port: 8060
在同一台机器(服务器)上启动多个用户微服务时,只需要保证启动的多个用户微服务监听的端口号不同即可。
IDEA 中可以通过配置不同的端口号来启动多个相同的服务,如下所示,再配置一个用户微服务,使其端口号为 8061

按相同方式配置多个商品微服务。
配置好后,启动两个用户/商品微服务。打开 Nacos 的服务列表,如下所示:

3. 实现自定义负载均衡
这里,我们通过修改订单微服务的代码来实现自定义负载均衡。
由于在整个项目中,订单微服务作为客户端存在,由订单微服务调用用户微服务和商品微服务,所以,这里采用的是客户端负载均衡的模式
3.1 随机负载均衡
修改 getServiceUrl() 方法,使其能够在多个服务地址中随机获取一个服务地址,而不总是获取第一个服务地址:
private String getServiceUrl(String serviceName){List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);int index = new Random().nextInt(instances.size());ServiceInstance serviceInstance = instances.get(index);String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();log.info("负载均衡后的服务地址为:{}", url);return url;
}
在 getServiceUrl() 方法中,首先通过服务的名称在 Nacos 中获取到所有的服务实例列表,然后使用随机函数随机生成一个 0 到服务列表长度减1的整数,而这个随机生成的整数恰好在服务实例列表的下标范围内,然后以这个整数作为下标获取服务列表中的某个服务实例。从而以随机的方式实现了负载均衡,并从获取到的服务实例中获取到服务实例所在服务器的 IP 地址和端口号,拼接成 IP:PORT 的形式返回
启动订单微服务,多次调用下单接口。
在订单微服务输出的日志信息中会存在如下所示的日志:

3.2 使用 Ribbon 实现负载均衡
Ribbon 是 SpringCloud 提供的一个能够实现负载均衡的组件,使用 Ribbon 能够轻松实现微服务之间调用的负载均衡
添加 @LoadBalanced 注解
@Configuration
public class LoadBalanceConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}}
修改 saveOrder() 方法:将 userUrl 修改为 userServer
// ...
User user = restTemplate.getForObject("http://"+ userServer + "/user/get/" + orderParamVo.getUserId(), User.class);Product product = restTemplate.getForObject("http://" + productServer + "/product/get/" + orderParamVo.getProductId(), Product.class);
// ...
启动的每个用户微服务和商品微服务都会打印相关的日志,说明使用Ribbon实现了负载均衡功能
3.3 使用 Fegin 实现负载均衡
Fegin 是 SpringCloud 提供的一个 HTTP 客户端,但只是一个声明式的伪客户端,它能够使远程调用和本地调用一样简单。阿里巴巴开源的 Nacos 能够兼容 Ribbon,而 Fegin 又集成了 Ribbon,所以,使用 Fegin也能够实现负载均衡。
修改订单微服务代码
1、在订单微服务的 pom.xml 文件中添加 Fegin 相关的依赖,如下所示:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在订单微服务上的主类添加 @EnableFeignClients 注解
3、添加 feign 包
用户接口:
@FeignClient("server-user")
public interface UserService {@GetMapping(value = "/user/get/{uid}")User getUser(@PathVariable("uid") Long uid);}
商品接口:
@FeignClient("server-product")
public interface ProductService {/*** 获取商品信息*/@GetMapping(value = "/product/get/{pid}")Product getProduct(@PathVariable("pid") Long pid);/*** 更新库存数量*/@GetMapping(value = "/product/update_count/{pid}/{count}")Result<Integer> updateCount(@PathVariable("pid") Long pid, @PathVariable("count") Integer count);}
4、修改下单接口
//...
User user = userService.getUser(orderParamVo.getUserId());
if (user == null){throw new RuntimeException("未获取到用户信息: " + JSONObject.toJSONString(orderParamVo));
}
// ...
Product product = productService.getProduct(orderParamVo.getProductId());
if (product == null){throw new RuntimeException("未获取到商品信息: " + JSONObject.toJSONString(orderParamVo));
}
启动订单微服务,多次调用下单接口。
启动的每个用户微服务和商品微服务都会打印相关的日志,说明使用Ribbon实现了负载均衡功能
代码地址
代码已经上传至码云,码云地址
其中,数据库文件位于 db 文件夹下。
相关文章:
【SpringCloud Alibaba】(四)使用 Feign 实现服务调用的负载均衡
在上一文中,我们实现了服务的自动注册与发现功能。但是还存在一个很明显的问题:如果用户微服务和商品微服务在服务器上部署多份的话,之前的程序无法实现服务调用的负载均衡功能。 本文就带着大家一起实现服务调用的负载均衡功能 1. 负载均衡…...
ShardingSphere-Proxy水平分片详解与实战
🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…...
PTA 1052 Linked List Sorting
个人学习记录,代码难免不尽人意。 A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked li…...
五,Eureka 第五章
5.3.2 修改pom添加依赖 <dependencies><!--公共部门--><dependency><groupId>cn.bdqn</groupId><artifactId>springcloud-api-commons</artifactId><version>${project.version}</version></dependency><!--e…...
yolov5目标框的融合(两个或多个框)
框的融合 1.多个框的融合 方法一: import os import numpy as np import glob import cv2 from PIL import Image,ImageFont,ImageDraw import randomCOLORS = np.random.uniform(0, 255, size=...
pythonAPI对接示API示例电商数据平台
下面是一个简单的示例,展示了如何对接一个API,并附带了一些Python代码作为参考。 寻找合适的API:首先,你需要找到符合你需求的API。你可以通过搜索引擎或者开发者平台来查找API文档。确保你在使用API时遵循相关的规则和限制。 注…...
如何做好IT类的技术面试
目录 一、IT行业的招聘渠道 二、如何做好技术面试官 三、谈谈IT行业如何做好招聘工作 四、面试IT公司的小技巧 五、面试有哪些常见的问题 六、关于面试的一些建议 面试可能是我们每个人都必须会遇到的事情,而技术面试更具有专业性,以下会从几个方面…...
比memcpy还要快的内存拷贝,了解一下
前言 朋友们有想过居然还有比memcpy更快的内存拷贝吗? 讲道理,在这之前我没想到过,我也一直觉得memcpy就是最快的内存拷贝方法了。 也不知道老板最近是咋了,天天开会都强调:“我们最近的目标就一个字,性能优…...
正则表达式常用字符及案例
引言 正则表达式是一种强大而灵活的工具,它在文本搜索和处理中起到了至关重要的作用。熟练掌握正则表达式的常用字符和使用方法,将能帮助开发者更加高效地进行模式匹配和字符串操作。本文将介绍一些常见的正则表达式字符,并给出一些实际案例…...
周训龙老兵参观广西森林安全紧急救援装备演练
7月21日上午,周训龙老兵参观广西紧急救援促进中心在南宁市青秀山举行森林安全紧急救援装备演练,多功能水罐消防车、无人救援机等先进设备轮番上阵,展示了广西应对突发事件的紧急救援速度和水平。广西壮族自治区应急厅不情愿参此次演练活动。 …...
[开发|java] java 将json转化java对象
使用Jackson库将JSON转换为Java对象: 安装依赖 <!-- Jackson Core --> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.12.5</version> </depen…...
平台化的测试工具推荐|一站式测试平台RunnerGo
互联网行业的发展到今天越来越多的公司更加注重工作效率和团队协作,越来越多的产品也趋于平台化,平台化也更有利于提高团队效率,代码管理、持续构建、持续部署这些工具的发展都是非常超前的,它们对于团队协作的支持和工作效率的提…...
PCB封装设计指导(十五)验证封装的正确性
PCB封装设计指导(十五)验证封装的正确性 封装建立好之后,我们需要验证封装是否能够正常的放入PCB文件中,最好最直接的办法就是直接放入PCB中来验证。 具体操作如下 任意新建一个空白的PCB文件点击File 选择NEW...
Godot 4 插件 - Utility AI 研究
今天看到一个视频教学 Godot4 | 实现简单AI | Utility AI 插件_哔哩哔哩_bilibili 就看了一下。吸引我的不是插件,是AI这两个字母。这AI与Godot怎么结合?感觉还是离线使用,值得一看。 视频时间不长,15分钟左右,看得…...
第八章:将自下而上、自上而下和平滑性线索结合起来进行弱监督图像分割
0.摘要 本文解决了弱监督语义图像分割的问题。我们的目标是在仅给出与训练图像关联的图像级别对象标签的情况下,为新图像中的每个像素标记类别。我们的问题陈述与常见的语义分割有所不同,常规的语义分割假设在训练中可用像素级注释。我们提出了一种新颖的…...
MySql忘记密码如何修改
前言 好久没用数据库的软件了,要用的时候突然发现密码已经忘记了,怎么试都不对,心态直接爆炸,上一次用还是22年6月份,也记不得当时用数据库干什么了,这份爆炸浮躁的心态值得这样记录一下,警示自…...
【NetCore】04-作用域与对象释放行为
文章目录 作用域 作用域由IServiceScope接口承载 对象释放 实现IDisposable接口类型释放 1.DI只负责释放由其创建的对象实例 2.DI在容器或子容器释放时,释放由其创建的对象实例 建议 1.避免在根容器获取实现IDisposable接口的瞬时服务 2.避免手动创建实现了IDispo…...
新材料技术的优势
目录 1.什么是新材料技术 2.新材料技术给人类带来了哪些便利 3.新材料技术未来的发展趋势 1.什么是新材料技术 新材料技术指的是通过科学和工程技术的手段开发和应用全新的材料,以满足特定的需求和应用。新材料技术是材料科学和工程领域的重要研究方向࿰…...
HTTPS、DNS、正则表达式
HTTPS原理 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的通信协议,它基于HTTP协议,在数据传输过程中使用了加密技术来保护通信的安全性和完整性。HTTPS的工作原理主要包括以下几个步骤: 客户端发起HTTPS请求…...
MAC电脑设置charles,连接手机的步骤说明(个人实际操作)
目录 一、charles web端设置 1. 安装charles之后,先安装证书 2. 设置 Proxy-Proxy Settings 3. 设置 SSL Proxying 二、手机的设置 1. 安卓 2. ios 资料获取方法 一、charles web端设置 1. 安装charles之后,先安装证书 Help-SSL Proxying-Inst…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
