【SpringCloud】之远程消费(进阶使用)

news2024/7/6 19:26:19

 🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《SpringCloud开发之远程消费》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁


前言

         在上一期的SpringCloud的分享中我们对其SpringCloud有了一个初步的了解,在上一期我们一起学习了什么是SpringCloud、详细的讲述了SpringCloud核心组件在业务中的一些用法以及作用,最后我们还涉及到了nacos在SpringCloud中的集成使用。本期的博客分享基于上期的博客进行一个远程消费的一个分享

一、 什么是远程消费

1. 概述

        在 Spring Cloud 中,远程消费通常指的是一个微服务通过网络调用另一个微服务的接口,以实现跨服务的功能调用。这种跨服务的通信方式常见于分布式系统中,其中不同的微服务协同工作以完成更大的业务目标。在微服务架构中,各个微服务通常拥有独立的代码库和部署单元

2.  实现方式

2.1 RestTemplate

   RestTemplate 是 Spring 提供的一个用于访问 REST 服务的模板类。通过 RestTemplate,你可以发起 HTTP 请求,从而实现对其他微服务提供的 RESTful API 的调用。在 Spring Cloud 中,可以通过使用 @LoadBalanced 注解来启用负载均衡,使得 RestTemplate 可以根据服务名称自动选择合适的实例。

 代码示例展示
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

2.2 Feign

        Spring Cloud Feign 是一个基于注解的声明式 HTTP 客户端,它简化了使用 RestTemplate 的代码。通过定义接口并添加 @FeignClient 注解,开发者可以直接调用其他微服务的接口,而 Feign 会在运行时自动创建实现类并处理 HTTP 请求

代码示例展示
@FeignClient(name = "another-service")
public interface AnotherServiceClient {
    @GetMapping("/api/someEndpoint")
    String getSomeData();
}

2.3 WebFlux WebClient

        对于响应式编程,Spring WebFlux 提供了 WebClient,它也可以用于进行远程服务调用。WebClient 提供了非阻塞的 API,适用于构建响应式系统

代码示例展示
WebClient webClient = WebClient.create("http://another-service");
String result = webClient.get()
        .uri("/api/someEndpoint")
        .retrieve()
        .bodyToMono(String.class)
        .block();

         总之,这些方法都允许微服务之间进行远程通信,使得不同微服务能够协同工作,共同完成复杂的业务逻辑。在使用这些远程消费的方法时,通常需要考虑到服务的可用性、负载均衡、容错机制(如断路器模式)等因素,以确保系统的稳定性和可靠性。

二、DTO封装

        VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据 封装起来。
        DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是 为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
        DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
        PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一 一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

        消费者 远程调用 生产者 : 需要网络传输,使用DTO同一封装对象
         原理与 SpringBoot 启动类相同
        1.将 DTO 对象封装到公共 DTO 模块
        2.为需要的项目引入公共 DTO 模块

 注意点

         1.不需要继承父模块(重复引用问题)
        2.打包方式为jar
        3.不需要添加启动类的编译

三、Feign实现远程消费

        如果我们基于上一期的博客中的代码去实现我们的代码的话,我们的代码要写到爆,因此我们接下来就以Feign来详细说明其实现的过程

1. 导入其Fegin的pom依赖

        在我们的主项目中去导入我们的Fegin的pom依赖。

<!--  引入openfeign的依赖-->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>

2. 标记使用远程消费

        我们在需要远程消费的服务的启动类上打上注解进行标记说明该服务启用远程消费。

注解:@EnableFeignClients

         该注解是开启Feign功能,我们的消费者需要启用,因此在我们的消费者的启动类上打上其注解。

 

3. 生产者编写接口

        我们需要模拟远程消费,对应的生产者是不是应该编写一个Controller去提供一些接口让我们的消费者进行调用。

        在编写的过程中只要参数是复杂对象,即使指定了是GET方法,feign依然会以POST方法进行发送请求,同时生产者必 须支持POST请求并给参数添加@RequestBody注解

3.1 参数的接收方式

3.1.1 路径参数
//    路径接收参数的请求
    @RequestMapping("/{account}")
    public String getByPath(@PathVariable("account") String account){
        log.info("account:{}",account);//打印输出查看
        return "🍗";
    }

3.1.2 接收多个参数
//    接收多个参数的请求
    //    @RequestParam接受参数
    @RequestMapping("/param")
    public String getByPath(@RequestParam("account") String password,
                            @RequestParam("password") String account){
        log.info("account:{},password:{}",account,password);//打印输出查看
        return "🍗";
    }

3.1.3 使用对象接收

        首先我们要在生产者进行创建一个实体类

User.java
package com.yx.provider.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * com.yx.provider.pojo
 *
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create 2024/1/6
 * 实体类,用于存储用户信息
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Long id;//id
    private String account;//账号
    private String password;//密码String password;//密码



}

        编写对应的请求方法

    //    接收对象参数的请求
    //    @RequestBody接受参数
    @RequestMapping("/pojo")
    public String getByPath(@RequestBody User user){
        log.info("user:{}",user);//打印输出查看
        return "🍗";
    }
