SpringCloud微服务远程接口调用
一、概念
使用springcloud将项目拆分成一个一个微服务之后,微服务之间的接口调用就需要通过远程的方式实现,这里将介绍springcloud提供的两个微服务组件来介绍如何进行微服务间的远程接口调用。
1、使用RestTEmplate + LoadBalanced来实现远程接口调用及负载均衡
RestTemplate的优点:
- 支持多种HTTP方法:RestTemplate支持常见的HTTP方法,如GET、POST、PUT、DELETE等,可以根据需要选择合适的方法来发送请求。
- 提供丰富的请求和响应处理方法:RestTemplate提供了多种方法来处理请求和响应,如添加请求头、设置请求参数、发送请求、获取响应等。开发者可以根据需要选择合适的方法来处理HTTP请求和响应。
- 支持请求和响应的序列化和反序列化:RestTemplate可以将请求和响应的数据进行序列化和反序列化,支持多种数据格式,如JSON、XML等。开发者可以根据需要选择合适的序列化和反序列化方式。
- 支持错误处理和异常处理:RestTemplate可以处理HTTP请求过程中的错误和异常,如连接超时、请求失败等。开发者可以根据需要进行错误处理和异常处理。
- 可扩展性和定制化:RestTemplate提供了一些扩展点和配置选项,可以进行定制化配置。开发者可以根据需要进行扩展和定制,以满足特定的业务需求。
但是RestTemplate没有负载均衡的功能,所以需要配合LoadBalanced来实现负载均衡。
2、使用OpenFeign实现远程接口调用
openFeign的优点:
- 声明式的API定义:通过使用注解,开发者可以定义和描述服务间的API接口,包括请求方法、路径、参数、请求头等信息。这样可以使得服务间的调用代码更加简洁和易于维护。
- 自动化的服务发现和负载均衡:OpenFeign集成了服务注册中心,可以自动发现和调用其他微服务。它还支持负载均衡,可以根据配置的负载均衡策略选择合适的服务实例进行调用。
- 内置的请求和响应拦截器:OpenFeign提供了一些内置的拦截器,可以在请求和响应的不同阶段进行拦截和处理。开发者可以自定义拦截器来实现日志记录、错误处理等功能。
- 支持多种编码器和解码器:OpenFeign支持多种编码器和解码器,可以处理不同的数据格式,如JSON、XML等。开发者可以根据需要选择合适的编码器和解码器。
- 整合了Hystrix和Ribbon:OpenFeign与Hystrix和Ribbon等其他Spring Cloud组件集成,可以实现服务的容错和熔断机制,提高系统的可靠性和稳定性。
二、代码实现
1、前提
所有微服务使用springboot搭建,并且使用springcloud的服务注册和发现服务,这里我们使用的是consul
1、将服务注册到consul
server:port: 80
spring:application:name: ordercloud:consul:host: 127.0.0.1port: 8500discovery:service-name: ${spring.application.name}
2、在启动类上添加注解,开启服务发现
@EnableDiscoveryClient
3、远程调用的接口
@RestController
@Slf4j
public class PayController {@Resourceprivate PayService payService;@Operation(summary = "添加支付信息")@PostMapping(value = "/pay/add")public ResultDate addPay(@RequestBody PayDto payDto){Pay pay = new Pay();BeanUtils.copyProperties(payDto,pay);pay.setDeleted((byte) 1);int add = payService.add(pay);return ResultDate.success(add);}
}
2、RestTemplate
1、导入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!--web + actuator--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
项目中使用了spring-boot-starter-dependencies,所以没有配置版本号,大家根据自己使用的springboot和springcloud版本进行配置即可。
2、使用loadBalanced进行负载均衡
@Configuration
public class RestTempConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
loadbalanced默认的负载均衡算法是通过轮询实现的,底层是通过DiscoveryClient获取所有的微服务名,返回的是个数组,遍历数组即可找到对应的微服务,同时可以根据微服务获取其在线实例数量,最后使用循环取模的方法实现轮询。
springcloud为loadBalanced提供了两个负载均衡的算法,除了轮询外还有随机算法,默认使用的是轮询。
3、编写代码
@RestController
public class OrderController {public static final String PaymentSrv_URL = "http://cloud-payment-service";
// public static final String PaymentSrv_URL = "http://localhost:8001";@Resourceprivate RestTemplate restTemplate;@GetMapping("/consumer/pay/add")public ResultDate addOrder(@RequestBody PayDto payDto){ResultDate resultDate = restTemplate.postForObject(PaymentSrv_URL + "/pay/add", payDto, ResultDate.class);return resultDate;}
}
从这里我们可以看出使用restTemplate进行远程调用非常方便,只需要调用对应的方法,传入返回值类型和参数即可。
3、OpenFeign
1、导入依赖
<!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>
2、编写FeignClient接口
@FeignClient(name ="cloud-payment-service")
public interface PayFeignClient {@PostMapping(value = "/pay/add")public ResultDate addPay(@RequestBody PayDto payDto);
}
使用feignClient进行远程接口调用只需要像声明函数是接口一样,将需要调用的API进行申明,再加上@FeignClient注解即可
需要注意的是:
- @FeignClient注解里面需要申明对应的微服务名(与注册的服务名一致)
- @XXMapper的url路径要与调用接口的url一致,需要注意我们可能在application.yaml里面配置了统一的请求头server.servlet.context-path或者在定义Controller时使用@RequestMapper定义了统一的请求头地址
- 接口定义时要与调用接口拥有相同的参数,并且使用注解控制时需要指明,例如使用@RequestParem时就需要指定对应的参数名:@RequestParem("id")
3、使用FeignClient
@RestController
public class OrderController {@Resourceprivate PayFeignClient payFeignClient;@PostMapping("/consumer/pay/add")public ResultDate addOrder(@RequestBody PayDto payDto){return payFeignClient.addPay(payDto);}
}
从代码上可以看出,与RestTemplate比较,OpenFeign的代码更为简洁,使用起来更加方便,并且OpenFeign自带负载均衡的功能,不需要额外使用LoadBalanced实现负载均衡。所以更加推荐使用OpenFeign进行远程接口调用。
相关文章:

