SpringBoot项目模块间通信的两种方式

news2024/10/7 5:29:44

说明:在微服务架构开发中,一个请求是通过模块之间的互相通信来完成的,如下面这个场景:

创建两个子模块:订单模块(端口8081)、用户模块(端口8082),两个模块之间没有联系,现在需要查询订单,根据订单中的用户ID,查询该订单对应的用户信息。

(两个模块是独立的)

在这里插入图片描述


用户实体类

import lombok.Data;

import java.io.Serializable;

/**
 * 用户
 */
@Data
public class User implements Serializable {

    /**
     * ID
     */
    private Long id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 地址
     */
    private String address;
}

订单实体类,查询订单需要补充用户信息

import lombok.Data;

import java.io.Serializable;

/**
 * 订单
 */
@Data
public class Order implements Serializable {

    /**
     * ID
     */
    private Long id;

    /**
     * 价格
     */
    private Double price;

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 商品名
     */
    private String name;

    /**
     * 商品数量
     */
    private Integer num;

    /**
     * 用户信息
     */
    private User user;
}

此时,因为订单模块中没有用户业务,是没有对应的UserMapper类操作数据库的。这就需要向用户模块发送请求,并传递用户ID,由用户模块里对应的方法去操作数据库,返回用户信息。可以用以下两种方式实现。

方式一:Hutool工具包

可使用Hutool工具包中的get(),向用户模块发送查询用户信息请求;

    @Override
    public Order getOrder(Long id) {

        Order order = orderMapper.getOrder(id);

        // 向用户模块发送请求
        String s = HttpUtil.get("http://localhost:8082/user?id=" + order.getUserId());

        // 解析相应结果
        User user = JSONUtil.toBean(s, User.class);

        order.setUser(user);

        return order;
    }

方式二:RestTemplate

使用RestTemplate中的getForEntity()方法,也可以达到同样的效果,使用前,需要手动添加该类到IOC容器中;

