SpringCloud跨微服务的远程调用,如何发起网络请求,RestTemplate

在我们的业务流程之中不一定都会是自己模块查询自己模块的信息,有些时候就需要去结合其他模块的信息来进行一些查询完成相应的业务流程,但是在SpringCloud每个模块都相对独立,数据库也有数据隔离。所以当我们需要其他微服务模块的信息的时候,就需要跨模块调用发起网络请求。

就像电商项目中,购物车模块就不得不需要像商品模块发起查询请求。购物车业务中需要查询商品信息,但商品信息查询的逻辑全部迁移到了item-service服务,导致我们无法查询。

最终结果就是查询到的购物车数据不完整,因此要想解决这个问题,我们就必须改造其中的代码,把原本本地方法调用,改造成跨微服务的远程调用(RPC,即Remote Produce Call)。

因此,现在查询购物车列表的流程变成了这样:

那么:我们该如何用Java代码发送Http的请求呢?

RestTemplate

Spring给我们提供了一个RestTemplate的API,可以方便的实现Http请求的发送。

rg.springframework.web.client public class RestTemplate

extends InterceptingHttpAccessor

implements RestOperations

----------------------------------------------------------------------------------------------------------------

同步客户端执行HTTP请求,在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模板,此外还提供了支持不太常见情况的通用交换和执行方法。 RestTemplate通常用作共享组件。然而,它的配置不支持并发修改,因此它的配置通常是在启动时准备的。如果需要,您可以在启动时创建多个不同配置的RestTemplate实例。如果这些实例需要共享HTTP客户端资源,它们可以使用相同的底层ClientHttpRequestFactory。 注意:从5.0开始,这个类处于维护模式,只有对更改和错误的小请求才会被接受。请考虑使用org.springframework.web.react .client. webclient,它有更现代的API,支持同步、异步和流场景。

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

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

我们在需要的微服务中定义一个配置类:

在启动类中先将RestTemplate注册为一个Bean:

@SpringBootApplication
public class CartApplication {
    public static void main(String[] args) {
        SpringApplication.run(CartApplication.class, args);

    }


    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

远程调用

接下来,我们修改cart-service中的实现类的handleCartItems方法,发送http请求到item-service

// 2.查询商品
//        List<ItemDTO> items = itemService.queryItemByIds(itemIds);
        //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.解析响应
        if (!response.getStatusCode().is2xxSuccessful()){
            //查询失败,结束
            return;
        }
        List<ItemDTO> items = response.getBody();
        if (CollUtils.isEmpty(items)) {
            return;
        }

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

  • ① 请求方式

  • ② 请求路径

  • ③ 请求参数

