SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于SpringCloud的相关操作吧

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

一. 远程消费组件是什么

二. 远程消费组件的详解

场景模拟

代码实操

1.生产者

2.消费者

3.复杂参数的处理

DTO

属性赋值


一. 远程消费组件是什么

        声明式HTTP客户端组件是一种用于简化HTTP请求的编程工具。它通过提供一种声明式的方式来发送HTTP请求,而无需编写繁琐的手动请求代码。声明式HTTP客户端组件通常与特定的编程框架或库一起使用,可以根据预定义的配置和注解来自动生成HTTP请求的代码。这种方式可以提高开发效率,减少错误,并使代码更具可维护性。通过声明式HTTP客户端组件,开发者可以将精力集中在业务逻辑上,而无需过多关注底层的HTTP请求细节。

二. 远程消费组件的详解

场景模拟

当你使用一个电子商务应用程序下订单时,应用程序需要与后端的服务器进行通信以处理你的请求。在这种情况下,声明式HTTP客户端组件可以被用来简化和优化与服务器的通信

假设你正在使用一个购物应用程序,你想要下一份外卖订单。你打开应用程序,并选择你所喜欢的餐厅和菜单项。当你点击"下订单"按钮时,应用程序会使用声明式HTTP客户端组件来发送HTTP请求到后端的服务器。

声明式HTTP客户端组件通过一种声明性的方式来定义和描述HTTP请求的结构和行为。在这个例子中,它会将你的订单信息(如餐厅ID、菜单项ID、送货地址等)转换为一个符合API规范的HTTP请求,并发送给服务器。

服务器收到请求后,会根据请求的内容来处理订单。它可能会验证订单信息、计算价格、生成订单号等。一旦服务器完成订单处理,它会将响应发送回给声明式HTTP客户端组件。

声明式HTTP客户端组件会解析服务器的响应并将其转换为应用程序可以理解的格式。例如,它可能会将响应转换为一个订单确认页面,显示订单的详细信息和预计送达时间。

通过使用声明式HTTP客户端组件,应用程序可以更轻松地与后端服务器进行通信,而无需手动构建和解析HTTP请求和响应。这使得应用程序的开发更加高效和简洁,并提供更好的用户体验。


代码实操

上面的就是一个场景模拟,现在话不多说,我们直接上代码

这里我们使用的是feign这个组件,所以需要导入相应的pom依赖

Feign: Feign是Spring Cloud提供的声明式、模板化的HTTP客户端, 它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

这里使用的例子还是生产者于消费者的例子,谁需要调用远程的服务,那么对应的那个项目的启动类中就需要添加一个注解--@EnableFeignClients 【主要是为开启feign接口扫描】

1.生产者

生产者主要是负责提供接口,其中可以使用以下几个注解接收远程调用的参数值

这里也有一个注意点:只要参数是复杂对象,即使指定了是GET方法,feign依然会以POST方法进行发送请求,同时生产者必 须支持POST请求并给参数添加@RequestBody注解

@PathVariable  路径传参
@RequestParam  多个参数中,指定接收的参数名
@RequestBody   接收复杂的参数类型(比如对象)
package com.provider.main;import com.provider.main.model.User;
import com.wh.common.dto.UserDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;import java.util.Map;@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@RequestMapping("/{name}")public String pathparam(@PathVariable("name")String name) {log.info("name{}",name);return "么么哒";}@RequestMapping("/manyparam")public String manyparam(@RequestParam("name") String name, @RequestParam("pwd") String pwd) {log.info("name{},pwd{}",name,pwd);return "么么哒";}@RequestMapping("/objectparam")public String objectparam(@RequestBody UserDto userDto) {log.info("user{}",userDto);return "么么哒";}@RequestMapping("/copyproperties")public String copyproperties(@RequestBody User user){log.info("user{}",user);return "么么哒";}@RequestMapping("/mapparam")public String mapparam(@RequestBody Map<String, Object> map) {log.info("getByMore: more:" + map);return "provider say : yes";}}