SpringCloud微服务远程接口调用
一、概念 使用springcloud将项目拆分成一个一个微服务之后,微服务之间的接口调用就需要通过远程的方式实现,这里将介绍springcloud提供的两个微服务组件来介绍如何进行微服务间的远程接口调用。 1、使用RestTEmplate LoadBalanced来实现远程接口调用及…...

MySQL优化器的SQL重写规则
MySQL优化器的SQL重写规则 MySQL优化器的SQL重写规则:MySQL优化器会根据一定的规则对输入的SQL在保证含义不变的情况下进行SQL的优化重写。 1. 条件简化 1.1 移除不必要的括号 例如: ((a 5 AND b c) OR ((a > c) AND (c < 5))); --优化后 (a…...

57.void指针(万能指针)
目录 一.什么是void指针 二.视频教程 一.什么是void指针 在定义变量的时候,需要用到变量的类型,变量的类型在表示在内存中的大小,而void是空,表示的是无类型。所以如果用void来定义一个变量会发生错误(无法在内存中挖…...

国科大-智能计算系统(AICS)期末试题(2024春)
国科大-智能计算系统期末试题(2024春) 填空题简答题最后一道大题 部分题目记录 填空题 卷积层中,input维度为16322020,filter维度为1283233,stride2,pad_left pad_top 0,pad_right pad_bottom 1,outpu…...

训练Pytorch深度学习模型出现StopIteration
训练一个深度学习检测模型,突然出现: 是因为next(batch_iterator),可能迭代器读出来的数据为空。 # load train data# 原先代码images, targets next(batch_iterator)# 更改为:try:images, targets next(batch_iterator)except…...

windows上安装MongoDB,springboot整合MongoDB
上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。 Ubuntu上安装、使用MongoDB详细教程https://blog.csdn.net/heyl163_/article/details/133781878 这篇文章介绍一下在windows上安装MongoDB,并通过在springboot项目中使用MongoDB记录用户…...

python_04
37、列表推导式 # 作用:快速生成列表 # 列表变量名 [x for x in range(开始值,结束值,步长) if 条件] # 注意:左闭右开 list1 [i for i in range(0,100)] print(list1) # list1 [i for i in range(0,100)] # print(list1)list…...

音视频视频点播
视频点播是集音视频采集,编辑,上传,自动化转码处理,媒体资源管理,高效云剪辑处理,分发加速,视频播放于一体的一站式音视频点播解决方案 阿里云视频点播基于阿里云强大的基础设施服务,…...

Git常用命令1
1、设置用户签名 ①基本语法: git config --global user.name 用户名 git config --global user.email 邮箱 ②实际操作 ③查询是否设置成功 cat ~/.gitconfig 注:签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交…...

Nextjs使用教程
一.手动创建项目 建议看这个中文网站文档,这个里面的案例配置都是手动的,也可以往下看我这个博客一步步操作 1.在目录下执行下面命令,初始化package.json文件 npm init -y2.安装react相关包以及next包 yarn add next react react-dom // 或者 npm install --save next react…...

mysql的增删查改(进阶)
目录 一. 更复杂的新增 二. 查询 2.1 聚合查询 COUNT SUM AVG MAX MIN 2.1.2 分组查询 group by 子句 2.1.3 HAVING 2.2 联合查询/多表查询 2.2.1 内连接 2.2.2 外连接 2.2.3 全外连接 2.2.4 自连接 2.2.5 子查询 2.2.6 合并查询 一. 更复杂的新增 将从表名查询到…...

九、从0开始卷出一个新项目之瑞萨RZN2L生产烧录固件(jflash擦写读外挂flash)
目录 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 7.2 jflash擦/写/读外挂flash 九、从0开始卷出一个新项目之瑞萨RZN2L 七、生产烧录固件(jflash擦写读外挂flash) 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 略 7.2 jflash擦/写/读…...

安徽某高校数据挖掘作业4-5 (与一些碎碎念)
1. 编写程序求函数、、的极限。 解答: import sympy as sp# 定义符号变量 x x sp.symbols(x)# 定义函数 f1 sp.sin(20 * x) / x f2 (1 4 * x)**(2 / x) f3 (1 4 / x)**(2 * x)# 计算极限 limit1 sp.limit(f1, x, 0) limit2 sp.limit(f2, x, 0) limit3 sp…...

基于ES安装IK分词插件
前言 IK分词器插件是为Elasticsearch设计的中文分词插件,由Elasticsearch的官方团队之外的开发者medcl开发。它主要针对中文文本的分词需求,提供了较为准确的中文分词能力。以下是IK分词器插件的一些特点: 智能分词:IK分词器采用基…...

php项目加密源码
软件简介 压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹(子文件夹里的php文件也会被加密),加密后的压缩包需要先修复一下,步骤:打开压缩包 》 工具 》 修…...

测绘GIS和遥感领域比较好的公众号有哪些
测绘GIS和遥感领域,微信公众号作为信息传播和知识分享的重要渠道,为从业者提供了一个快速获取行业动态、技术进展和职业发展机会的平台。分享一些在测绘GIS和遥感领域表现突出的公众号推荐: 1. 慧天地:慧天地是一个知名的测绘公众…...

【技术实操】银河高级服务器操作系统实例分享,达梦数据库服务器 oom 问题分析
1. 服务器环境以及配置 【 机型】 处理器: HUAWEIKunpeng 920 5220 内存: 400518528 kB 主板型号: Chaoqiang K620 series 整机类型/架构: ARM BIOS 版本: KL4.41.028.TF.220224.R 固件版本: KL4.41…...

通过ffmpeg 将wav格式转为mp3格式.
通过ffmpeg实现将wav转为mp3格式.需要下载一个ffmpeg放到执行文件所在目录. 我ffmpeg的下载地址为:ffmpeg.exe下载-ffmpeg.exe32&64位下载免费版-旋风软件园 use ShellAPI; {$R *.dfm}procedure ConvertWavToMp3(const InputFile, OutputFile: string); varExecu…...

快速上手RabbitMQ,直接上开发!
一 直接使用Rabbit MQ 在Java项目中使用Rabbit MQ可以通过引入Rabbit MQ的客户端Maven依赖,和Rabbit MQ建立连接进行通信。这种就属于是直接使用Rabbit MQ。 基本使用 创建连接后,使用channel向交换机发送消息 public class Producer {private final s…...

如何实现单例模式及不同实现方法分析-设计模式
这是 一道面试常考题:(经常会在面试中让手写一下) 什么是单例模式 【问什么是单例模式时,不要答非所问,给出单例模式有两种类型之类的回答,要围绕单例模式的定义去展开。】 单例模式是指在内存中只会创建…...

wampserver安装与汉化
wampserver安装与汉化 文章目录 wampserver安装与汉化一、安装二、汉化1.升级软件并安装补丁 介绍: WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以及MySQL数据库的整合软件包。免去了开发人员将时间花费在繁琐的配置环境过程,从而腾出更…...

解决MyBatis的N+1问题
解决MyBatis的N1问题 N1问题通常出现在一对多关联查询中。当我们查询主表数据(如订单)并希望获取关联的从表数据(如订单的商品)时,如果每获取一条主表记录都要执行一次从表查询,就会产生N1次查询的问题。假…...

12-学生们参加各科测试的次数(高频 SQL 50 题基础版)
12-学生们参加各科测试的次数 -- 学生表中,id是唯一的,将他作为主表 -- CROSS JOIN产生了一个结果集,该结果集是两个关联表的行的乘积 -- 2行表,与3行表使用cross join,得到2*36行数据 select st.student_id, st.student_name,su.subject_na…...

2024网络与信息安全管理员职工职业技能竞赛re0220164094
main部分,就是要逆这部分shellcode,程序把data段里面的东西复制到bss段去执行,期间包含解码操作。 v19 0;puts("Please input your flag: ");__isoc99_scanf("%s", s);if ( strlen(s) ! 38 ){puts("Wrong length!&…...

Elasticsearch--easy-ES框架使用,轻松操作查询Elasticsearch,简化开发
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可…...

【教程】如何实现WordPress网站降级(用于解决插件和主题问题)
在最新可用版本上运行WordPress安装、插件和主题是使用该平台的关键最佳实践。还建议使用最新版本的PHP。但是,在某些情况下,这是不谨慎或不可能的。 如果您发现自己处于这种情况,您可能需要撤消更新并降级您的WordPress网站(或其中的一部分)。幸运的是,有一些方法可用于…...

思维导图-vb.net开发带进度条的复制文件夹功能c#复制文件夹
你们谁写代码会用流程图来做计划,或者写项目总结报告? .net带进度条复制文件夹 方案 列出所有子文件夹,再创建,复制文件 大文件可以单独做进度条 缺点:设计会更复杂 直接…...

Linux文本处理三剑客之awk命令
官方文档:https://www.gnu.org/software/gawk/manual/gawk.html 什么是awk? Awk是一种文本处理工具,它的名字是由其三位创始人(Aho、Weinberger和Kernighan)的姓氏首字母组成的。Awk的设计初衷是用于处理结构化文本数…...

公差和配合
配合的选择: 配合特性以及基本偏差的应用: 常用优先配合特性及选用举例 为什么一般情况下选用基孔制而不用基轴制: 优先采用基孔制的原因主要包括工艺性、经济性和标准化: 工艺性。加工孔比加工轴更难,因为孔…...

AI大模型应用开发实践:5.快速入门 Assistants API
快速入门 Assistants API Assistants API 允许您在自己的应用程序中构建人工智能助手。一个助手有其指令,并可以利用模型、工具和知识来回应用户查询。 Assistants API 目前支持三种类型的工具: 代码解释器 Code Interpreter检索 Retrieval函数调用 Function calling使用 P…...