【微服务远程调用】基于RestTemplate发送HTTP请求实现微服务远程调用

news2024/11/25 4:55:49

请添加图片描述


本期目录

  • 1. 情景
  • 2. 远程调用方式分析
  • 3. 远程调用步骤
    • 3.1 注册 RestTemplate
    • 3.2 修改订单业务层
    • 3.3 测试
  • 4. 总结



1. 情景

  • 我编写的订单微服务查询订单时,无法跨越数据库查询订单所关联的用户 user 。因此下图中订单数据的 user 字段为 null

    image-20220927160707910

  • 本节,我们将演示订单微服务 order-service 如何通过远程调用用户微服务 user-service 的根据用户 ID 查询用户的接口,来查询订单的同时,把订单所属的用户信息一起返回,如下图所示。

    image-20221215092416661


2. 远程调用方式分析

  • 订单微服务 order-service 也可以像浏览器一样,向用户微服务 user-service 发起 HTTP 请求,那么用户微服务就响应对应的用户信息给订单微服务。订单微服务获取到用户数据后,再结合本地的订单数据库查询出的订单数据,就组合出了订单及其所属的用户信息。因此,现在的问题的核心就变成了:如何在 Java 代码中发起 HTTP 请求?

    image-20221215092819744


3. 远程调用步骤


3.1 注册 RestTemplate

  • RestTemplate 是 Spring 提供的发起 HTTP 请求的工具类。

    image-20221215093524151

  • 首先,我们要在订单微服务 order-serviceOrderApplication.java 应用启动类中注册 RestTemplate 。这样,将来我们就可以在任何地方注入 RestTemplate 对象来使用。

    @MapperScan("cn.itcast.order.mapper")
    @SpringBootApplication
    @Slf4j
    public class OrderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
            log.info("订单微服务启动成功");
        }
    
        // 注册RestTemplate,用来发起HTTP请求远程调用
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    

    【小贴士】

    @Bean 的注入只能放在 Spring 的配置类中。而启动类 OrderApplication.java 带有注解 @SpringBootApplication 本身也是配置类。因此,可以在启动类中写 @Bean 的注入。


3.2 修改订单业务层

  • 订单的实体类 Order.java 中,有用户 ID 的字段 userId 。因此我们可以根据字段 userId 向用户微服务发起 HTTP 请求。首先把 RestTemplate 自动注入进来。 在这里插入图片描述

  • 然后,如果你要发 GET 请求,就使用 getForObjct() 方法。其中,第一个入参 URI url 就跟浏览器向用户微服务发起的 HTTP 请求地址是一样的,如 http://localhost:8081/user/1 ;第二个入参 responseType 指的是返回值类型,RestTemplate 非常智能,正常情况下,HTTP 请求后得到的返回值一般都是 JSON 风格的字符串,但这第二个入参 responseType 指定后,RestTemplate 就会自动地帮我们把 JSON 数据反序列化成你指定的 Java 实体类对象。

    image-20221215095358455

  • OrderService.java

    @Service
    public class OrderService {
    
        @Autowired
        private OrderMapper orderMapper;
        // 自动注入RestTemplate,用于发起HTTP请求远程调用
        @Autowired
        private RestTemplate restTemplate;
    
        public Order queryOrderById(Long orderId) {
            // 1.查询订单
            Order order = orderMapper.findById(orderId);
            // 2.使用RestTemplate发起HTTP请求,查询订单所属用户信息
            // 2.1 根据查询的订单order中的userId动态生成HTTP请求的url
            String url = "http://localhost:8081/user/" + order.getUserId();
            // 2.2 发送HTTP请求,实现远程调用
            User user = restTemplate.getForObject(url, User.class);
            // 3.把远程调用获得的user封装进order对象中
            order.setUser(user);
            // 4.返回order订单信息
            return order;
        }
    }
    

3.3 测试

  • 重启两个微服务,用 Postman 向订单微服务发送根据订单 ID 查询的请求。

    image-20221215100846598

    这样,我们就成功使用 RestTemplate 实现了跨服务的远程调用。


4. 总结

  • 基于 Spring 提供的 RestTemplate 可以发起 HTTP 请求实现微服务之间的远程调用。
  • HTTP 请求做远程调用是与语言无关的调用,只要知道对方的 IP 、端口、接口路径和请求参数即可。

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

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

相关文章

【LSS: Lift, Splat, Shoot】代码的复现与详细解读

文章目录一、代码复现1.1 环境搭建1.2 数据集下载1.3 Evaluate a model1.4 Visualize Predictions1.5 Visualize Input/Output Data1.6 Train a model二、代码理解main.pyexplore.pydata.pymodels.pytools.pytrain.py原论文:https://arxiv.org/pdf/2008.05711v1.pdf…

Charles下载安装与手机调试教程

Charles下载与安装教程 1、安装目的:Charles需要收费,fiddler工具免费,想对比一下Charles抓包和fiddler抓包的异同 2、官网下载 https://www.charlesproxy.com/latest-release/download.do 3、选择合适的版本进行安装 ----------以下内容有参…