2.消费者

消费者需要开启Feign功能,创建service,并使用Feign表示其需要远程对接的服务名称,

并使用@RequestMapping表示其映射的路径

        在这个feign组件的接口中编写代码时,还需要注意一些点:

  • FeignClient接口,不能使用@GettingMapping之类的组合注解
  • FeignClient接口中,如果使用到@PathVariable必须指定其value
  • 当使用feign传参数的时候,需要加上@RequestParam注解,否则对方服务无法识别参数
package com.consumer.main.service;import com.consumer.main.model.User;
import com.wh.common.dto.UserDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.Map;/*** @author是辉辉啦* @create 2024-01-06-22:18* 负责连接生产者的controller*/
@FeignClient("provider")
public interface FeignUserServise {/*** 路径传参* @param name* @return*/@RequestMapping("user/{name}")String pathparam(@PathVariable("name") String name);/*** 多个参数【指定参数接收名】* @param name* @param pwd* @return*/@RequestMapping("user/manyparam")String manyparam(@RequestParam("name") String name, @RequestParam("pwd") String pwd);/*** 参数是一个对象* @param userDto* @return*/@RequestMapping("user/objectparam")public String objectparam(@RequestBody UserDto userDto);/*** 参数是一个对象--属性复制* @param user* @return*/@RequestMapping("user/copyproperties")public String copyproperties(@RequestBody User user);/*** 参数是一个map集合* @param map* @return*/@RequestMapping("user/mapparam")public String mapparam(@RequestBody Map<String, Object> map);}

3.复杂参数的处理

前面也说到了复杂参数必须使用post请求发送,但这里还有一个点需要注意,我们在写代码时,可能会出现这样的情况:用户的信息需要被多个服务所调用。如果服务少还好说,我们可以直接在相应的服务中编写一个实体类,其中存放我们需要的字段就行了。

DTO

但要是服务多了呢,如果还是这样做的话,好像会很麻烦,所以我们可以直接写一个dto的类,这个dto的类很多模块都可能需要用到,所以我们可以创建一个公共的maven项目,将dto的类写在那个项目中就好了。

然后再将这个项目引入到对应需要使用的项目中便可

DTO:

DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是 为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的 性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象

消费者远程调用生产者 : 需要网络传输,这样就可以使用DTO同一封装对象,就不需要在两个项目中都把用户这个实体类复制过来了

 /*** 参数是一个对象* @param userDto* @return*/@RequestMapping("user/objectparam")public String objectparam(@RequestBody UserDto userDto);
属性赋值

使用了dto拿到值了,也需要将其中的值赋给相应的user对象,这里的话我们可以使用到一个映射框架--Orika

Orika:

Orika是java Bean映射框架,可以实现从一个对象递归拷贝数据至另一个对象。 在开发多层应用程序中非常有用。在这些层之间交换数据时,通常为了适应不同API需要转换一个实例至 另一个实例。

使用它也需要引入相应的依赖

<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.4.6</version>
</dependency>

然后调用相应方法之前就可以做一个复制属性的操作了

 @RequestMapping("/test03")public String test03() {UserDto userDto = new UserDto();userDto.setPwd("root123");userDto.setName("root");userDto.setId(1L);DefaultMapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();User u = mapperFactory.getMapperFacade().map(userDto, User.class);return feignUserServise.copyproperties(u);}

上面我们说的是属性一致的情况,那可能也会有属性不一样的时候

  @RequestMapping("/test03")public String test03() {UserDto userDto = new UserDto();userDto.setPwd("root123");userDto.setName("root");userDto.setId(2L);DefaultMapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();mapperFactory.classMap(UserDto.class, User.class).field("name", "account").byDefault().register();User u = mapperFactory.getMapperFacade().map(userDto, User.class);return feignUserServise.copyproperties(u);}

 

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊 

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

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

相关文章

竞赛练一练 第22期:NOC大赛每日一练,python题目刷题第7天,包含答案解析

