【SpringCloud】之远程消费(进阶使用)
🎉🎉欢迎来到我的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.打包方式为jar3.不需要添加启动类的编译
三、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;//idprivate 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 {// 调用生产者 ,注入接口@Autowiredprivate 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接收
消费者对应的代码
最后我们重新启动项目运行测试即可
🎉🎉本期的博客分享到此结束🎉🎉
📚📚各位老铁慢慢消化📚📚
🎯🎯下期博客博主会带来新货🎯🎯
🎁三连加关注,阅读不迷路 !🎁
相关文章:
【SpringCloud】之远程消费(进阶使用)
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《SpringCloud开发之远程消费》。🎯&a…...
自然语言处理24-T5模型的介绍与训练过程,利用简单构造数据训练微调该模型,体验整个过程
大家好,我是微学AI,今天给大家介绍一下自然语言处理24-T5模型的介绍与训练过程,利用简单构造数据训练微调该模型,体验整个过程。在大模型ChatGPT发布之前,NLP领域是BERT,T5模型为主导,T5(Text-to-Text Transfer Transformer)是一种由Google Brain团队在2019年提出的自然…...
CISSP 第5章 保护资产的安全
1、资产识别和分类 1.1 敏感数据 1.1.1 定义 敏感数据是任何非公开或非机密的信息,包括机密的、专有的、受保护的或因其对组织的价值或按照现有的法律和法规而需要组织保护的任何其他类型的数据。 1.1.2 个人身份信息PII 个人身份信息(PII)…...
docker安装-在linux下的安装步骤
#切换到root用户 su yum安装jcc相关 yum -y install gcc yum -y install gcc-c 安装yum-utils sudo yum install -y yum-utils 设置stable镜像仓库 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新yum软件包索…...
在Uniapp中使用Echarts创建可视化图表
在uniapp中可以引入echarts创建数据可视化图表。 1. 安装Echarts 使用npm安装echarts插件,命令如下: npm install echarts --save2. 引入Eharts 在需要使用Echarts的页面引入: import *as echarts from echarts3. 创建实例 创建画布元素…...
基于python的leetcode算法介绍之动态规划
文章目录 零 算法介绍一 例题介绍 使用最小花费爬楼梯问题分析 Leetcode例题与思路[118. 杨辉三角](https://leetcode.cn/problems/pascals-triangle/)解题思路题解 [53. 最大子数组和](https://leetcode.cn/problems/maximum-subarray/)解题思路题解 [96. 不同的二叉搜索树](h…...
通信原理期末复习——计算大题(一)
个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…...
【萤火虫系列教程】2/5-Adobe Firefly 文字生成图像
文字生成图像 登录账号后,在主页点击文字生成图像的【生成】按钮,进入到文字生成图像 查看图像 在文字生成图像页面,可以看到别人生成的图像。 点击某个图像,就可以进入图像详情,可以看到文字描述。 生成图像 我…...
JDK 11:崭新特性解析
JDK 11:崭新特性解析 JDK 11:崭新特性解析1. HTTP Client(标准化)示例代码 2. 局部变量类型推断的扩展示例代码 3. 新的字符串方法示例代码 4. 动态类文件常量示例代码 5. Epsilon 垃圾收集器使用方式 结语 JDK 11:崭新…...
leetcode.在链表中插入最大公约数
文章目录 题目解题方法复杂度Code Problem: 2807. 在链表中插入最大公约数 题目 给你一个链表的头 head ,每个结点包含一个整数值。 在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。…...
云原生学习系列之基础环境准备(单节点安装kubernetes)
一、环境要求 操作系统CentOS 7.x-86_x64 硬件配置:内存2GB或2G,CPU 2核或CPU 2核,需要在虚拟机中提前设置好,不然后续会报错 二、系统初始化 1、设置主机名 # 在master节点执行 hostnamectl set-hostname master01 2、配置主…...
【数据结构】二叉树的概念及堆
前言 我们已经学过了顺序表、链表、栈和队列这些属于线性结构的数据结构,那么下面我们就要学习我们第一个非线性结构,非线性结构又有哪些值得我们使用的呢?那么接下来我们就将谈谈树的概念了。 1.树的概念与结构 1.1树的概念 树是一种非线性…...
美年大健康黄伟:从选型到迁移,一个月升级核心数据库
核心生产系统的数据库,从接到替换需求到完成分布式升级,需要多久?一个月,这是美年大健康的回答。一个月集中调配各种资源,美年大健康完成了应用程序基本零改造的平滑迁移,新数据库在成本更低的前提下&#…...
OpenHarmony应用构建工具Hvigor的构建流程
前言 OpenHarmony 应用和服务使用 Hvigor 作为工程的构建工具。本篇文章将介绍 Hvigor 的构建流程,通过修改脚本配置使 Hvigor 执行自定义任务。 Hvigor 的构建流程 加载命令行参数和环境变量;初始化项目结构,创建 Project 和 Module 实例…...
ChatGPT在金融财务领域的10种应用方法
1.生成报告 在金融领域中,最耗时的任务之一是报告生成。通过ChatGPT,您可以在一定程度上自动化这个过程。这款人工智能工具可以获取关于公司财务表现的结构化数据,并生成一份书面摘要,详细说明关键点、趋势和观察结果。这个功能在…...
全程云OA ajax.ashx SQL注入漏洞复现
0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能,超过100多个子模块。为企业内部提供高效、畅通的信息渠道,同时也能大力推动公司信息系统发展,提高企业的办公自动化程度和综合管理水平,加快企业信息的流通…...
VMware 安装 macOS虚拟机(附工具包)
VMware 安装 macOS虚拟机,在Windows上体验苹果macOS系统! 安装教程:VMware 安装 macOS虚拟机VMware Workstation Pro 是一款强大的虚拟机软件,可让您在 Windows 电脑上运行 macOS 系统。只需简单几步操作,即可轻松安装…...
Tomcat与Servlet是什么关系
Tomcat与Servlet是什么关系 Apache Tomcat和Servlet之间存在密切的关系,可以说它们是一对密切合作的组件。下面是它们的关系: Tomcat是Servlet容器: Tomcat是一个开源的、轻量级的Servlet容器。Servlet容器是一个Web服务器扩展,用…...
C++11_右值引用
文章目录 前言一、右值引用是什么?那么,什么又是右值?右值引用 二、使用步骤和意义1.1.11.2 2.右值引用的最大意义2.1 完美转发2.2 万能折叠 前言 C11 是2011年对C这门语言发布的新标准,并且此次标准引入了十分多的新特性&#x…...
C#使用条件语句判断用户登录身份
目录 一、示例 二、生成 利用条件语句判断用户登录身份,根据用户登录身份的不同,给予相应的操作权限。 一、示例 主要用if语句及ComboBox控件。其中,ComboBox是窗体中的下拉列表控件,在使用ComboBox控件前,可以先向…...
在VM下使用Composer完成快照方式的软件制作
Composer允许您构建软件、应用程序、偏好设置文件或是文档的安装包,安装包可以部署到远程电脑或是作为镜像流程的一部分。构建软件包的第一步就是创建包源,根据要打包的软件,Composer允许您监视软件的安装和使用驱动器上已存在的文件来创建包…...
YOLOv5改进 | Neck篇 | 利用Damo-YOLO的RepGFPN改进特征融合层
一、本文介绍 本文给大家带来的改进机制是Damo-YOLO的RepGFPN(重参数化泛化特征金字塔网络),利用其优化YOLOv5的Neck部分,可以在不影响计算量的同时大幅度涨点(亲测在小目标和大目标检测的数据集上效果均表现良好涨点幅度超级高!)。RepGFPN不同于以往提出的改进模块,其…...
设计模式——最全梳理,最好理解
新年献礼! 设计模式呕心梳理 创建型模式 单例模式(Singleton Pattern)https://blog.csdn.net/qq_34869143/article/details/134874044 整理中... 结构型模式 代理模式(Proxy Pattern)https://blog.csdn.net/qq_34…...
外包干了4个月,技术退步明显了...
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四…...
rust 注释文档生成 cargo doc
rust的cargo文档生成 只需要在每个函数写清楚注释,就可以自动生成文档,很方便 即不用写文档,又可以快速查看,是开发rust的必备技能 rust安装和开发环境配置,可以参考:链接 1.写注释的方法 连续三个 \ 即…...
大语言模型(LLM)框架及微调 (Fine Tuning)
大语言模型(LLM) 技术作为人工智能领域的一项重要创 新在今年引起了广泛的关注。 LLM 是利用深度学习和大数据训练的人工智能系统,专门 设计来理解、生成和回应自然语言。这些模型通过分析大量 的文本数据来学习语言的结构和用法,…...
速盾高防ip:专业防御ddos
速盾高防IP是速盾网络为企业提供的专业DDoS攻击防御解决方案之一。作为一种先进的网络安全服务,速盾高防IP致力于保护客户的网络资源免受分布式拒绝服务(DDoS)攻击的威胁。以下是速盾高防IP的一些关键特点和优势: 实时攻击监测&am…...
第5章-第8节-Java面向对象中的内部类
1、内部类:属于类的成员之一,类的内部又定义类,外层的class称为外部类,内部的class称为内部类。 设计了某个类,根据需求发现其内部又需要定义一个独立的内部结构,此时就考虑将其定义为内部类,内…...
首次引入大模型!Bert-vits2-Extra中文特化版40秒素材复刻巫师3叶奈法
Bert-vits2项目又更新了,更新了一个新的分支:中文特化,所谓中文特化,即针对中文音色的特殊优化版本,纯中文底模效果百尺竿头更进一步,同时首次引入了大模型,使用国产IDEA-CCNL/Erlangshen-Megat…...
从零学Java - 接口
Java 接口 文章目录 Java 接口1.接口的语法1.1 与抽象类的区别 2.如何使用接口?2.1 接口的使用规范 3.什么是接口?3.1 常见关系 4.接口的多态性5.面向接口编程5.1 接口回调 6.特殊接口6.1 常量接口6.2 标记接口 7.接口的好处 补充面向对象 七大设计原则 1.接口的语法 接口&a…...
网站推广软件哪个最实惠/怎么投放广告
分类 爬虫分为定向与不定向基本操作 简单来说就是通过指定的url取出数据发送http请求:基于正则表达式匹配获取内容用BeautifulSoup可以先用requests获取网页内容 之后用BeautifulSoup解析 BeautifulSoup(text,http.parser) 之后可以用find寻找对应项,get…...
学校网站建设的申请/南昌企业网站建设
基于SSMMavenBootStrapMySQL的在线商城系统[实战视频]—304人已学习 课程介绍 本课程基于MavenSpringSpringMVCMyBatisMySQLBootStrap技术,使用IntelliJ IDEA开发工具。 主要是锻炼SSM技术的运用,通过项目实战,加强对框架技术的理解和运用…...
网站系统建设合同/关键词挖掘长尾词
block_chain_tips 汇总BlockChain Bitcoin Ethereum 相关的技术原理的Tips https://github.com/heimashi/block_chain_tips Tip 1 - 区块链主要技术 - Hash Hash算法在区块链技术中被广泛应用,例如钱包的账户地址、哈希指针、工作量证明的挖坑Hash算法、交易的Merkl…...
企业做网站电话约见客户的对话/seo排名计费系统
ES除了实现前几课的基本查询,也可以实现类似关系型数据库的聚合查询,如平均值sum、最小值min、最大值max等等我们就用上一课的数据作为参考来举例聚合查询sum聚合sum是一个求累加值的聚合,其作用与关系型数据库中相同。GET /lib4/items/_sear…...
蚌埠集团网站建设/如何做好网络推广销售
传统贸易金融存在诸多痛点 目前贸易金融的处理流程主要包含销售、运输和交货,都记录在提单中。提单为发货者收到的凭证,证明 货物已经发出以及发货者在货物海运过程中对货物的所有权。一旦货物到达目的地,发货人会将提单原件发给收汇人&#…...
网站的按钮怎么做的/贴吧推广
如何在Linux文件系统里面找到非UTF-8编码的文件名的文件或者文件夹? - 乐维UP如何在Linux文件系统里面找到非UTF-8编码的文件名的文件或者文件夹?0孟庆磊,乐维程序员在Linux系统中,如Ubuntu,经常会发现一些文件的文件名…...