3.1.4 使用Map接收
   @RequestMapping("/more")
    public String getByMore(@RequestBody Map<String, Object> map) {
        log.info("more:{}" + map);
        return "🍗";
    }

4. 编写一个接口类

         如果我们的消费者还是使用上期博客中的那种方式去调用的话不方便,也不好。因此我们可以在消费者编写一个接口类用于调用。 

 FeginService.java
package com.yx.consumer.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * com.yx.consumer.service
 *
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create 2024/1/6
 * 接口类,用于调用生产者的请求方法,连接生产者的Controller
 */
@FeignClient("provider")//连接的注解
public interface FeginService {

    //    路径接收参数的请求
    @RequestMapping("/{account}")
    String getByPath(@PathVariable("account") String account);


    //    接收多个参数的请求
    //    @RequestParam接受参数
    @RequestMapping("/param")
    String getByPath(@RequestParam("account") String password,
                            @RequestParam("password") String account);

}

        编写对应的接口类的时候要注意一下几点 

5. 编写消费者的Controller

        重新编写请求方法进行调用生产者的方法

ConsumerController.java
package com.yx.consumer;

import com.yx.consumer.service.FeginUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {

//    调用生产者  ,注入接口
    @Autowired
    private FeginUserService feginUserService;

//restTemplate相当于HttpClient,用于发送请求
    @RequestMapping("/test01 ")
    public String test01() {
    //    跳转到生产者去
        return feginUserService.getByPath("木易兮");
    }

}

6. 测试

6.1 测试路径传参

        当我们启动项目之后,在其网页进行对其发送请求

6.2 测试传递多个参数

6.3 测试对象传递参数

        消费者中的接口类定义其方法

         对其的控制层编写请求

        运行测试  

        我们这里测试没有问题,但是我们要考虑一个问题,如果我们生产者的实体类比较多呢,难道都赋值到消费者去吗。 我们可以在主项目下新建一个maven项目作为公共模块,我们创建好之后对其pom文件进行修改。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>common</artifactId>
    <packaging>jar</packaging>
    <name>common Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <parent>
        <groupId>com.yx</groupId>
        <artifactId>cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>

    </dependencies>
</project>

        还要将其实体类赋值过来

         将实体类的名称改成UserDto,该类中的属性不一定和User的属性一致,生产者和消费者中引入UserDto需要在pom文件中引入公共模块

 <dependency>
            <groupId>com.yx</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

 

 

        引入之后我就用UserDto进行传参以及接收 

        消费者的接口类进行修改 以及请求类也需修改

        最后我们启动项目进行访问请求测试  

6.4  测试使用Map接收

        消费者对应的代码 

        最后我们重新启动项目运行测试即可 


 🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路 !🎁

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

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

相关文章

Linux第12步_磁盘重新分区

解决“挂载后的U盘出现中文乱码”后&#xff0c;我们接着学习“磁盘重新分区”&#xff0c;熟悉fdisk命令。 1、删除磁盘的分区 输入“cd /回车”&#xff0c;进入根目录 输入“ls /dev/sd*回车”&#xff0c;显示dev以sd所有文件。 输入“sudo fdisk /dev/sdb1回车” 输入…

瑜亮之争有结果了,6GHz(6425-7125MHz)全部或部分频段划分用于IMT系统

文章目录 6GHz&#xff08;6425-7125MHz&#xff09;全部或部分频段划分用于IMT系统Wi-Fi 7 使用的频段Wi-Fi 7 与IMT使用的频段存在重叠频谱分配有讲究6GHz频段未来如何利用如何看待6GHz频段划入IMT关于Wi-Fi 7 与IMT关于Wi-Fi 7(IEEE 802.11be EHT)关于IMT(International Mob…

从零开始的OpenGL光栅化渲染器构建1

前言 参照Learnopengl&#xff0c;我开始回顾OpenGL中的内容&#xff0c;最终目标是构建一个玩具级的光栅化渲染器&#xff0c;最好还能和之前做的光线追踪渲染器相结合&#xff0c;希望能够有所收获吧~ 包管理 之前我用CMake配置过OpenGL的环境&#xff0c;这样做出来的项目…

Vue3 + Vite + TypeScript + Element-Plus:从零到一构建企业级后台管理系统(前后端开源)

vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 Element Plus 版本的后台管理前端解决方案&#xff0c;技术栈为 Vue3 Vite4 TypeScript Element Plus Pinia Vue Router 等当前主流框架。 相较于其他管理前端框架&#xff0c;vue3-element-admin 的优势在于一…

Python 面向对象之多态和鸭子类型

Python 面向对象之多态和鸭子类型 【一】多态 【1】概念 多态是面向对象的三大特征之一多态&#xff1a;允许不同的对象对同一操作做出不同的反应多态可以提高代码的灵活性&#xff0c;可扩展性&#xff0c;简化代码逻辑 【2】代码解释 在植物大战僵尸中&#xff0c;有寒冰…

vite4项目中,vant兼容750适配

