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

news2024/9/28 11:19:04

🥳🥳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.coloradmin.cn/o/1363826.html

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

相关文章

一个简单的KNN实现方法

对于许多离散问题&#xff0c;经过神经网络解决再通过softmax之后每一个值在[0,1]之间的连续变量&#xff0c;想要将其离散化&#xff0c;即离散化到每个元素都是 binary-variable&#xff0c;即 0-1 &#xff0c;这时可以用KNN方法&#xff0c;其实就是找到与这个向量的方差最…

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

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

力扣刷题记录(29)LeetCode:695、1020、130

695. 岛屿的最大面积 这道题和计算岛屿周长类似&#xff0c;在这里dfs的功能就是由一块陆地出发&#xff0c;找出这块陆地所在的岛屿并返回岛屿面积。 class Solution { public:int dfs(vector<vector<int>>& grid,int i,int j){if(i<0||i>grid.size())…

kannegiesser触摸屏维修CTT-11 4PP420.1043-K37

贝加莱触摸屏维修4PP420.1043-K37 kannegiesser工控机触摸屏维修CTT-11 工控机触摸屏维修常见故障现象 1、工控机开机有显示&#xff0c;但是屏幕很暗&#xff0c;用调亮度功能键调试无任何变化&#xff1b; 2、工控机开机触摸屏白屏或花屏&#xff0c;但是外接显示器正常&a…

2024——剑之所至,所向披靡

目录 *年度总结导航 一.开篇——写在篇头 二.工作篇——心之所向 1.CSDN记录篇 1,1博客主页 ​编辑1.2 第一篇博文 1.3.产品测试 1.4C站获奖博文 1.5团队创建 2.腾讯云记录篇 2.1博主的主页 2.2 博主好文推荐 2.3腾讯云产品体验 三.励志篇——未来可期 2023年…

编程语言的未来:贴近人类、灵活高效与探索无限

编程语言的未来&#xff1f; 在当今的科技潮流中&#xff0c;编程语言是至关重要的一环&#xff0c;更是赋能科技行业的基础工具。我深信&#xff0c;未来的编程语言可能将朝着更贴近人类、灵活高效和面向无限可能的方向发展。 人性化是我预期的第一个趋势。未来的编程语言将…

java CAS

CAS 在高并发场景&#xff0c;可以使用加锁 或者CAS来保证原子性&#xff0c;但是加锁是很重量级的操作&#xff0c;CAS类似于乐观锁CAS &#xff08; Compare and swap &#xff09;比较并交换&#xff0c;是实现并发算法时常用到的技术&#xff0c;包含三个操作数&#xff1…

MySql海量数据存储与优化

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

网络安全学习资源

好久没写博客了&#xff0c;记录一些宝藏学习资源&#xff0c;不定时更新 Regex Learn - Step by step, from zero to advanced. 这是一个我认为最好的正则表达式学习网站&#xff0c;很多正则表达式学习资料都只提供了一个概念&#xff0c;但是正则表达式需要大量的练习&#…

基于原子搜索算法优化的Elman神经网络数据预测 - 附代码

基于原子搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于原子搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于原子搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

【数据湖架构】数据湖101:概述

数据湖是非结构化和结构化数据池&#xff0c;按原样存储&#xff0c;没有特定的目的&#xff0c;可以建立在多种技术上&#xff0c;如Hadoop&#xff0c;NoSQL&#xff0c;Amazon Simple Storage Service&#xff0c;关系数据库或各种组合根据一份名为“什么是数据湖”的白皮书…

ffmpeg+x265精简压缩图片

可以看到700M的图片可以压缩到只有9M&#xff0c;并且模型推理精度只会下降0.07.有很多种压缩方式&#xff0c;经过大量实验qb36是最好的&#xff0c;默认使用这个。 input_images&#xff1a;原始图片。 mkv_files\qb36&#xff1a;中转文件&#xff0c;也就是说原始图片要先…

STL标准库与泛型编程(侯捷)笔记3

STL标准库与泛型编程&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

qt鼠标常用事件

和上一个案例相同,也是做了提升&#xff0c;换了相同父类,但是方式有所不同 先在widget.ui中加入label标签,此时其父类为QLabel,然后想实现鼠标在QLabel上的捕获。所以我们需要把QLabel提升为自己的框架&#xff0c;然后自定义框架后&#xff0c;我们就可以自己捕获信息了。然…

遗传算法总结(迭代版本2:附带MATLAB例题代码)

目录 基本概念&#xff1a; 具体例子 1.我们先对图像进行抽象化&#xff1a; 2.我们将得到的六串数字进行扁平化处理&#xff1a; 3.解释即后续操作​编辑 基本步骤&#xff1a; 总结 例题1&#xff1a; 例题2&#xff1a; 基本概念&#xff1a; 染色体&#xff08;Ch…

uniapp 文字超出多少字,显示收起全文按钮效果demo(整理)

收起展开 <template><view class"font30 color000 mL30 mR30"><text :class"showFullText ? : clamp-text">{{ text }}</text><view v-if"showToggleBtn && text.length > 42" click"toggleShowFu…

基于JAVA的服装店库存管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

小白入门基础 - tomcat

一&#xff1a;前言 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#x…

解决“SQLServer 添加数据库,报Error 5118“错误

当将把一个SQLServer的数据库文件*.MDF和日志文件*.LDF&#xff0c;从电脑A拷贝到电脑B&#xff0c;然后在电脑B上&#xff0c;使用Microsoft SQL Server Management Studio添加该*.MDF文件&#xff0c;有时报"Error 5118"错误&#xff0c;如图(1)所示&#xff1a; 图…

【C程序设计】C指针

学习 C 语言的指针既简单又有趣。通过指针&#xff0c;可以简化一些 C 编程任务的执行&#xff0c;还有一些任务&#xff0c;如动态内存分配&#xff0c;没有指针是无法执行的。所以&#xff0c;想要成为一名优秀的 C 程序员&#xff0c;学习指针是很有必要的。 正如您所知道的…