【2.2】服务拆分--服务远程调用

news2024/9/25 17:22:18

服务拆分--服务远程调用

  • 1 案例--根据订单id查询订单功能
  • 2 远程调用方式分析
    • 2.1 注册RestTemplate
    • 2.2 发http请求
  • 3 总结


1 案例–根据订单id查询订单功能

需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回。
在这里插入图片描述
由上一节的测试结果可以看出,订单模块只能查到订单信息,用户模块只能查到用户信息。而用户的需求是,进行订单查询的同时将user信息也一起查到。
因此我们要去修改订单模块的代码,当用户请求进入订单模块时,除了像之前一样查出订单信息之外,还应该根据查出来的userId去查出用户信息。
这个时候不能直接去查询用户模块的数据库,因为上一节讲到,不要开发重复模块以及其他模块的数据库是独立的。
我们只能从订单模块对用户模块发起远程调用,把查到的信息做一个组合。


2 远程调用方式分析

现在我们的User服务对外暴露了一个接口:
在这里插入图片描述
请求方式是Get,请求路径是/user/{id}
在这里插入图片描述
浏览器发请求,获得用户信息;
如果订单模块也能发出http请求,接收到用户信息,这个时候订单模块再结合本地数据库查询出来的订单信息,就可以组合出了最终的目标。
在这里插入图片描述
所以我们的问题就变成了–如何在Java代码中发起http请求。


2.1 注册RestTemplate

