当前位置: 首页 > news >正文

【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 实现服务调用的负载均衡

在上一文中&#xff0c;我们实现了服务的自动注册与发现功能。但是还存在一个很明显的问题&#xff1a;如果用户微服务和商品微服务在服务器上部署多份的话&#xff0c;之前的程序无法实现服务调用的负载均衡功能。 本文就带着大家一起实现服务调用的负载均衡功能 1. 负载均衡…...

ShardingSphere-Proxy水平分片详解与实战

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…...

PTA 1052 Linked List Sorting

个人学习记录&#xff0c;代码难免不尽人意。 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示例电商数据平台

下面是一个简单的示例&#xff0c;展示了如何对接一个API&#xff0c;并附带了一些Python代码作为参考。 寻找合适的API&#xff1a;首先&#xff0c;你需要找到符合你需求的API。你可以通过搜索引擎或者开发者平台来查找API文档。确保你在使用API时遵循相关的规则和限制。 注…...

如何做好IT类的技术面试

目录 一、IT行业的招聘渠道 二、如何做好技术面试官 三、谈谈IT行业如何做好招聘工作 四、面试IT公司的小技巧 五、面试有哪些常见的问题 六、关于面试的一些建议 面试可能是我们每个人都必须会遇到的事情&#xff0c;而技术面试更具有专业性&#xff0c;以下会从几个方面…...

比memcpy还要快的内存拷贝,了解一下

前言 朋友们有想过居然还有比memcpy更快的内存拷贝吗&#xff1f; 讲道理&#xff0c;在这之前我没想到过&#xff0c;我也一直觉得memcpy就是最快的内存拷贝方法了。 也不知道老板最近是咋了&#xff0c;天天开会都强调&#xff1a;“我们最近的目标就一个字&#xff0c;性能优…...

正则表达式常用字符及案例

引言 正则表达式是一种强大而灵活的工具&#xff0c;它在文本搜索和处理中起到了至关重要的作用。熟练掌握正则表达式的常用字符和使用方法&#xff0c;将能帮助开发者更加高效地进行模式匹配和字符串操作。本文将介绍一些常见的正则表达式字符&#xff0c;并给出一些实际案例…...

周训龙老兵参观广西森林安全紧急救援装备演练

7月21日上午&#xff0c;周训龙老兵参观广西紧急救援促进中心在南宁市青秀山举行森林安全紧急救援装备演练&#xff0c;多功能水罐消防车、无人救援机等先进设备轮番上阵&#xff0c;展示了广西应对突发事件的紧急救援速度和水平。广西壮族自治区应急厅不情愿参此次演练活动。 …...

[开发|java] java 将json转化java对象

使用Jackson库将JSON转换为Java对象&#xff1a; 安装依赖 <!-- Jackson Core --> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.12.5</version> </depen…...

平台化的测试工具推荐|一站式测试平台RunnerGo

互联网行业的发展到今天越来越多的公司更加注重工作效率和团队协作&#xff0c;越来越多的产品也趋于平台化&#xff0c;平台化也更有利于提高团队效率&#xff0c;代码管理、持续构建、持续部署这些工具的发展都是非常超前的&#xff0c;它们对于团队协作的支持和工作效率的提…...

PCB封装设计指导(十五)验证封装的正确性

PCB封装设计指导(十五)验证封装的正确性 封装建立好之后,我们需要验证封装是否能够正常的放入PCB文件中,最好最直接的办法就是直接放入PCB中来验证。 具体操作如下 任意新建一个空白的PCB文件点击File 选择NEW...

Godot 4 插件 - Utility AI 研究

今天看到一个视频教学 Godot4 | 实现简单AI | Utility AI 插件_哔哩哔哩_bilibili 就看了一下。吸引我的不是插件&#xff0c;是AI这两个字母。这AI与Godot怎么结合&#xff1f;感觉还是离线使用&#xff0c;值得一看。 视频时间不长&#xff0c;15分钟左右&#xff0c;看得…...

第八章:将自下而上、自上而下和平滑性线索结合起来进行弱监督图像分割

0.摘要 本文解决了弱监督语义图像分割的问题。我们的目标是在仅给出与训练图像关联的图像级别对象标签的情况下&#xff0c;为新图像中的每个像素标记类别。我们的问题陈述与常见的语义分割有所不同&#xff0c;常规的语义分割假设在训练中可用像素级注释。我们提出了一种新颖的…...

MySql忘记密码如何修改

前言 好久没用数据库的软件了&#xff0c;要用的时候突然发现密码已经忘记了&#xff0c;怎么试都不对&#xff0c;心态直接爆炸&#xff0c;上一次用还是22年6月份&#xff0c;也记不得当时用数据库干什么了&#xff0c;这份爆炸浮躁的心态值得这样记录一下&#xff0c;警示自…...

【NetCore】04-作用域与对象释放行为

文章目录 作用域 作用域由IServiceScope接口承载 对象释放 实现IDisposable接口类型释放 1.DI只负责释放由其创建的对象实例 2.DI在容器或子容器释放时&#xff0c;释放由其创建的对象实例 建议 1.避免在根容器获取实现IDisposable接口的瞬时服务 2.避免手动创建实现了IDispo…...

新材料技术的优势

目录 1.什么是新材料技术 2.新材料技术给人类带来了哪些便利 3.新材料技术未来的发展趋势 1.什么是新材料技术 新材料技术指的是通过科学和工程技术的手段开发和应用全新的材料&#xff0c;以满足特定的需求和应用。新材料技术是材料科学和工程领域的重要研究方向&#xff0…...

HTTPS、DNS、正则表达式

HTTPS原理 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种安全的通信协议&#xff0c;它基于HTTP协议&#xff0c;在数据传输过程中使用了加密技术来保护通信的安全性和完整性。HTTPS的工作原理主要包括以下几个步骤&#xff1a; 客户端发起HTTPS请求…...

MAC电脑设置charles,连接手机的步骤说明(个人实际操作)

目录 一、charles web端设置 1. 安装charles之后&#xff0c;先安装证书 2. 设置 Proxy-Proxy Settings 3. 设置 SSL Proxying 二、手机的设置 1. 安卓 2. ios 资料获取方法 一、charles web端设置 1. 安装charles之后&#xff0c;先安装证书 Help-SSL Proxying-Inst…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...

6.9本日总结

一、英语 复习默写list11list18&#xff0c;订正07年第3篇阅读 二、数学 学习线代第一讲&#xff0c;写15讲课后题 三、408 学习计组第二章&#xff0c;写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语&#xff1a;复习l默写sit12list17&#…...