(手动添加Bean到IOC容器中)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AddBean {

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

(使用RestTemplate的getForEntity方法,向用户模块发送请求)

    @Autowired
    private RestTemplate restTemplate;
	
    @Override
    public Order getOrder(Long id) {

        Order order = orderMapper.getOrder(id);

        // 使用restTemplate的getForEntity()方法向用户模块发送请求
        ResponseEntity<User> entity = restTemplate.getForEntity("http://localhost:8082/user?id=" + order.getUserId(), User.class);

        // 响应结果是一个response实例,先判断响应状态码是不是成功
        if (entity.getStatusCode().is2xxSuccessful()) {
            
            // 取出响应数据使用
            User user = entity.getBody();
            order.setUser(user);
        }

        return order;
    }

restTemplate.getForEntity()方法返回值类型

在这里插入图片描述

测试

postman测试,两者都可以达到相同的效果

在这里插入图片描述

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

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

相关文章

Vue周日历展示大学课程

最近在做日历展示课程&#xff0c;网上也寻找了一些控件 例如&#xff1a;在Vue中引入fullcalendar制作课程表 还有 课程表插件Timetables 感觉效果都不错&#xff0c;而且这个控件还是开源的&#xff0c;大家有需要的都可以去下载试用&#xff0c;我需要的控件可能大致和这个…

Node中http请求body参数解析

1.request 说明&#xff1a;request本质就是一个可读流&#xff0c;因此需要转码。 req.setEncoding("utf-8") 2.声明变量 let isLogin 说明&#xff1a;判断是否登录 3.读取 req.on("data",(data)>{ const loginInfoJSON.parse(data)console.log(JSO…

最细最全,Jmeter获取jdbc数据4种方法-超详细,看这篇足够...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 jmeter使用jdbc协…

【接口/性能测试】Jmeter引用 jar包的三种方式(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 实现对登录密码进…

2023-7-11-第十六式职责链模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

文件格式化读写

#include<stdio.h> #include<stdlib.h> int main() {FILE* fpfopen("D:/a.txt","r");if(!fp) return -1;char* p(char*)malloc(sizeof(char*)*1024);fscanf(fp,"%s",p);//读取文件中的内容&#xff0c;遇到换行和空格停止 printf(&q…

运行lumpyexpress时报错:can‘t open file ‘/opt/python27/lumpy_sv/scripts/bamkit/bam

在利用lumpyexpress进行SV鉴定时&#xff1a; lumpyexpress -P -B ../data/S1.sort.markdup.bam -S S1.splitters.bam -D S1.discordants.bam -o $sample.lumpy.vcf Sourcing executables from /data/home/hgzhong/home/software_set/python27/lumpy_sv/lumpy-sv/bin/lumpyex…

网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)

目录 Java网络编程中的常用类 TCP通信的实现和项目案例 TCP通信入门案例 TCP单向通信 TCP双向通信 创建点对点的聊天应用 一对多应用 一对多聊天服务器 Java网络编程中的常用类 Java为了跨平台&#xff0c;在网络应用通信时是不允许直接调用操作系统接 口的&#xff0…

GitKraken 6.5.1免费中文版安装

今天发现SmartGit上传不了代码了, 看了一下过期了, 我不想花钱买, 就找个替代工具, 方便写代码, 方便合并代码, 方便点击提交代码, 免得敲命令浪费时间. 安装 6.5.1 版本 下载版本,已上传到 CSDN :GitKraken 6.5.1免费中文版安装更换快捷方式 C:\Users\kentrl\AppData\Local\…

2、部署Git服务器-Windows环境部署Gitea

目录 1. 说明2. 环境准备3. 安装部署3.1 安装Git3.2 安装Gitea3.3 将 Gitea 注册为 Windows 服务&#xff08;可选&#xff09;3.4 启用 Gitea 内置的 SSH 服务器&#xff08;可选&#xff09;3.5 编辑 Windows 防火墙 Gitea是一个自托管的Git服务&#xff0c;类似于GitHub、Gi…

图形编辑器开发:参考线吸附功能,让图形自动对齐

最近我给图形编辑器增加了参照线吸附功能&#xff0c;讲讲我的实现思路。 我正在开发的图形设计工具&#xff1a; https://github.com/F-star/suika 线上体验&#xff1a; https://blog.fstars.wang/app/suika/ 效果是被移动的图形会参考周围图形&#xff0c;自动与它们进行吸附…

Linux配置静态IP

Linux配置静态IP 提示&#xff1a;本地虚拟机模拟服务器配置静态IP&#xff0c;大家如果有云服务器也是一样的&#xff0c;后期会出关于云服务器如何配置静态IP 文章目录 Linux配置静态IP一、IP地址的简单介绍二、查看虚拟机的中的网关IP地址三、编辑网络配置文件四、SSH连接五…

码中寻趣:低码专家与开发者的「神秘会议」 ——华为云Astro扫地僧出山

迅速推进的数字生态让软件开发门槛越来越高&#xff0c;新手们无疑面临艰巨挑战&#xff0c;而低代码技术显然是绝佳应对方案&#xff0c;让全民用较短的时间开发出工业级应用。 HDC.Cloud 2023扫地僧见面会汇聚华为云资深专家和充满好奇心的开发者。 当刺耳手机铃和颤动的讨论…

GitHub 集成 Murphysec 实现实时代码检测

1. GitHub 集成 Murphysec 效果 将 MurphySec 代码安全检测工具集成到 GitHub Action 中&#xff0c;可对每一次代码更新实时进行安全漏洞检测&#xff0c;并快速修复这些安全漏洞。 集成效果图 2. 操作步骤 提示&#xff1a;如果您使用过 GitHub Actions 请直接按照第3步开始…

Excel二级联动下拉列表(横向字典配置)

二级联动下拉列表 1. Excel内新建sheet用来存放二级联动列表 2. 新建省份名称引用 在省市字典下&#xff0c;单击A1单元格&#xff0c;选择公式->名称管理器->新建&#xff0c;名称为省份&#xff0c;引用位置为OFFSET(省市字典!$A$1,0,0,COUNTA(省市字典!$A:$A))&…

【 Python 全栈开发 - 人工智能篇 - 41 】线性回归算法

文章目录 一、简介1.1 什么是线性回归&#xff1f;1.2 线性回归在人工智能中的应用预测分析特征工程异常检测 1.3 Python 在人工智能中的角色数据处理和分析机器学习和深度学习自然语言处理 二、理解线性回归2.1 线性回归的基本原理2.2 线性回归模型的假设2.3 线性回归的评估指…

string——find(),rfind()

文章目录 find&#xff08;正向查找&#xff09; 正向查抄&#xff0c;会返回要找的子串中第一字符再父串中的下标值 rfind&#xff08;逆向查找&#xff09; std::string url "https://img.bizhizu.com/2015/1231/hskdkfl.jpg";int begin url.find(/); int end …

如何写一个springboot-starter

使用场景 在目前广泛的微服务治理环境下&#xff0c;我们所开发的代码模块&#xff0c;越来越关注于某一项功能而不是宽泛的整个系统的功能。 所以在我们进行服务拆分的时候&#xff0c;经常会遇到这么一个问题&#xff0c;某些会被不同的模块重复使用&#xff0c;为了避免代…

Vue 3 中使用 Chart.js

要在 Vue 3 中使用 Chart.js&#xff0c;您需要先安装和引入 Chart.js 库&#xff0c;并创建一个 Vue 组件来承载图表。 1. 安装库 shell cnpm i chart.js moment chartjs-adapter-moment 2. 代码示例 <template><div><canvas id"chartCanvas">…

数字孪生系统如何整合CesiumJS?之后会产生什么效果?

数字孪生有关的项目中&#xff0c;智慧城市一直是一个比较重要的类型&#xff0c;但是这类智慧城市项目往往包含了大量的GIS相关数据&#xff0c;例如倾斜摄影、DEM、DOM、地形数据等。这时&#xff0c;将GIS系统融合进数字孪生系统的需求就出现了。 这时一个新的问题就出现了…