order-serviceOrderApplication中注册RestTemplate
在这里插入图片描述
如图添加如下代码:

 	/**
     * 创建RestTemplate对象并注入Spring容器
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

通过Bean的方式,把RestTemplate注册为Spring的一个对象。将来就可以在别的地方注入这个对象来用。


2.2 发http请求

接下来就可以利用它来发http请求。下面对订单的查询业务做修改找到OrderController:
在这里插入图片描述
可以看到在OrderController里面调用了orderService
接下来进入到orderService中(ctrl+左键):
在这里插入图片描述
可以看到订单查询完了以后,order里面是没有用户信息的,但是有用户id:
在这里插入图片描述
所以我们可以基于userId,去发起http请求查询用户信息。

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate发起http请求,查询用户
        // 2.1 url路径
        String url = "http://localhost:8081/user/"+order.getUserId();
        // 2.2 发起http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        //封装User到Order
        order.setUser(user);
        // 4.返回
        return order;
    }
}

添加的内容:

  1. 先把RestTemplate注入进来;
  2. 然后调用restTemplate函数完成发送:
    发get请求:restTemplate.getForObject();
    发post请求:restTemplate.postForObject();
    这里发送get请求;
  3. 第一个参数是url路径;注意:用户id别写死。 从Order对象里取出UserId。
  4. 得到的结果是json,但这里想要User对象。

这里restTemplate非常智能,它会问你要一个返回值类型:
在这里插入图片描述
这里告诉它要一个User对象,它会自动把json反序列化成User对象。

  1. 封装User对象到Oeder对象中;

接下来重启服务,打开浏览器:
在这里插入图片描述
在这里插入图片描述
可以看到成功查询到了用户信息。
到这里就实现了跨服务的远程调用。


3 总结

要想实现跨服务的远程调用,其实就是发送http请求。

  • 第一:向Spring容器里注入一个RestTemplate对象。
  • 第二:利用RestTemplate里面的一个方法getForObject (url路径,返回类型),它就能够帮你把返回的json转换成对应的类型。

微服务调用方式

  • 基于RestTemplate发起的http请求实现远程调用;
  • http请求做远程调用是与语言无关的调用,只要知道对方的ip,端口,接口路径,请求参数即可。

By --Suki 2022/12/31

知识内容来自于黑马程序员视频教学和百度百科。博主仅作笔记整理便于回顾学习。如有侵权请私信我。

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

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

相关文章

opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀

腐蚀与膨胀前言膨胀腐蚀开运算与闭运算礼帽与黑帽运用膨胀和腐蚀获得图像轮廓前言 有些时候图片上会有一些划痕或者污渍,会影响图片的质量,假设我有一张写有“艾醒”的图片,但是有花花绿绿的划痕和污渍,这时我们就可以运用腐蚀与…

五、Web自动化测试

Web自动化测试5.1 Selenium Web 自动化5.1.1 Selenium 和 Robot Framework SeleniumLibrary 库介绍安装 robotframework-seleniumlibrary导入 SeleniumLibrary5.1.2 Open Browser 和 Close Browser5.1.3 Input Text5.1.4 Click Button5.1.5 Click Element5.1.6 Click Link5.1.7…

2022CTF培训(十)IOT 相关 CVE 漏洞分析

附件下载链接 这里选择的设备是一款家用路由器,型号为 D-Link DIR-850L(EOL) 。由于该款路由器已停产,官网无法下载到固件,不过目前这个网站还能下载到相关的固件,当然附件中也会提供需要分析的固件。 固件解密 以 DIR850LB1_FW…

归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)

目录 一、概念 1、归一化(Normalization): 2、标准化(Standardization): 3、中心化/零均值化(zero-centered): 二、联系和差异: 三、标准化和归一化的多种…

Faster RCNN网络源码解读(Ⅵ) --- RPN网络代码解析(上)RPNHead类与AnchorsGenerator类解析

目录 一、代码作用(rpn_function.py) 二、代码解析 2.1 RPNHead类 2.2 AnchorsGenerator类 2.2.1 初始化函数__init__ 2.2.2 正向传播过程 forward 2.2.3 set_cell_anchors生成anchors模板 2.2.4 generate_anchors生成anchors 2.2.5 cached_g…

【Linux】vim 中批量添加注释

本期主题:vim 中批量添加注释博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐 此文主要介绍两种方法:方法一 :块选择模式;方法二: 替换命令 &#x…

Java基础随手记

数组 数组的使用 数组可以存放多个同一类型的数据,数组也是一种数据类型,是引用类型。即:数组就是一组数据 问题引入 传统的解决方式 使用数组来解决 可以看到,我们创建了一个double类型元素的数组,将我们要计算…

buuctf-misc-[GKCTF 2021]你知道apng吗1

先下载附件,快要过年了,十二月份还没发过文章,紧急写一篇。 下载文件后缀名为apng 搜索一下APNG(基于PNG的位图动画格式)_百度百科 利用火狐浏览器可以打开 类似gif图片的格式,用专门工具进行拆解&#xf…

MySQL内部的核心组件

mysql前言 1.MySQL的驱动 2.数据库的连接池 3.MySQL的工作线程 4.SQL接口 5.SQL解析器 6.查询优化器 7.执行器组件 8.存储引擎接口 1.MySQL的驱动是做什么的? 尤其记得刚刚学习MySQL的时候,引入的pom坐标:mysql-connector-java,这…

软考- 计算机组成原理与体系结构

【考点梳理】 考点1、数据的表示(★★★★) 考点1.1、进制的转换 【考法分析】 本考点的基本考法是与内存地址计算、IP地址计算结合考查。 【要点分析】 1、十进制转R进制(短除法); 2、R进制转十进制&#xff0…

Arduino与Proteus仿真实例-WS2812实现音乐氛围灯仿真

WS2812实现音乐氛围灯仿真 本文将使用WS2812实现一个音乐氛围灯。Arduino通过检测音频信号强度,然后转换成W2812灯带驱动信号,从而实现音乐氛围灯。 WS2812的驱动和使用在前面的文章中作了详细的介绍,请参考: Arduino与Proteus仿真实例-WS2812-RGB-LED灯带酷炫效果仿真Ar…

【软件质量】软件质量分析总结报告

软件质量-----“软件与明确地和隐含地定义的需求相一致的程度” 一、质量的概念 Ⅰ、传统的质量概念:产品性能是否符合技术规范 Ⅱ、质量是一组固有特性满足要求的程度 Ⅲ、适用性质量 Ⅳ、质量不仅指产品质量,也指过程和体系的质量 二、软件质量 Ⅰ、产品质…

教你如何用一行Python代码实现GUI图形界面

文章目录一、选择文件夹二、选择文件三、选择日期四、输入文本五、弹窗无按钮六、弹窗无标题七、弹窗只有OK按钮八、弹窗只有Error按钮(红色)九、显示通知窗口十、弹窗选择十一、自定义弹窗实战一、选择文件夹 首先导入PySimpleGUI库,并且用缩写sg来表示。 import…

Kubernetes 笔记(02)— 基本架构、工作机制简述、Master 组件、Node 组件

1. Kubernetes 的基本架构 Kubernetes 采用了现今流行的“控制面 / 数据面”(Control Plane / Data Plane)架构,集群里的计算机被称为“节点”(Node),可以是实机也可以是虚机,少量的节点用作控制…

【CUDA入门笔记】GPU存储结构模型(2)

GPU存储结构模型 1.CPU可以读写GPU设备中的Global Memory、Constant Memory以及Texture Memory内存储的内容;主机代码可以把数据传输到设备上,也可以从设备中读取数据; 2.GPU中的线程使用Register、Shared Memory、Local Memory、Global Me…

python网络程序设计,TCP协议客户端服务端智能聊天设计

计算机网络基础知识 网络体系结构,分层设计的好处 网络协议三要素:语法、语义、时序 常见应用层协议:ftp、http、smtp、pop3、telnet…… 传输层主要概念:TCP、UDP、端口号 IP地址 MAC地址 计算机网络基础知识 IP地址 1.IP地址 …

内核RCU的一次实践——实战中加深了理解

遍历内核链表是个常规操作,遍历链表过程可能会向链表增加新成员或者从链表剔除老成员,因此遍历链表时一般需要spin lock加锁保护。如果向链表增加新成员或者从链表剔除老成员不经常出现,大部分只是遍历查询链表中成员,此时链表遍…

Spring Cloud:eureka注册中心

在传统的单体应用中,所有的业务都集中在一个服务器中,当浏览器发起请求时,通过前端请求调用后端接口,后端接口调用相应的业务并在前端进行响应,整个的调用就是从请求到响应的一条龙服务。所以不存在服务之间的中转&…

jetson nano GPIO引脚控制舵机

文章目录一.舵机介绍二.舵机工作原理180度舵机360度舵机三.利用jetson nano GPIO控制舵机1.jetson nano与舵机接2.c编写程序输出脉冲(Qt做界面)一.舵机介绍 舵机,是指在自动驾驶仪中操纵飞机舵面(操纵面)转动的一种执行部件。分有&#xff1a…

代码随想录算法训练营第十三天(栈与队列)| 239. 滑动窗口最大值,347.前 K 个高频元素

代码随想录算法训练营第十三天(栈与队列)| 239. 滑动窗口最大值,347.前 K 个高频元素 239. 滑动窗口最大值 之前讲的都是栈的应用,这次该是队列的应用了。 本题算比较有难度的,需要自己去构造单调队列,建…