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

这篇具有很好参考价值的文章主要介绍了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客户端组件可以被用来简化和优化与服务器的通信

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

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

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

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

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

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

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

声明式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接口扫描】

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

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表示其需要远程对接的服务名称,

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

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

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

        在这个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请求发送,但这里还有一个点需要注意,我们在写代码时,可能会出现这样的情况:用户的信息需要被多个服务所调用。如果服务少还好说,我们可以直接在相应的服务中编写一个实体类,其中存放我们需要的字段就行了。

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

DTO

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

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端然后再将这个项目引入到对应需要使用的项目中便可

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

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>

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

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

 @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);
    }

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

SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】,Spring Cloud,spring cloud,spring,后端

  @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);
    }

 

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊 文章来源地址https://www.toymoban.com/news/detail-780828.html

到了这里,关于SpringCloud系列篇:核心组件之声明式HTTP客户端组件【远程消费】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot基础之声明式事务和切面事务和编程式事务

    事务管理对于企业应用来说是至关重要的,当出现异常情况时,它也可以保证数据的一致性。 springBoot中两种事务的实现方式, 编程式事务配置和声明式事务配置还有切面事务 还有以后的分布式事务 详情参考 这篇 原子性(Atomicity): 事务是一个原子操作,由一系列动作组成

    2024年02月02日
    浏览(46)
  • ArkUI框架之声明式 UI 条件渲染&声明周期以及案例美化实战运用【OpenHarmony/HarmonyOS】

    1.1.1 用户名位数判断 实现用户名位数判断可以直接在build方法函数里进行写if语句的条件判断。 我们把用户名改到超出五位查看效果如下:

    2024年02月06日
    浏览(43)
  • SpringCloud Alibaba - HTTP 客户端 OpenFeign 、自定义配置、优化、最佳实践

    目录 一、OpenFeign 是什么,有什么用呢? 二、OpenFeign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service(发起远程调用的微服务)的启动类添加注解开启Feign的功能 3.编写 OpenFeign 客户端 4.通过 OpenFeign 客户端发起远程调用 2.2、自定义 OpenFeign 配置 1.配置文件方式 2.j

    2024年02月08日
    浏览(50)
  • 认识 SpringCloud 核心组件

    ✅作者简介:大家好,我是Cisyam,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Cisyam-Shark的博客 💞当前专栏: 微服务探索之旅 ✨特色专栏: MySQL学习 🥭本文内容:初步了解SpringCloud微服务架构 🖥️个人小站 :个人博客,欢迎大家访问 📚个人

    2024年02月08日
    浏览(59)
  • SpringCloud核心组件讲解

    SpringCloud入门 一、微服务与SpringCloud 1.1 微服务 百度百科定义 :“一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务

    2024年02月09日
    浏览(30)
  • SpringCloud 核心组件Feign【远程调用&自定义配置】

    目录 1,Feign远程调用 1.1:Feign概述 1.2:Feign替代RestTemplate         1):引入依赖         2):添加注解         3):编写Feign的消费服务,提供服务         4):测试         5):总结 1.3:自定义配置 1.3.1:配置文件方式 1.3.2:Java代码方式 Feign是一款Java语言编写的

    2023年04月08日
    浏览(78)
  • SocketTools 11在所有HTTP客户端组件支持

    在所有HTTP客户端组件中添加了对HTTP/2.0协议的支持。 更新了TLS 1.2(及更高版本)和SSH 2.0的安全选项,以使用Microsoft Windows 11和Windows Server 2022中提供的密码套件。较旧、安全性较低的密码套件已被弃用,在建立连接时将不会使用。回退选项可用于使用TLS 1.0连接到旧版服务器。

    2024年02月05日
    浏览(49)
  • springcloud-alibaba五大核心组件-后端开发工程(脚手架)搭建

    Gitee仓库地址 点我 服务注册与发现: nacos 配置中心: nacos 服务远程调用: openfeign 微服务网关: gateway 服务限流降级熔断等: sentinel 实现的功能demo openfeign服务远程调用 sentinel限流测试 gateway网关调用2个微服务 nacos的服务注册与发现 软件架构(环境) jdk: 1.8 maven: 3.5.2 nacos: 注册中心

    2024年02月05日
    浏览(55)
  • SpringCloud系列:负载均衡组件-Ribbon

    作者平台: | CSDN:blog.csdn.net/qq_41153943 | 掘金:juejin.cn/user/651387… | 知乎:www.zhihu.com/people/1024… | GitHub:github.com/JiangXia-10… 本文一共4529字,预计阅读12分钟 前面几篇文章介绍了微服务相关的内容,比如什么是微服务,常见的一些服务注册中心组件,以及微服务之间是如何进

    2024年02月17日
    浏览(45)
  • SpringCloud 微服务系列——【Gateway、Config组件使用】

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SpringCloud 微服务学习专栏 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:SpringCloud 微服

    2024年02月04日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包