微服务——远程调用

为什么需要远程调用?

        在微服务架构中,每个服务都是独立部署和运行的,它们之间需要相互协作以完成复杂的业务逻辑。因此,远程调用成为微服务之间通信的主要方式。通过远程调用,一个服务可以请求另一个服务执行某些操作或获取所需数据,从而实现服务的解耦和复用。

        例如:在商城项目拆分中购物车业务中需要查询商品信息,但商品信息查询的逻辑全部迁移到了item-service服务,导致我们无法查询。最终结果就是查询到的购物车数据不完整,因此要想解决这个问题,我们就必须改造其中的代码,把原本本地方法调用,改造成跨微服务的远程调用(RPC,即Remote Produce Call)。

查询购物车列表的流程图:

远程调用的方式

微服务远程调用的方式多种多样,主要包括以下几种:

  1. HTTP/REST
    • 使用HTTP协议进行同步调用,通常使用JSON或XML作为数据交换格式。
    • 优点:简单、通用性强、可跨语言、跨平台。
    • 缺点:消息封装较为臃肿,对于大量数据或频繁调用的场景可能不是最优选择。
  2. RPC(远程过程调用)
    • 允许像调用本地方法一样调用远程服务的方法。
    • 优点:通信速度快、效率高、可自定义数据格式。
    • 缺点:限制于开发语言环境,跨语言和跨平台能力较弱。
  3. 消息队列
    • 通过消息队列进行消息传递,实现服务之间的解耦。
    • 优点:高可用性、高可扩展性、低耦合性。
    • 缺点:实时性较弱,可能不适用于所有场景。
  4. 事件总线
    • 发布/订阅模型,通过事件进行通信。
    • 优点:解耦程度高、灵活性好。
    • 缺点:实现复杂度较高,需要维护事件的定义和订阅关系。

远程调用的实现框架

在微服务架构中,有多种框架支持远程调用,以下是一些常见的实现框架:

  1. RestTemplate
    • Spring 提供的用于访问 Rest 服务的客户端。
    • 提供了多种便捷访问远程 HTTP 服务的方法。
    • 示例代码:通过配置类注入 RestTemplate Bean,并在 Controller 中使用它发送 HTTP 请求。
  2. Feign
    • Netflix 开发的声明式、模板化的 Http 客户端。
    • 通过处理注解相关信息生成 Request,并对调用返回的数据进行解码。
    • OpenFeign 是 Spring Cloud 在 Feign 的基础上增加了对 SpringMVC 注解的支持。
    • 示例代码:定义 Feign 客户端接口,使用 @FeignClient 注解指定要调用的服务,并在接口方法上使用 SpringMVC 注解定义请求路径和参数。
  3. gRPC
    • Google 开源的高性能、跨语言的 RPC 框架。
    • 使用 Protocol Buffers 作为接口描述语言。
    • 适用于对性能要求较高的场景。
  4. Dubbo
    • 阿里巴巴开源的 Java RPC 框架。
    • 支持多种序列化方式,适用于 Java 微服务架构。

我们以RestTemplate为例,RestTemplate其中提供了大量的方法,方便我们发送Http请求,例如:

可以看到常见的Get、Post、Put、Delete请求都支持,如果请求参数比较复杂,还可以使用exchange方法来构造请求。

我们在服务中定义一个配置类:

先将RestTemplate注册为一个Bean:(首先需要去声明request method)

package com.hmall.cart.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RemoteCallConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

接下来,我们修改service中的服务实现类中方法,发送http请求到service

可以看到,利用RestTemplate发送http请求与前端ajax发送请求非常相似,都包含四部分信息:

  • ① 请求方式(master枚举:get、post等)

  • ② 请求路径(请求的URL路径里面包含的首先就是请求的IP,然后是请求端口,最后才是真正的资源路径)

  • ③ 请求参数(查询默认情况下服务端返回都是JASON格式的,但是Rest template可以帮你转成你想要的java类型。比如查到的是个user,那就可以写成user.class。它就会返回一个user,会把你查到的JASON的字符串反序列化)

  • ④ 返回值类型(请求中如果有参数,比如说有路径占位符参数,可以使用map指定这个参数
    map里面要指定一个key和value,key要跟占位符一致,value就是你的具体的参数)

在实现类中使用Rest template

最常规的方法是autowear注入

        但是这种方式spring是不推荐的,它推荐采用构造函数注入,写一个构造函数spring也能帮你做自动注入。

但是假如成员变量很多,那构造函数的列表就会非常长。所以使用lombok可以帮助我们去自动生成构造函数。