题目来自:NOC大赛创客智慧编程赛项Python 复赛模拟题(一) 第一题: 编写一个彩票游戏:随机生成一个不重复的五位数作为彩票号,游戏提示用户输入一个五位整数,然后根据下面的规则判断用户是否能赢得奖金,最后要求输出彩票号和奖金。 (1)若用户输入的数字和彩票的数字完…

c语言考试代码

文章目录 文件操作题 “%”&#xff1a;格式化字符串的起始标志。 “0”&#xff1a;表示使用零来填充输出字段的宽度。 “4”&#xff1a;表示输出字段的宽度为4个字符&#xff0c;如果输出的十六进制数不足4位&#xff0c;则在左边用零进行填充。 “x”&#xff1a;表示以十六…

MySql海量数据存储与优化

一、Mysql架构原理和存储机制 1.体系结构 2.查询缓存 3.存储引擎 存储引擎的分类 innodb&#xff1a;支持事务&#xff0c;具有支持回滚&#xff0c;提交&#xff0c;崩溃恢复等功能&#xff0c;事务安全myisam:不支持事务和外键&#xff0c;查询速度高Memory&#xff1a;利…

Spring Boot实现数据加密脱敏:注解 + 反射 + AOP

文章目录 1. 引言2. 数据加密和脱敏的需求3. Spring Boot项目初始化4. 敏感数据加密注解设计5. 实现加密和脱敏的工具类6. 实体类和加密脱敏注解的使用7. 利用AOP实现加密和脱敏8. 完善AOP切面9. 测试10. 拓展功能与未来展望10.1 加密算法的选择10.2 动态注解配置 11. 总结 &am…

CHS_02.1.1.2+操作系统的特征

CHS_02.1.1.2操作系统的特征 操作系统的四个特征并发这个特征为什么并发性对于操作系统来说是一个很重要的基本特性资源共享虚拟异步性 各位同学 大家好 在这个小节当中 我们会学习 操作系统的四个特征 操作系统有并发 共享 虚拟和异部这四个基本的特征 其中 并发和共享是两个…

机器人的末端执行器由什么零件组成,有什么作用。

问题描述&#xff1a;机器人的末端执行器由什么零件组成&#xff0c;有什么作用。 问题解答&#xff1a; 机器人的末端执行器是机器人机械结构的最末端部分&#xff0c;用于执行具体的任务和与环境进行交互。末端执行器通常由多个零部件组成&#xff0c;其主要作用是完成机器…

log4j RCE漏洞原理分析及检测

实现原理 log4j支持使用表达式的形式打印日志&#xff0c;比如 logger.info("system propety: ${sys:user.dir}");问题就在与表达式支持非常多样&#xff0c;其中有一个jndi就是今天的主题 logger.info("system propety: ${jndi:schema://url}");jdk将从…

学习笔记——C++ do while语句

作用&#xff1a;满足循环条件&#xff0c;执行循环语句 语法&#xff1a;do{循环语句}while{循环条件}&#xff1b; 注意&#xff1a;与while的区别在于do while 会先执行一次循环语句&#xff0c;再判断循环条件。 示例&#xff1a;打印0-9的数字 #include<bits/stdc.h…

图神经网络|9.3 邻接矩阵的变换

由于邻接矩阵中一般不会&#xff08;i,i&#xff09;等于1&#xff0c;除非第i个点上有自环。 而如果用邻接矩阵去乘上特征矩阵&#xff0c;那么将丢失自身向自身的贡献。 此时可以再邻接矩阵的基础上&#xff0c;再加上一个单位阵&#xff0c;从而使得最终的结果包含自身对整体…

RedisInsight - Redis官方可视化工具

一、RedisInsight 简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具&#xff0c;它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控&#xff0c;并且可以在界面上使用 CLI 和连接的 Redis 进行交互&#xff08;RedisInsight 内置对 Redis 模块支持&#…

JavaWeb——新闻管理系统(Jsp+Servlet)之jsp新闻新增