  • ④ 返回值类型

@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {

    private final RestTemplate restTemplate;

使用@RequiredArgsConstructor注解可以把final修饰的变量视为常量产生构造方法,比@AllArgsConstructor更适合

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NuGet 中国国内镜像

有时候网络不好&#xff0c;需要使用国内的一些镜像源。 华为资源&#xff1a; https://repo.huaweicloud.com/repository/nuget/v3/index.json 腾讯资源&#xff1a; https://mirrors.cloud.tencent.com/nuget/ 微软中国镜像源&#xff1a;https://nuget.cdn.azure.cn/v3…

BIOTIN-Gly-Asp-Gly-Asp-Glu-Val-Asp-Gly-Cys 生物素标记多肽

BIOTIN-Gly-Asp-Gly-Asp-Glu-Val-Asp-Gly-Cys 生物素标记多肽 生物素标记多肽的特点 高亲和力结合&#xff1a;生物素与链霉亲和素&#xff08;streptavidin&#xff09;或抗生物素蛋白&#xff08;avidin&#xff09;之间的结合是生物学上已知的最强的非共价相互作用之一。这种…

大模型知识大全2-资源【大模型】

文章目录 可用的模型部分模型的训练规模和数据常用数据集外文中文书籍和论文百科数据代码混合数据集微调数据集对齐数据集 可用的模型 仅记录中文可用的表现较优的模型LLaMA、LLaMA2、LLaMA3&#xff08;规模在7,13,30,65左右&#xff0c;需要搭配ChineseLLaMA的LoRA权重使用&…

Mybatis操作和动态SQL

Mybatis操作 准备 准备数据库表 emp 创建一个新的 springboot 工程&#xff0c;选择引入对应的起步依赖&#xff08; mybatis 、 mysql 驱动、 lombok &#xff09; application.properties 中引入数据库连接信息 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driv…

关于Linux的操作作业!24道题

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

文章SameStr(四):图4代码

“Publication Figure 4” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special library(caret) library(plotROC) library(tidymodel…

To美术-渲染管线及优化方向(CPU方向)

一、CPU与GPU 1、CPU与GPU的区别 橙黄色&#xff1a;控制单元   橙红色&#xff1a;存储单元  绿色&#xff1a;计算单元 CPU:结构组成复杂、控制逻辑丰富&#xff0c;计算量小&#xff0c;适合复杂运算 GPU&#xff1a;结构组成简单&#xff0c;核心数量多&#xff0c;计…

jmeter-beanshell学习5-beanshell加减乘除运算

我用到的场景是计算金额&#xff0c;所以主要以金额为主&#xff0c;感觉这部分有点麻烦&#xff0c;直接写遇到的几个坑&#xff0c;就不演示解决的过程了。 1.最早写了个两数相减&#xff0c;但是小数精度容易出现问题。比如1-0.010.989999997这种情况&#xff0c;随便写的几…

Windows 电脑查看 WiFi 密码的方法都有哪些?

从设置面板中查看 当你使用的是笔记本电脑并且连接 WiFi 之后可以在设置面板中查看 WiFi 密码&#xff0c;首先打开设置界面&#xff0c;然后点击网络和 Internet&#xff0c;找到 WiFi 之后点击进入&#xff0c;然后点击管理已知网络。 然后点击已经连接好的无线网络。 进入之…

前端Din字体和造字工房力黑字体文件

Din 字体是一种经典的、简洁的无衬线字体&#xff0c;它源自1930年代的德国交通标志设计。 造字工房力黑字体适用于数字&#xff0c;驾驶舱标题等统计界面 DIN-Medium.otf 案例 造字工房力黑.TTF 案例

最新综述:多模态引导的基于文生图大模型的图像编辑算法

文章目录 综述亮点1. 图像编辑任务的范围2. 一般性编辑算法的统一框架3. 统一框架在多模态编辑任务中的应用4. 不同组合在文本引导编辑场景下的比较5. 未来研究方向 近期&#xff0c;复旦大学 FVL 实验室和南洋理工大学的研究人员对于多模态引导的基于文生图&#xff08;Text-t…

nvidia driver和cuda版本较低,ubuntu系统更新nvidia驱动的方法(对于小白最快最最保险的方法)

问题描述&#xff1a; 系统&#xff1a;ubuntu22.04LTS 这两天安装另一个低版本的pytorch环境&#xff0c;提示我的cuda版本很旧&#xff0c;然后运行程序时候甚至直接报错&#xff0c;如下所示&#xff1a; .local/lib/python3.10/site-packages/torch/cuda/__init__.py&quo…

DBA 数据库管理 部署Mysql 服务,基础查询

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

渲染引擎实践 - OSG引擎窗口创建过程分析(未完待续)

一&#xff1a;概述 一个3D应用程序&#xff0c;要想显示渲染结果&#xff0c;首先要创建一个窗口&#xff0c;本节就分析下OSG源码中窗口创建的过程。 二: OSG中的窗口类介绍 以GraphicsWindowX11为例&#xff0c;在Linux上用这个窗口类&#xff0c;Windows上用GraphicsWindo…

新版Android Studio中设置gradle的JDK版本

旧版android studio 在旧版&#xff08;具体哪个版本号之前搞不清了&#xff09;中设置JDK版本在>File——>Project Structure——>SDK location——>Gradle Setting——>Gradle SDK 新版android studio 某次更新后发现SDK location下找不到Gradle Setting选项…

SpringBoot源码阅读(5)——AnnotationAwareOrderComparator排序

SpringBoot中工厂类加载器加载的实现类通常有多个&#xff0c;这些类通常会排序后放入集合 AnnotationAwareOrderComparator是常用的比较器 AnnotationAwareOrderComparator 父类&#xff1a;OrderComparator 接口&#xff1a;Comparator 相关方法 public static void sort(…

智能汽车网络安全笔记

汽车五大域 动力底盘、车身控制、智能座舱、智能网联和高级辅助驾驶五大域 国外汽车安全法规标准 汽车网络安全管理体系&#xff08;CSMS&#xff09; CSMS指的是管理汽车的网络威胁和风险&#xff0c;并保护车辆免受网络攻击的组织过程和管理系统 安全验证和安全测试 8…

[RL4CO实践]checkpoint早知道

最近写深度学习需要感觉到了checkpoint的重要性&#xff0c;他可以让你在上一次实验的基础上进行优化 我写的是在rl4co的基础上进行的&#xff0c;pytorch的可能不一样 我的save_last 取的Fasle&#xff0c;我本来觉得不需要用last&#xff0c;对于平局reward&#xff0c;我去…

Kudu分区策略

Kudu表的分区策略主要有三种&#xff1a;范围分区&#xff08;Partition By Range&#xff09;、哈希分区&#xff08;Partition By Hash&#xff09;和高级分区&#xff08;Partition By Hash And Range&#xff09;。这些策略都要求分区字段必须包含在主键中。 范围分区&…

Android面试题之Activity的启动模式和flag

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 Activity中的几种启动模式 activity的几种启动模式是android中常考的知识点&#xff0c;一般会考察有哪几种启动模式&#xff0c;以及每种启动…