什么是lombok库?

        Lombok是一个Java库,它可以帮助开发者自动生成getter和setter方法、构造函数、equals、hashCode和toString方法等,从而减少样板代码,提高开发效率。

  1. @AllArgsConstructor:这个注解会为类生成一个包含所有参数的构造函数。如果不希望某个变量成为构造函数的一部分,那么不应该使用这个注解。

  2. @RequiredArgsConstructor:这个注解会为需要特殊处理的字段(如final字段和被@NonNull注解的字段)生成一个构造函数。这样,只有这些“必需”的字段才会被包含在构造函数中。

  3. final字段:如果将某个字段声明为final,那么它必须在声明时或在构造函数中进行初始化。使用@RequiredArgsConstructor注解时,Lombok会自动为这些final字段生成一个构造函数,以确保它们被正确初始化。

  4. 手动初始化:如果已经在字段声明时对其进行了初始化,那么即使使用了@AllArgsConstructor@RequiredArgsConstructor注解,该字段也不会被包含在自动生成的构造函数中,因为它已经被初始化了。

实现类的方法的完整代码如下:

private void handleCartItems(List<CartVO> vos) {// TODO 1.获取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品// List<ItemDTO> items = itemService.queryItemByIds(itemIds);// 2.1.利用RestTemplate发起http请求,得到http的响应ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ",")));// 2.2.解析响应if(!response.getStatusCode().is2xxSuccessful()){// 查询失败,直接结束return;}List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {return;}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if (item == null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}
}

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

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

相关文章

数学建模国赛获奖技巧

一、团队分工合作的技巧&#xff08;三角形配合&#xff09; &#xff08;1&#xff09;队长要组织多沟通多交流&#xff1b; &#xff08;2&#xff09;建议定期开组会&#xff0c;互相讲授自己学习的东西&#xff0c;一人学习&#xff0c;三人收获。 二、AI辅助思路解析&am…

Eureka 原理与实践全攻略

一、Eureka 概述 Eureka 在微服务架构中具有举足轻重的地位。它作为服务注册与发现的核心组件&#xff0c;为分布式系统中的服务管理提供了关键支持。 Eureka 的主要功能包括服务注册、服务发现、服务健康监测和自我保护机制。服务注册功能使得服务提供者能够在启动时将自身的…

【Unity】移动端草海解决方案

草海是开放大世界渲染的必不可少的因素&#xff0c;Unity 原生的 Terrain 草海效率较低&#xff0c;而且无法与 RVT 结合起来&#xff0c;无法在移动端上实现。因此我们自己搓出来一套草海系统&#xff0c;使用 C# 多线程辅助运算&#xff0c;并能支持割草、烧草等进阶玩法。草…

系统编程 网络 http协议

http协议------应用层的协议 万维网&#xff1a;http解决万维网之间互联互通 计算机web端网络只能看到文字 1.如何在万维网中表示一个资源&#xff1f; url <协议>&#xff1a;//<主机>&#xff1a;<端口>/<路径> ------------------------------…

2024软件测试面试,别玩这些题目,轻松拿捏百分之95的测试!

1、你会封装自动化测试框架吗&#xff1f; 自动化框架主要的核心框架就是分层PO模式&#xff1a;分别为&#xff1a;基础封装层BasePage&#xff0c;PO页面对象层&#xff0c;TestCase测试用例层。然后再加上日志处理模块&#xff0c;ini配置文件读取模块&#xff0c;unittest…

计算机毕业设计--基于深度学习(PSPNet、空洞卷积Atrous Convolutions)的多类型图像通用分割模型

基于深度学习(PSPNet、空洞卷积Atrous Convolutions)的多类型图像通用分割模型 更多基于深度学习的毕业设计请关注专栏 --- 计算机毕业设计 ✨ 动物图分割&#xff08;使用训练集DIS5K-TR&#xff0c;DIS-TEs&#xff0c;DUTS-TR_TE &#xff09; ✨自然与人类图像分割&#xf…

[CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - MultiModal篇

[CLIP-VIT-L Qwen] 多模态大模型源码阅读 - MultiModal篇 前情提要源码阅读导包逐行讲解 dataclass部分整体含义逐行解读 模型微调整体含义逐行解读 MultiModal类整体含义逐行解读 参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE 前情提要 有关多模态大模型架构中的…

搭建智能客服机器人:langgraph实现用户订单管理

大家好&#xff0c;今天我们将创建一个智能客服机器人&#xff0c;它能够记录用户的食物订单到真实数据库中&#xff0c;并允许用户查看他们的订单。这是一个相对高级的Langgraph项目&#xff0c;大家可以先看一下前面介绍的Langgraph的基础课程。 项目概述 我们要构建的系统…

mysqldump + python 定时备份数据库

场景&#xff1a; 需要对mysql进行定时备份&#xff0c;受限于硬盘空间的大小&#xff0c;需要对备份的数据需要定时清理 python代码实现&#xff1a; # -*- coding:UTF-8 -*- """ProjectName : HotelGo2DelonixPmxFileName : fix_missing_ratesDescripti…

《通义千问AI落地—下》:WebSocket详解

一、前言 文本源自 微博客 且已获授权,请尊重版权。 《通义千问AI落地——下篇》如约而至。Websocket在这一类引用中,起到前后端通信的作用。因此,本文将介绍websocket在这类应用场景下的配置、使用、注意事项以及ws连接升级为wss连接等;如下图,本站已经使用了wss连接…

python实用教程(一):安装配置anaconda(Win10)

下一篇&#xff1a;python实用教程&#xff08;二&#xff09;&#xff1a;安装配置Pycharm及使用(Win10)-CSDN博客 1、简介及下载 Anaconda 是一个开源的 Python 和 R 语言的发行版&#xff0c;专为科学计算、数据分析、机器学习和大数据处理而设计。它包含了众多常用的数据…

【Python】列表和元组

文章目录 概念创建列表访问下标通过下标来修改列表元素获取列表长度下标可以写成负数 切片操作省略后边界省略前边界省略前后边界带有步长的切片 遍历列表元素使用 for 循环使用 for 循环访问下标的方式使用 while 循环 新增元素在末尾新增在任意位置新增 查找元素判定元素是否…

Python酷库之旅-第三方库Pandas(096)

目录 一、用法精讲 411、pandas.DataFrame.values属性 411-1、语法 411-2、参数 411-3、功能 411-4、返回值 411-5、说明 411-6、用法 411-6-1、数据准备 411-6-2、代码示例 411-6-3、结果输出 412、pandas.DataFrame.axes属性 412-1、语法 412-2、参数 412-3、…

背包问题【算法 07】

背包问题 背包问题是经典的计算机科学问题之一&#xff0c;涉及到如何在有限资源的约束下&#xff0c;选择最优的物品组合&#xff0c;以最大化收益。这个问题在现实中有广泛的应用&#xff0c;例如资源分配、物流调度和投资组合优化等。本文将详细介绍背包问题的定义、解决方法…

iphone问题笔记

拼音打字显示一些不相干的词 原因&#xff1a;开启了自动改正&#xff0c;傻逼iphone总以为你打错了。 计算器没有退格键&#xff1f; 解决方法&#xff1a;按住数字往右滑是退格。 关机重启必须去设置里&#xff1f; 连按五次锁屏可以选择关机。

如何选择适合自己的开放式耳机?五款实力出众爆款安利!

开放式耳机以其不侵入耳道的设计&#xff0c;为耳朵提供了更轻的负担&#xff0c;同时保护了耳道健康&#xff0c;这与传统的头戴式或入耳式耳机相比&#xff0c;在长时间佩戴时更能减少不适感。市场上的开放式耳机种类繁多&#xff0c;要找到一款真正满意的产品可能有些困难。…

文件—python

一、文件编码 对于同一份文件&#xff0c;人的视角和计算机的视角是不相同的&#xff0c;人看到的是文字&#xff0c;计算机看到的0和1组成的编码。因为计算机只能识别0和1&#xff0c;无法直接识别文字&#xff0c;那我们是如何在电脑上看到文字的呢&#xff1f; 计算机按照一…

【逐行注释】MATLAB下的IMM-EKF代码

IMM-EKF 基于EKF的多模型交互。以CV和CT两个模型进行交互&#xff0c;这里对代码进行逐行注释。 注释较多&#xff0c;个人理解的时候如果有误&#xff0c;欢迎指正。 每一行都有注释&#xff1a; 模型概况 二维平面上的运动模型&#xff0c;由CV和CT构成&#xff0c;基于…

C++:vector篇

前言&#xff1a; 本篇仅介绍vector中常用的函数接口&#xff0c;如果需要详细的请到官网查看。 vector是一种动态数组&#xff0c;能够自动调整大小。与数组类似&#xff0c;vector使用连续内存来存储元素&#xff0c;允许高效访问&#xff0c;但可以动态增加容量。为了应对容…

达梦数据库的系统视图v$tablespace

达梦数据库的系统视图v$tablespace 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$TABLESPACE 提供了有关数据库中的表空间&#xff08;Tablespace&#xff09;信息。这些信息对于管理数据库存储和优化性能非常关键。表空间是数据库逻辑存储结构的一个层次…