首页 > 其他分享 >RestTemplate远程调用与服务治理问题

RestTemplate远程调用与服务治理问题

时间:2024-10-30 10:51:22浏览次数:7  
标签:Map 调用 服务 exchange items RestTemplate 远程

                        

RestTemplate

是 Spring 提供的一个同步 HTTP 客户端,用于在 Java 应用程序中进行 RESTful API 调用。它支持多种 HTTP 方法(如 GET、POST、PUT、DELETE 等),并且能够处理 JSON、XML 和其他格式的响应。

使用场景

当应用需要从外部服务获取数据时,例如天气、支付服务、媒体数据等,可以使用 RestTemplate 发起 HTTP 请求。

微服务通信

在微服务架构中,服务之间是隔离的,一个服务可能需要调用另一个服务的 API。例如,购物车服务可以调用商品订单服务来获取数据,如:

1,声明RestTemplate

首先可以在一个配置类(如启动类)中声明RestTemplate,并交给IOC容器进行管理。

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

然后去购物车的service层发起远程调用,购物车需要用到商品的数据:

2,注入RestTemplate

在这里,我们通过构造函数实现注入。@AllArgsConstructor注解会为所有属性生成构造方法进行赋值。如果我们只想为某些特定属性生成构造方法,可以在这些属性上添加final关键字,表示它们必须被初始化且不可更改,然后使用@RequiredArgsConstructor注解,这样就只为这些属性注入了构造方法。

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

    private final RestTemplate restTemplate;
3,exchange发送客户端请求并得到响应结果

大致流程如下:客户端发出请求后,另一个服务的控制器方法将接收此请求并返回结果。

itemIds是一个包含所有商品ID的已处理Set集合。

Map.of()是一个静态方法,用于创建一个不可变的键值对Map,这个Map用于处理占位符的参数。

CollUtils.join(itemIds, ",")的作用是将Set集合中的元素用逗号连接起来,形成一个字符串,这个字符串将作为Map的值。

 ResponseEntity<List<ItemDTO>> exchange = restTemplate.exchange(
                "http://localhost:8081/items?ids={ids}",
                HttpMethod.GET,
                //请求体,get无
                null,
                //这里返回值类型是一个实体对象集合,一般:实体.class,这里:特殊处理
                new ParameterizedTypeReference<List<ItemDTO>>() {
                },
                //占位符参数处理,把id的set集合拼接为字符串,替换到占位符中的位置
                Map.of("ids", CollUtils.join(itemIds, ","))
        );
4,解析响应结果

 (可以通过响应状态码判断是否请求发送成功)

    响应体就是我们需要的数据

List<ItemDTO> items = exchange.getBody();

这个items就是我们需要的结果了,如果没有使用RestTemplate,这里的items就需要注入商品的service进行处理了,但是这是一个独立的服务,所以重新对items的值的由来进行了处理。保证服务的独立性。

服务治理问题

使用远程调用的方法会产生一些问题:

像上面看到的,另一个服务的url是写死的,实际不知道服务地址怎么办

同样的服务可能会部署好多个,该访问哪一个

如果知道某个服务地址,那个服务挂掉了怎么办

对于程序启动后,新服务的地址不知道

解决方案:注册中心......

JWT令牌验证icon-default.png?t=O83Ahttps://mp.csdn.net/mp_blog/creation/editor/141727904

标签:Map,调用,服务,exchange,items,RestTemplate,远程
From: https://blog.csdn.net/2301_81243054/article/details/143351234

相关文章

  • 【项目实战】远程信息处理控制单元(TCU),集成了多种通信技术,如蜂窝网络、Wi-Fi、蓝牙等,使
    一、TCU是什么?TCU,远程信息处理控制单元(TelematicsControlUnit)TCU,是车辆中用于实现远程信息处理功能的关键组件。TCU,集成了多种通信技术,如蜂窝网络、Wi-Fi、蓝牙等,使得车辆能够与外部系统进行数据交换和通信。二、TCU支持的各种应用和服务TCU,在车联网中扮演着重要角色......
  • 网站程序调用数据库时提示“command denied to user”
    问题现象使用云虚拟主机搭建网站后,当网站程序调用数据库失败时,提示 XXXcommanddeniedtouser,通常在执行 INSERT 和 UPDATE 操作时出现。可能原因数据库空间已满:当数据库的空间已满时,无法执行写入操作,如 INSERT 和 UPDATE。解决方案登录云虚拟主机管理页面打......
  • Meterpreter生成被控端并进行远程控制
    Meterpreter生成被控端并进行远程控制Meterpreter简介Meterpreter是kali中自带的用于渗透测试和漏洞利用的工具,它的本质上是一种payload,允许使用者使用命令行执行命令的生成及执行生成木马msfvenom-pwindows/x64/meterpreter/reverse_tcplhost=本机的iplport=5000-fexe......
  • PyImport_ImportModule总是返回 NULL或者空调用失败pModule为空pFunc为空
    问题1pModule为空c++调用Python时,要调用Python自定义函数,但是在调用PyImport_ImportModule时,总是返回空。一直调用不成功,明明我已经通过pyList_append(syspath,目录路径)。但是就是找不到。正常用cmd脚本也能正常运行。解决方案//初始化Python解释器Py_Initialize();//......
  • 函数调用寄存器及栈帧结构
    函数调用X86下,遵循被调用者使用规则,函数在调用子函数之前,保存相关寄存器的内容。函数调用时,参数先入栈,接着为返回地址入栈,BP寄存器入栈、再接着就是子函数的局部变量之类的了。常用寄存器栈帧结构函数调用时栈帧结构......
  • springboot:调用接口返回的数据乱码解决
    从git拉下来项目后,运行服务,启动正常,但是使用swagger和postman调用服务接口出现乱码问题每一个接口返回的数据是乱码,但是控制台打印的日志都是正常的,后续发现数据的返回类型不是常见的application/json,而是application/x-jackson-smile,所以要通过改变数据类型解决问题通过在接......
  • Unity 调用外部exe
    usingSystem;usingSystem.Diagnostics;usingSystem.IO;usingUnityEngine;publicclassRunExe:MonoBehaviour{publicstaticvoidStartExe(stringfilePath){//构建exe文件的完整路径stringexePath=Path.Combine(filePath);//......
  • SAP B1 DI API 在调用时提示找不到COM
    SAPB1DIAPI在调用时提示找不到COM找到DIAPI的安装目录,尝试手工注册,组件提示失败通过Dependencies分析发现是缺少运行环境安装c++运行环境安装后,再次分析,没有缺少的组件再次手工注册组件成功!又提示数据库不支持,需要安装对应的NativeClient,Nativ......
  • PbootCMS 模板首页循环调用所有栏目和对应内容
    问题:PbootCMS模板首页循环调用所有栏目和对应内容。答案:代码示例:{pboot:nav}栏目链接:[nav:link]栏目名称[nav:name]{pboot:listscode=[nav:scode]num=4order=date}内容链接:[list:link]内容名称:[list:title]内容图片:[list:ico]内容时间:[list:datestyle=Y-m-d]......
  • SAP-ABAP开发-按钮的三种调用方法
    1、自己创建调用在程序包中右击创建GUI状态,创建使用自己需要的按钮。注意的是,这里调用后会覆盖掉原来的系统的按钮。2、不覆盖系统的情况下加上自己创建的按钮并调用        右键GUI状态点击创建到界面后,点转到---》调整模板 。这里调整模板是指在系统基础上调整,......