java-ee项目结构设计 1.dao:对数据库的访问&#xff0c;实现了增删改查 2.entity:定义了新闻、评论、用户三个实体&#xff0c;并设置对应实体的属性 3.filter&#xff1a;过滤器&#xff0c;设置字符编码都为utf8&#xff0c;防止乱码出现 4.service:业务逻辑处理 5.servlet:处…

一文讲透使用SPSS统计分析软件绘制双轴线图

双轴线图主要用来展示两个因变量和一个自变量的关系&#xff0c;并且两个因变量的数值单位不同时的情形。具体来说&#xff0c;双轴线图是指在一幅图上有一个横轴和两个纵轴&#xff0c;适用于三个变量。两个纵轴分别表示一个变量&#xff0c;横轴变量同时适用于两个纵轴上的变…

【InternLM】Lagent智能体工具调用实践浦语·灵笔(InternLM-XComposer)图文理解创作Demo练习

目录 前言一、Lagent智能体工具1-1、什么是智能体&#xff1f;1-2、Lagent智能体 二、InternLM-XComposer&#xff08;图文理解创作模型介绍&#xff09;三、Lagent调用实践3-0、环境搭建3-1、创建虚拟环境3-2、导入所需要的包3-3、模型下载3-4、Lagent安装3-5、demo运行 四、I…

【Navigation】global_planner 源码解析

全局规划器 global_planner 功能包 文章目录 global_planner 功能包结构1、plan_node.cpp2、planner_core.cpp3、astar.cpp4、dijkstra.cpp5、quadratic_calculator.cpp6、grid_path.cpp7、gradient_path.cpp8、orientation_filter.cpp全局规划大都基于静态地图进行规划,产生路…

完善 Golang Gin 框架的静态中间件:Gin-Static

Gin 是 Golang 生态中目前最受用户欢迎和关注的 Web 框架&#xff0c;但是生态中的 Static 中间件使用起来却一直很不顺手。 所以&#xff0c;我顺手改了它&#xff0c;然后把这个改良版开源了。 写在前面 Gin-static 的改良版&#xff0c;我开源在了 soulteary/gin-static&a…

超维空间M1无人机使用说明书——52、ROS无人机二维码识别与降落

引言&#xff1a;使用二维码引导无人机实现精准降落&#xff0c;首先需要实现对二维码的识别和定位&#xff0c;可以参考博客的二维码识别和定位内容。本小节主要是通过获取拿到的二维码位置&#xff0c;控制无人机全向的移动和降落&#xff0c;分为两种&#xff0c;一种是无人…

C#中CultureInfo.CreateSpecificCulture(String) 方法

目录 一、CultureInfo 类 二、CultureInfo.CreateSpecificCulture(String) 方法 1.定义 2.示例 一、CultureInfo 类 提供有关特定区域性&#xff08;对于非托管代码开发&#xff0c;则称为“区域设置”&#xff09;的信息。 这些信息包括区域性的名称、书写系统、使用的日…

Intel x86架构之APIC

我是在处理一个网卡中断分发问题时看的这些内容&#xff0c;因为是外部中断到处理器的分发问题&#xff0c;因此我关注的重点是I/O APIC和外部设备中断&#xff0c;所以下面这部分内容以及接下来的两篇文章都是从手册里挑着看的。 全文来自Intel开发者手册&#xff1a;Intel? …

Tomcat Notes: Deployment File

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial&#xff0c;owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Tomcat deployment1.1、Two modes of …

阿里云服务器固定带宽下载和上传速度对照表

阿里云服务器公网带宽上传和下载速度对照表&#xff0c;1M带宽下载速度是128KB/秒&#xff0c;为什么不是1M/秒&#xff1f;阿腾云atengyun.com分享阿里云服务器带宽1M、2M、3M、5M、6M、10M、20M、30M、50M、100M及200M等公网带宽下载和上传速度对照表&#xff0c;附带宽价格表…