一般非vite项目&#xff0c;使用postcss-px-to-viewport。在设计稿为750时候&#xff0c;可使用以下配置兼容vant。 在vite4项目中&#xff0c;以上配置不行。需要调整下&#xff0c;使用postcss-px-to-viewport-8-plugin&#xff0c;并修改viewportWidth&#xff0c;具体如下…

2 @RequestMapping 注解

1. RequestMapping 概念 SpringMVC 使用RequestMapping 注解为控制器指定可以处理哪些 URL 请求在控制器的类定义及方法定义处都可标注 RequestMapping 标记在类上&#xff1a;提供初步的请求映射信息。相对于 WEB 应用的根目录标记在方法上&#xff1a;提供进一步的细分映射信…

大创项目推荐 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

遇见狂神说 Spring学习笔记(完整笔记+代码)

简介 Spring是一个开源的免费的框架&#xff08;容器&#xff09;Spring是一个轻量级的、非入侵式的框架控制反转(IOC&#xff09;&#xff0c;面向切面编程 (AOP)支持事务的处理&#xff0c;支持对框架进行整合 Spring就是一个轻量级的控制反转&#xff08;IOC&#xff09;和…

视频智能分析支持摄像头异常位移检测,监测摄像机异常位移变化,保障监控状态

我们经常在生产场景中会遇到摄像头经过风吹日晒&#xff0c;或者异常的触碰&#xff0c;导致了角度或者位置的变化&#xff0c;这种情况下&#xff0c;如果不及时做出调整&#xff0c;会导致原本的监控条件被破坏&#xff0c;发生事件需要追溯的时候&#xff0c;查不到对应位置…

01-线程池项目背景:C++的数据库操作

从0开始学习C与数据库的联动 1.原始方式-使用MySQL Connector/C 提供的API查询 1.1 数据库预操作 我的本地电脑上有mysql数据库&#xff0c;里面预先创建了一个database名叫chat&#xff0c;用户名root&#xff0c;密码password。 1.2 Visual Studio预操作 在Windows上使用…

Linux与C/C++服务器开发:深入探索网络编程与实用技术(文末送书)

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 书籍推荐 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. 构建高性能Linux C/C服务器1.1 优化服务器性能1.2 处理并发和并行性1.3 高效管理内存1…

dnSpy调试工具二次开发1-新增菜单

测试环境&#xff1a; window 10 visual studio 2019 版本号&#xff1a;16.11.15 .net framework 4.8 开发者工具包 下载 .NET Framework 4.8 | 免费官方下载 .net 5开发者工具包 下载 .NET 5.0 (Linux、macOS 和 Windows) 利用git拉取代码(源码地址&#xff1a;Gi…

TypeError: loaderUtils.getOptions is not a function

webpack 版本&#xff1a;^5.89.0 但是直接 pnpm add loader-utils 安装的版本比较新&#xff0c;会报错&#xff1a;TypeError: loaderUtils.getOptions is not a function。 解决方案&#xff1a;将低 loader-utils 版本&#xff0c;我这里使用 ^2.0.0 就不会再报这个错误了 …

Pandas DataFrame中将True/False映射到1/0

在本文中&#xff0c;我们将看到如何在Pandas DataFrame中将True/False映射到1/0。True/False到1/0的转换在执行计算时至关重要&#xff0c;并且可以轻松分析数据。 1. replace方法 在这个例子中&#xff0c;我们使用Pandas replace()方法将True/False映射到1/0。在这里&…

十大性能测试工具

这篇关于“性能测试工具”的文章将按以下顺序让您了解不同的软件测试工具&#xff1a; 什么是性能测试&#xff1f; 为什么我们需要性能测试&#xff1f; 性能测试的优势 性能测试的类型 十大性能测试工具 什么是性能测试&#xff1f; 性能测试是一种软件测试&#xff0c;可确…

25考研经验贴之准备篇三

Hello各位小伙伴又见面了&#xff0c;今天要给大家分享一些大家在备考中可以用到的软件。 另外前两次分享的一些择校什么的也不够全面&#xff0c;今天又为大家找到了一个全面的考研常识讲解视频&#xff0c;有需要的可以关注公众号&#xff0c;在后台回复&#xff1a;考研常识…

Python自动点击器

一、如何制作一个Python自动点击器&#xff1f; 当用户单击开始键时&#xff0c;代码将从键盘获取输入&#xff0c;并在用户单击退出键时终止自动点击器&#xff0c;自动点击器开始单击指针放置在屏幕上的任何位置。我们将在这里使用pynput模块。 二、什么是自动点击器&#…

Traffic Flow Prediction via Spatial Temporal Graph NeuralNetwork

KEYWORDS Traffic Prediction, Graph Neural Networks, Spatial Temporal Model, Dynamic, Recurrent Neural Network, Transformer This paper is published under the Creative Commons Attribution 4.0 International (CC-BY 4.0) license ABSTRACT 交通流分析、预测和管理…

呕心沥血总结的Python自动化测试面试题

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;软件测试面试题分享&#xff1a; 1000道软件测试面试题及答案&#x1f4e2;软件测试实战项目分享&#xff1a; 纯接口项目-完…