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注解即可

需要注意的是:

  1. @FeignClient注解里面需要申明对应的微服务名(与注册的服务名一致)
  2. @XXMapper的url路径要与调用接口的url一致,需要注意我们可能在application.yaml里面配置了统一的请求头server.servlet.context-path或者在定义Controller时使用@RequestMapper定义了统一的请求头地址
  3. 接口定义时要与调用接口拥有相同的参数,并且使用注解控制时需要指明,例如使用@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进行远程接口调用。

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

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

相关文章

Linux系统--Nacos的安装

Nacos&#xff1a;更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 随着云计算技术的不断发展&#xff0c;越来越多的企业开始将业务迁移到云端。在这个背景下&#xff0c;云原生应用的开发变得越来越重要。为了帮助企业更好地构建云原生应用&#xff0c;本文将…

React useCallback用法

useCallback 是 React 中的一个 Hook&#xff0c;它用于优化性能&#xff0c;通过缓存函数的引用来避免在组件的每次渲染时都创建新的函数实例。这对于避免不必要的子组件重新渲染特别有用&#xff0c;因为如果传递给子组件的回调函数在每次渲染时都不同&#xff0c;即使子组件…

面试题:讲讲你对闭包的理解?有什么优缺点

面试题&#xff1a;讲讲你对闭包的理解&#xff1f;有什么优缺点&#xff1f; 对闭包的理解 从 JS 作用域链的角度出发&#xff0c;函数外部无法访问到函数中的变量&#xff0c;但函数内部可以访问到其外部的变量。所谓闭包&#xff08;closure&#xff09;&#xff0c;是一种…

Qt 中QList、QListIterator 、QMutableListIterator、QMap用法

#include <QCoreApplication> #include <QDebug>//QListIterator void printList() {QList<int> list;list<<1<<2<<3<<4<<5;QListIterator<int> i(list);qDebug()<<"正序打印....";//正序打印for(;i.ha…

jsonl - JSON Lines

文章目录 一、关于 JSON Lines1.UTF-8编码2.每一行都是有效的JSON值3.行分隔符为\n 4.建议的惯例 二、示例1、Better than CSV2、Easy Nested Data 三、Json 相关工具应用 一、关于 JSON Lines 官网&#xff1a;https://jsonlines.org &#xff08;下文翻译自此&#xff09;js…

如何利用Web Components提高前端开发效率?

Web Components 是一种用于构建可复用的可扩展组件的技术。它为前端开发提供了一种模块化的方法&#xff0c;可以提高开发效率。下面是一些利用 Web Components 提高前端开发效率的方法&#xff1a; 代码重用&#xff1a;Web Components 可以创建可独立使用的组件&#xff0c;这…

别再emo了,还不赶紧去考PMP,搞钱要紧~

自从疫情之后经济大不如从前&#xff0c;现在大环境都不好&#xff0c;很多公司都在裁员&#xff0c;像我朋友就在上个月被裁掉了&#xff0c;虽说拿了补偿但也不可能靠那点补偿生活的&#xff0c;所以我朋友找了很久的工作&#xff0c;但是由于大环境的缺失所以导致他的薪资直…

搭建 3D 智慧农场可视化

运用图扑自主研发的 HT 产品&#xff0c;全程零代码搭建 3D 轻量化 Low Poly 风格的智慧农场可视化解决方案&#xff0c;无缝融合 2D、3D 技术&#xff0c;1&#xff1a;1 还原农场的区域规划&#xff0c;展开对农作物间的网格化管理。

js控制并发请求的最优解和js控制调用频率,大量请求延迟执行

js控制并发请求的最优解 思路&#xff1a;维护一个运行池&#xff0c;一个等待队列&#xff0c;出一个进一个&#xff0c;控制运行池的大小 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv&q…

深入探讨:Kubernetes 与低代码的原理及应用实战

随着云计算技术的飞速发展&#xff0c;云原生技术逐渐成为企业数字化转型的重要支撑。其中&#xff0c;Kubernetes和低代码作为云原生的两大关键技术&#xff0c;不仅为企业提供了灵活高效的IT解决方案&#xff0c;更助力企业快速响应市场变化&#xff0c;提升竞争力。本文将详…

webSecurity安全

0x01 简介 https://www.electronjs.org/zh/docs/latest/tutorial/security#6-%E4%B8%8D%E8%A6%81%E7%A6%81%E7%94%A8-websecurity 大家好&#xff0c;今天跟大家讨论的是 Electron 的安全配置选项 —— webSecurity 这在之前的文章 《Electron安全与你我息息相关》 中就已经提…

C# 解决 Excel 自动适应列宽的问题

目录 问题现象 原因分析 范例运行环境 解决问题 生成测试文本 实现自适应 小结 问题现象 通过 COM 操作 Excel 自动适应列宽的方法是 AutoFit 方法&#xff0c;该方法适于自动适应列宽或行高。 最近在我们的一款应用里发现效果并没有符合预期&#xff0c;我们提供了一…

【调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包】

调试笔记-系列文章目录 调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包 文章目录 调试笔记-系列文章目录调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包 前言一、调试环境操作系统&#xff1a;Ubuntu 22.04.4 LTS编译环境调试目标 二、…

HTML、HTML5一览

文章目录 HTML简介标签基本标签格式化文本链接图像块级元素列表表格框架表单实体 HTML5 此篇用于优化csdn第一篇文章 HTML 简介 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言&#xff0c;而是一种标记语言…

数据中心的中台前端风格大屏设计开发

数据中心的中台前端风格大屏设计开发

DevOps全面综述:从概念到实践

一、背景与概述 1.1 DevOps的起源与发展 DevOps&#xff08;Development and Operations的缩写&#xff09;是软件工程领域中的一种文化和实践方法&#xff0c;旨在促进开发团队与运维团队之间的协作&#xff0c;从而实现更高效、更可靠的软件交付。DevOps起源于敏捷软件开发方…

Spring类加载机制揭秘:深度解析“准备”阶段

1. 引言 在Spring框架中&#xff0c;类加载机制是一个至关重要的环节&#xff0c;关系到Spring容器如何动态地加载、解析和管理应用程序中的类。其中&#xff0c;“准备”阶段作为类加载过程中的一个关键步骤&#xff0c;对于理解整个类加载机制具有重要意义。本文将对Spring类…

深入了解 Postman 中的变量

在我们进行 API 开发和测试时&#xff0c;使用诸如 Postman 之类的工具可以极大地简化工作流程&#xff0c;提高效率。Postman 的一个强大功能就是变量&#xff08;Variables&#xff09;。利用变量&#xff0c;我们可以使我们的请求变得更加动态和灵活&#xff0c;避免重复输入…

猫毛过敏的克星!宠物空气净化器,铲屎官的终极武器~

现在很多人都喜欢养猫&#xff0c;但约有10%的人会对猫咪产生过敏反应。常见的症状包括打喷嚏、流鼻涕&#xff0c;严重时甚至会呼吸困难。 过敏源依附在宠物的毛发和皮屑上&#xff0c;通过空气传播&#xff0c;遍布家中的各个角落&#xff0c;如地面、衣物和家具。这不仅增加…

期权和股权有哪些含义?股权和期权有哪些区别?

今天带你了解期权和股权有哪些含义&#xff1f;股权和期权有哪些区别&#xff1f;股权是有限责任公司或股份有限公司股东对公司享有的人身权和财产权的综合权利。期权是指赋予持有者在特定日期或之前以固定价格购买或出售资产的权利的合同。 期权有哪些含义&#xff1f; 期权是…