PyQt5 QtChart-曲线图

PyQt5 QtChart-QSplineSeries曲线图QSplineSeriesQSplineSeries QSplineSeries类将数据序列显示为曲线图。核心代码: spline QSplineSeries() spline.append(0, 23) spline.append(1, 56) … chart.addSeries(lineSeries) 常用方法: setPointsVisible(True) &am…

[附源码]Python计算机毕业设计高校教室管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Stm32旧版库函数11——串口发送数据 使用中断接收

#include "stm32f10x_lib.h" #include "usart.h" #include "delay.h" /* ******************************************************************************** ** 函数名称 : USART1_Configuration(void) ** 函数功能 :…

城市消费券之地理位置攻防

近期,顶象发布了《城市消费券安全调研报告》(以下简称《调研报告》)。《调研报告》从城市消费券的发放规模、核销情况、风险出发,进一步分析除了黑灰产的作弊手段以及作弊工具。 其就作弊手段而言,黑灰产哄抢城市消费…

软件工程毕业设计题目100例

文章目录0 简介1 如何选题2 最新软件工程毕设选题3 最后0 简介 学长搜集分享最新的软件工程业专业毕设选题,难度适中,适合作为毕业设计,大家参考。 学长整理的题目标准: 相对容易工作量达标题目新颖 1 如何选题 最近非常多的学…

3个条件,筛选出最趁手的财务分析工具

市面上的财务分析工具很多,但究竟哪一种更好用,更趁手?这就需要看哪个财务分析工具可做到以下3大要求。 1:是否能快速计算财务分析指标 在财务分析中,存在一个需要在行与行之间进行计算分析需求,比如在利…

[附源码]Python计算机毕业设计高校教室申请管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

网络原理 一

网络原理 本文主要是介绍TCP/IP协议这里面的核心内容,还是很重要的 TCP/IP协议的层级 应用层 传输的数据如何去使用 传输层 起点和终点的传输 网络层 中间传输过程中的路径规划 数据链路层 相邻节点的传输 物理层 这是最底层的,相当于基础设施 应用层 不同的应用程序,涉及到…

「Electron|快速开始」来写个Hello World吧

本文主要介绍如何快速使用Electron生成一个Hello World应用 文章目录主要步骤一、准备工作创建项目安装electron二、编写electron应用所需的基本内容首先,我们需要给electron应用一个入口创建窗口往窗口里面放一个HTML界面,写上"Hello World!"…

修改ik分词器源码实现直连数据库动态增量更新词汇

谈到es的中文分词器,肯定少不了ik分词器.现ik分词器有两种获取主词汇和停用词的方法: 一是通过ik\config目录下的main.dic和stopword.dic获取,但是每次修改后要重启才能生效 二是通过提供接口返回所有词汇的接口,接口路径配置在.但是该方式每次都需要将所有词汇返回,效率不高.…

大数据课设

----------------------------------------------------------------------------------------------------------------------------- 由于本人主修嵌入式方向最多使用的就是C语言,由于物联网这个专业的特殊性,javaweb没少 写,所以java也用…

Nginx动静分离

🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉Linux专栏 🔥欢迎大佬指正,一起学习!一起加油! 目录&…

[附源码]Python计算机毕业设计SSM基于Java的租房系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

论文笔记:CycleMorph: Cycle Consistent UnsupervisedDeformable Image Registration

CycleMorph: Cycle Consistent Unsupervised Deformable Image Registration 针对本篇论文个人总结: 文章最重要的点在于施加循环一致性,模型有两个网络,移动图像与固定图像互相配准过程中施加约束优化网络提高配准精度,仔细看图…

如何求解欧拉路径?

求解欧拉路径前言一、案例二、回溯三、源码四、复杂度分析五、欧拉科普总结参考文献前言 欧拉路径 从图的一个节点出发,每条边只访问一次,遍历完了所有图节点,这条路径为欧拉路径。 一、案例 二、回溯 按照上面的例子,很容易理…

【LeetCode】1945. 字符串转化后的各位数字之和

题目描述 给你一个由小写字母组成的字符串 s ,以及一个整数 k 。 首先,用字母在字母表中的位置替换该字母,将 s 转化 为一个整数(也就是,‘a’ 用 1 替换,‘b’ 用 2 替换,… ‘z’ 用 26 替换&…

计算机网络原理第1章 概述

1.1 计算机网络在信息时代中的作用 1.2 互联网概述 1.2.1 网络的网络 互联网 特指Internet,起源于美国,现已发展成为世界上最大的、覆盖全球的计算机网络。 计算机网络 (简称为网络) 由若干结点(node)和连接这些结点的链路(link)组…

玩转MySQL:一站式解决分库分表后患问题方案

引言 上篇有关分分库分表一文中已经将分库分表的方法论全面阐述清楚了,总体看下来用一个字形容,那就是爽!(手动狗头)尤其是分库分表技术能够让数据存储层真正成为三高架构,但前面爽是爽了,接着…